https://github.com/zeroomega created https://github.com/llvm/llvm-project/pull/208813
When LLVM is configured with BUILD_SHARED_LIBS=OFF , several subprojects still unconditionally define and build standalone shared/module library targets (when PIC is enabled): * LLVM: LTO(libLTO.so), Remarks (libRemarks.so), and LLVMgold. * Clang: libclang (libclang.so) and clang-cpp (libclang-cpp.so). * Polly: LLVMPolly (loadable pass plugin module). * MLIR: mlir-shlib (libMLIR.so) and shared execution engine/runtime runner libraries ( mlir_c_runner_utils , etc.). * OpenMP: omp (libomp.so, enabled by default via LIBOMP_ENABLE_SHARED). When the stage-2 host build generates export files (LLVMExports.cmake, ClangTargets.cmake , PollyConfig.cmake ), these shared targets are exported with add_library(<target> SHARED IMPORTED). During the child CMake configuration step for baremetal runtimes (where CMAKE_SYSTEM_NAME=Generic ), find_package(LLVM) loads LLVMExports.cmake . Under CMake 4+, calling add_library(... SHARED IMPORTED) on a target platform that lacks dynamic linking support triggers a fatal error. We introduced LLVM_OMIT_SHARED_TARGETS flag, if set to ON, all shared targets above will be disabled to make the build static only. >From 11b2accb76b2c7a4829fe87772482ceabd54f7fe Mon Sep 17 00:00:00 2001 From: Haowei Wu <[email protected]> Date: Fri, 10 Jul 2026 11:50:33 -0700 Subject: [PATCH] Add LLVM_OMIT_SHARED_TARGETS to omit building any shared targets When LLVM is configured with BUILD_SHARED_LIBS=OFF , several subprojects still unconditionally define and build standalone shared/module library targets (when PIC is enabled): * LLVM: LTO(libLTO.so), Remarks (libRemarks.so), and LLVMgold. * Clang: libclang (libclang.so) and clang-cpp (libclang-cpp.so). * Polly: LLVMPolly (loadable pass plugin module). * MLIR: mlir-shlib (libMLIR.so) and shared execution engine/runtime runner libraries ( mlir_c_runner_utils , etc.). * OpenMP: omp (libomp.so, enabled by default via LIBOMP_ENABLE_SHARED). When the stage-2 host build generates export files (LLVMExports.cmake, ClangTargets.cmake , PollyConfig.cmake ), these shared targets are exported with add_library(<target> SHARED IMPORTED). During the child CMake configuration step for baremetal runtimes (where CMAKE_SYSTEM_NAME=Generic ), find_package(LLVM) loads LLVMExports.cmake . Under CMake 4+, calling add_library(... SHARED IMPORTED) on a target platform that lacks dynamic linking support triggers a fatal error. We introduced LLVM_OMIT_SHARED_TARGETS flag, if set to ON, all shared targets above will be disabled to make the build static only. --- clang/cmake/caches/Fuchsia-stage2.cmake | 1 + clang/tools/CMakeLists.txt | 4 ++-- clang/tools/libclang/CMakeLists.txt | 4 ++-- llvm/CMakeLists.txt | 7 +++++++ llvm/tools/CMakeLists.txt | 9 +++++++-- llvm/tools/lto/CMakeLists.txt | 2 +- llvm/tools/remarks-shlib/CMakeLists.txt | 2 +- mlir/lib/ExecutionEngine/CMakeLists.txt | 4 ++-- mlir/tools/mlir-shlib/CMakeLists.txt | 2 +- openmp/runtime/CMakeLists.txt | 2 +- polly/cmake/CMakeLists.txt | 2 +- polly/lib/CMakeLists.txt | 2 +- 12 files changed, 27 insertions(+), 14 deletions(-) diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake index 401258e9ae70e..3f46def846a4a 100644 --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -17,6 +17,7 @@ set(LLVM_ENABLE_LIBCXX ON CACHE BOOL "") set(LLVM_ENABLE_LIBEDIT OFF CACHE BOOL "") set(LLVM_ENABLE_LLD ON CACHE BOOL "") set(LLVM_ENABLE_LTO ON CACHE BOOL "") +set(LLVM_OMIT_SHARED_TARGETS ON CACHE BOOL "") set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "") set(LLVM_ENABLE_PLUGINS OFF CACHE BOOL "") set(LLVM_ENABLE_UNWIND_TABLES OFF CACHE BOOL "") diff --git a/clang/tools/CMakeLists.txt b/clang/tools/CMakeLists.txt index a16089be041bf..a7cd5ae7a7ca3 100644 --- a/clang/tools/CMakeLists.txt +++ b/clang/tools/CMakeLists.txt @@ -32,8 +32,8 @@ endif() add_clang_subdirectory(clang-refactor) # For MinGW/Cygwin we only enable shared library if LLVM_LINK_LLVM_DYLIB=ON. # Without that option resulting library is too close to 2^16 DLL exports limit. -if((UNIX AND NOT CYGWIN) OR (MSVC AND LLVM_BUILD_LLVM_DYLIB_VIS) OR - ((MINGW OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB)) +if(((UNIX AND NOT CYGWIN) OR (MSVC AND LLVM_BUILD_LLVM_DYLIB_VIS) OR + ((MINGW OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB)) AND NOT LLVM_OMIT_SHARED_TARGETS) add_clang_subdirectory(clang-shlib) endif() diff --git a/clang/tools/libclang/CMakeLists.txt b/clang/tools/libclang/CMakeLists.txt index 38f577499dd22..47903f96974a1 100644 --- a/clang/tools/libclang/CMakeLists.txt +++ b/clang/tools/libclang/CMakeLists.txt @@ -109,11 +109,11 @@ if (LLVM_EXPORTED_SYMBOL_FILE) DEPENDS ${LIBCLANG_VERSION_SCRIPT_FILE}) endif() -if(LLVM_ENABLE_PIC OR ((WIN32 OR CYGWIN) AND NOT LIBCLANG_BUILD_STATIC)) +if((LLVM_ENABLE_PIC OR ((WIN32 OR CYGWIN) AND NOT LIBCLANG_BUILD_STATIC)) AND NOT LLVM_OMIT_SHARED_TARGETS) set(ENABLE_SHARED SHARED) endif() -if(NOT LLVM_ENABLE_PIC OR LIBCLANG_BUILD_STATIC) +if(NOT LLVM_ENABLE_PIC OR LIBCLANG_BUILD_STATIC OR LLVM_OMIT_SHARED_TARGETS) set(ENABLE_STATIC STATIC) endif() diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 7b8f1b3b3ced9..77a54ba9d3089 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -1017,6 +1017,13 @@ if (CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE MATCHES "^(RELWITHDEBINFO|DE set(LLVM_OMIT_DAGISEL_COMMENTS OFF) endif() +option(LLVM_OMIT_SHARED_TARGETS "Do not build targets that can only be built as shared libraries" OFF) +if(LLVM_OMIT_SHARED_TARGETS) + set(BUILD_SHARED_LIBS OFF) + set(LLVM_BUILD_LLVM_DYLIB OFF) + set(LLVM_BUILD_LLVM_C_DYLIB OFF) +endif() + if (MSVC_IDE) option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE) endif() diff --git a/llvm/tools/CMakeLists.txt b/llvm/tools/CMakeLists.txt index a579bdf0f6fb6..e685bf880ed95 100644 --- a/llvm/tools/CMakeLists.txt +++ b/llvm/tools/CMakeLists.txt @@ -9,7 +9,7 @@ # traversing each directory. create_llvm_tool_options() -if(NOT LLVM_BUILD_LLVM_DYLIB AND NOT LLVM_BUILD_LLVM_C_DYLIB) +if(NOT LLVM_BUILD_LLVM_DYLIB AND NOT LLVM_BUILD_LLVM_C_DYLIB OR LLVM_OMIT_SHARED_TARGETS) set(LLVM_TOOL_LLVM_SHLIB_BUILD Off) endif() @@ -17,8 +17,13 @@ if(NOT LLVM_USE_INTEL_JITEVENTS ) set(LLVM_TOOL_LLVM_JITLISTENER_BUILD Off) endif() -if(CYGWIN OR NOT LLVM_ENABLE_PIC) +if(CYGWIN OR NOT LLVM_ENABLE_PIC OR LLVM_OMIT_SHARED_TARGETS) set(LLVM_TOOL_LTO_BUILD Off) + set(LLVM_TOOL_GOLD_BUILD Off) +endif() + +if(LLVM_OMIT_SHARED_TARGETS) + set(LLVM_TOOL_REMARKS_SHLIB_BUILD Off) endif() if (LLVM_TOOL_LLVM_DRIVER_BUILD) diff --git a/llvm/tools/lto/CMakeLists.txt b/llvm/tools/lto/CMakeLists.txt index 5d13bf5e1e80d..b0a91e37a90a8 100644 --- a/llvm/tools/lto/CMakeLists.txt +++ b/llvm/tools/lto/CMakeLists.txt @@ -1,5 +1,5 @@ # Building shared libraries requires PIC objects. -if(LLVM_ENABLE_PIC) +if(LLVM_ENABLE_PIC AND NOT LLVM_OMIT_SHARED_TARGETS) set(LLVM_LINK_COMPONENTS AllTargetsAsmParsers diff --git a/llvm/tools/remarks-shlib/CMakeLists.txt b/llvm/tools/remarks-shlib/CMakeLists.txt index 1b14827e68cd3..492dbdae5d6fd 100644 --- a/llvm/tools/remarks-shlib/CMakeLists.txt +++ b/llvm/tools/remarks-shlib/CMakeLists.txt @@ -1,5 +1,5 @@ # Building shared libraries requires PIC objects. -if(LLVM_ENABLE_PIC) +if(LLVM_ENABLE_PIC AND NOT LLVM_OMIT_SHARED_TARGETS) set(LLVM_LINK_COMPONENTS Remarks diff --git a/mlir/lib/ExecutionEngine/CMakeLists.txt b/mlir/lib/ExecutionEngine/CMakeLists.txt index 87af4724f159a..26cf898165475 100644 --- a/mlir/lib/ExecutionEngine/CMakeLists.txt +++ b/mlir/lib/ExecutionEngine/CMakeLists.txt @@ -104,7 +104,7 @@ mlir_target_link_libraries(MLIRExecutionEngine PUBLIC MLIRTargetLLVMIRExport ) -if(LLVM_BUILD_LLVM_DYLIB AND NOT (WIN32 OR MINGW OR CYGWIN)) # Does not build on windows currently, see #106859 +if(LLVM_BUILD_LLVM_DYLIB AND NOT (WIN32 OR MINGW OR CYGWIN) AND NOT LLVM_OMIT_SHARED_TARGETS) # Does not build on windows currently, see #106859 # Build a shared library for the execution engine. Some downstream projects # use this library to build their own CPU runners while preserving dynamic # linkage. @@ -158,7 +158,7 @@ mlir_target_link_libraries(MLIRJitRunner PUBLIC # When -fPIC is not provided, shared libraries cannot be built if it links against # non-PIC code. -if(LLVM_ENABLE_PIC) +if(LLVM_ENABLE_PIC AND NOT LLVM_OMIT_SHARED_TARGETS) add_mlir_library(mlir_float16_utils SHARED Float16bits.cpp diff --git a/mlir/tools/mlir-shlib/CMakeLists.txt b/mlir/tools/mlir-shlib/CMakeLists.txt index a33c70c5807be..42ecc80069872 100644 --- a/mlir/tools/mlir-shlib/CMakeLists.txt +++ b/mlir/tools/mlir-shlib/CMakeLists.txt @@ -1,5 +1,5 @@ # Building libmlir-cpp.so fails if LLVM_ENABLE_PIC=Off -if (NOT LLVM_ENABLE_PIC) +if (NOT LLVM_ENABLE_PIC OR LLVM_OMIT_SHARED_TARGETS) return() endif() diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt index c0f5b5a4b1596..9ce480eb8297b 100644 --- a/openmp/runtime/CMakeLists.txt +++ b/openmp/runtime/CMakeLists.txt @@ -336,7 +336,7 @@ set(LIBOMP_USE_CANCEL_THREADS "${LIBOMP_HAVE_PTHREAD_CANCEL}" CACHE BOOL set(LIBOMP_ENABLE_SHARED TRUE CACHE BOOL "Shared library instead of static library?") -if(WASM) +if(WASM OR LLVM_OMIT_SHARED_TARGETS) libomp_warning_say("The WebAssembly build currently only supports static libraries; forcing LIBOMP_ENABLE_SHARED to false") set(LIBOMP_ENABLE_SHARED FALSE) endif() diff --git a/polly/cmake/CMakeLists.txt b/polly/cmake/CMakeLists.txt index cd1f5db842d93..161c894c0f9df 100644 --- a/polly/cmake/CMakeLists.txt +++ b/polly/cmake/CMakeLists.txt @@ -23,7 +23,7 @@ else() endif() set(POLLY_CONFIG_EXPORTED_TARGETS Polly ${ISL_TARGET}) -if (NOT (WIN32 OR CYGWIN) AND LLVM_ENABLE_PIC) +if (NOT (WIN32 OR CYGWIN) AND LLVM_ENABLE_PIC AND NOT LLVM_OMIT_SHARED_TARGETS) # LLVMPolly is a dummy target on Win or if PIC code is disabled. list(APPEND POLLY_CONFIG_EXPORTED_TARGETS LLVMPolly) endif() diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt index 6f6e4d5782dfb..9d33af774a784 100644 --- a/polly/lib/CMakeLists.txt +++ b/polly/lib/CMakeLists.txt @@ -120,7 +120,7 @@ target_link_libraries(Polly PUBLIC # Create a loadable module Polly.so that can be loaded using # LLVM's/clang's "-load" option. -if (WIN32 OR CYGWIN OR NOT LLVM_ENABLE_PIC) +if (WIN32 OR CYGWIN OR NOT LLVM_ENABLE_PIC OR LLVM_OMIT_SHARED_TARGETS) # Add dummy target, either because loadable modules are not supported # as on Windows or because PIC code has been disabled add_custom_target(LLVMPolly) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
