diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 2242b0ec60a..014b4a2caf1 100644 --- a/lib/Support/CMakeLists.txt +++ b/lib/Support/CMakeLists.txt @@ -1,5 +1,26 @@ include(GetLibraryName) +# Ensure that libSupport does not carry any static global initializer. +# libSupport can be embedded in use cases where we don't want to load all +# cl::opt unless we want to parse the command line. +# ManagedStatic can be used to enable lazy-initialization of globals. +# We don't use `add_flag_if_supported` as instead of compiling an empty file we +# check if the current platform is able to compile global std::mutex with this +# flag (Linux can, Darwin can't for example). +check_cxx_compiler_flag("-Werror=global-constructors" HAS_WERROR_GLOBAL_CTORS) +if (HAS_WERROR_GLOBAL_CTORS) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=global-constructors") + CHECK_CXX_SOURCE_COMPILES(" + #include + static std::mutex TestGlobalCtorDtor; + static std::recursive_mutex TestGlobalCtorDtor2; + int main() { (void)TestGlobalCtorDtor; (void)TestGlobalCtorDtor2; return 0;} + " LLVM_HAS_NOGLOBAL_CTOR_MUTEX) + if (NOT LLVM_HAS_NOGLOBAL_CTOR_MUTEX) + string(REPLACE "-Werror=global-constructors" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + endif() +endif() + if(LLVM_ENABLE_ZLIB) set(imported_libs ZLIB::ZLIB) endif()