1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 10:32:48 +02:00

Build libSupport with -Werror=global-constructors (NFC)

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.

The -Werror=global-constructors is only added on platform that have
support for the flag and for which std::mutex does not have a global
destructor. This is ensured by having CMake trying to compile a file
with a global mutex before adding the flag to libSupport.
This commit is contained in:
Mehdi Amini 2021-07-16 03:32:59 +00:00
parent eb0ba2928d
commit 60670bde11

View File

@ -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 <mutex>
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()