[Openmp-commits] [clang] [llvm] [mlir] [openmp] [polly] Add LLVM_OMIT_SHARED_TARGETS to omit building any shared targets (PR #208813)

via Openmp-commits openmp-commits at lists.llvm.org
Fri Jul 10 12:00:22 PDT 2026


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 <haowei at google.com>
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)



More information about the Openmp-commits mailing list