[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