diff --git a/clang/cmake/modules/ClangConfig.cmake.in b/clang/cmake/modules/ClangConfig.cmake.in index 68f723d05011..f72a7d49602d 100644 --- a/clang/cmake/modules/ClangConfig.cmake.in +++ b/clang/cmake/modules/ClangConfig.cmake.in @@ -12,8 +12,11 @@ set(CLANG_INCLUDE_DIRS "@CLANG_CONFIG_INCLUDE_DIRS@") set(CLANG_LINK_CLANG_DYLIB "@CLANG_LINK_CLANG_DYLIB@") set(CLANG_DEFAULT_LINKER "@CLANG_DEFAULT_LINKER@") -# Provide all our library targets to users. -@CLANG_CONFIG_INCLUDE_EXPORTS@ +# Provide all our library targets to users. Skip when +# LLVM_OMIT_EXPORTS_FROM_CONFIG flag is set. +if(NOT LLVM_OMIT_EXPORTS_FROM_CONFIG) + @CLANG_CONFIG_INCLUDE_EXPORTS@ +endif() # By creating clang-tablegen-targets here, subprojects that depend on Clang's # tablegen-generated headers can always depend on this target whether building diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake index e4e3cfb9a2d9..c8ccf845992e 100644 --- a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake +++ b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake @@ -313,6 +313,15 @@ macro(load_llvm_config) "You are not using the monorepo layout. This configuration is DEPRECATED.") endif() + # Exports from LLVM and Clang may contain shared libraries. When targeting + # platforms that lack shared library support, importing such + # exports unrestrictedly will trigger an error. Set + # LLVM_OMIT_EXPORTS_FROM_CONFIG flag to skip importing these exports + # when the target platform does not support shared libraries. + get_property(HAS_SHARED_SUPPORT GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS) + if (NOT HAS_SHARED_SUPPORT) + set(LLVM_OMIT_EXPORTS_FROM_CONFIG ON) + endif() find_package(LLVM HINTS "${LLVM_CMAKE_DIR}") if (NOT LLVM_FOUND) message(WARNING "UNSUPPORTED COMPILER-RT CONFIGURATION DETECTED: " diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in index 300c25e7c610..6f5fcc6a926f 100644 --- a/llvm/cmake/modules/LLVMConfig.cmake.in +++ b/llvm/cmake/modules/LLVMConfig.cmake.in @@ -152,7 +152,7 @@ set(LLVM_ENABLE_SHARED_LIBS @BUILD_SHARED_LIBS@) set(LLVM_DEFAULT_EXTERNAL_LIT "@LLVM_CONFIG_DEFAULT_EXTERNAL_LIT@") set(LLVM_LIT_ARGS "@LLVM_LIT_ARGS@") -if(NOT TARGET LLVMSupport) +if(NOT TARGET LLVMSupport AND NOT LLVM_OMIT_EXPORTS_FROM_CONFIG) @LLVM_CONFIG_INCLUDE_EXPORTS@ @llvm_config_include_buildtree_only_exports@ endif() diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt index 67ed49a7dcab..61cf25af2287 100644 --- a/runtimes/CMakeLists.txt +++ b/runtimes/CMakeLists.txt @@ -76,6 +76,16 @@ if(LLVM_BINARY_DIR) list(APPEND llvm_search_paths "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm") list(APPEND clang_search_paths "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/clang") endif() + +# Exports from LLVM and Clang may contain shared libraries. When targeting +# platforms that lack shared library support, importing such +# exports unrestrictedly will trigger an error. Set +# LLVM_OMIT_EXPORTS_FROM_CONFIG flag to skip importing these exports +# when the target platform does not support shared libraries. +get_property(HAS_SHARED_SUPPORT GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS) +if (NOT HAS_SHARED_SUPPORT) + set(LLVM_OMIT_EXPORTS_FROM_CONFIG ON) +endif() find_package(LLVM PATHS ${llvm_search_paths} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) find_package(Clang PATHS ${clang_search_paths} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)