Mercurial > hg > CbC > CbC_llvm
diff libcxx/CMakeLists.txt @ 252:1f2b6ac9f198 llvm-original
LLVM16-1
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Aug 2023 09:04:13 +0900 |
parents | c4bab56944e8 |
children |
line wrap: on
line diff
--- a/libcxx/CMakeLists.txt Wed Nov 09 17:47:54 2022 +0900 +++ b/libcxx/CMakeLists.txt Fri Aug 18 09:04:13 2023 +0900 @@ -4,7 +4,7 @@ #=============================================================================== # Setup Project #=============================================================================== -cmake_minimum_required(VERSION 3.13.4) +cmake_minimum_required(VERSION 3.20.0) set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake") @@ -12,6 +12,7 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" + "${CMAKE_CURRENT_SOURCE_DIR}/../runtimes/cmake/Modules" "${LLVM_COMMON_CMAKE_UTILS}" "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) @@ -23,6 +24,7 @@ set(LIBCXX_BINARY_INCLUDE_DIR "${LIBCXX_BINARY_DIR}/include/c++build") include(GNUInstallDirs) +include(WarningFlags) # Require out of source build. include(MacroEnsureOutOfSourceBuild) @@ -36,10 +38,7 @@ endif() if (MSVC) - set(LIBCXX_TARGETING_MSVC ON) message(STATUS "Configuring for MSVC") -else() - set(LIBCXX_TARGETING_MSVC OFF) endif() #=============================================================================== @@ -49,29 +48,23 @@ include(HandleCompilerRT) # Basic options --------------------------------------------------------------- -option(LIBCXX_ENABLE_ASSERTIONS - "Enable assertions inside the compiled library, and at the same time make it the - default when compiling user code. Note that assertions can be enabled or disabled - by users in their own code regardless of this option." OFF) option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON) option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON) -set(ENABLE_FILESYSTEM_DEFAULT ON) -if (WIN32 AND NOT MINGW) - # Filesystem is buildable for windows, but it requires __int128 helper - # functions, that currently are provided by libgcc or compiler_rt builtins. - # These are available in MinGW environments, but not currently in MSVC - # environments. - set(ENABLE_FILESYSTEM_DEFAULT OFF) +option(LIBCXX_ENABLE_FILESYSTEM + "Whether to include support for parts of the library that rely on a filesystem being + available on the platform. This includes things like most parts of <filesystem> and + others like <fstream>" ON) +option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS}) +set(LIBCXX_SUPPORTED_HARDENING_MODES unchecked hardened debug) +set(LIBCXX_HARDENING_MODE "unchecked" CACHE STRING + "Specify the default hardening mode to use. This mode will be used inside the + compiled library and will be the default when compiling user code. Note that + users can override this setting in their own code. This does not affect the + ABI. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.") +if (NOT "${LIBCXX_HARDENING_MODE}" IN_LIST LIBCXX_SUPPORTED_HARDENING_MODES) + message(FATAL_ERROR + "Unsupported hardening mode: '${LIBCXX_HARDENING_MODE}'. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.") endif() -option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of the main libc++ library" - ${ENABLE_FILESYSTEM_DEFAULT}) -option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS}) -option(LIBCXX_ENABLE_PARALLEL_ALGORITHMS "Enable the parallel algorithms library. This requires the PSTL to be available." OFF) -option(LIBCXX_ENABLE_DEBUG_MODE - "Whether to build libc++ with the debug mode enabled. - By default, this is turned off. Turning it on results in a different ABI (additional - symbols but also potentially different layouts of types), and one should not mix code - built against a dylib that has debug mode and code built against a regular dylib." OFF) option(LIBCXX_ENABLE_RANDOM_DEVICE "Whether to include support for std::random_device in the library. Disabling this can be useful when building the library for platforms that don't have @@ -101,6 +94,13 @@ to provide compile-time errors when using features unavailable on some version of the shared library they shipped should turn this on and see `include/__availability` for more details." OFF) +option(LIBCXX_ENABLE_CLANG_TIDY "Whether to compile and run clang-tidy checks" OFF) +# TODO MODULES Remove this option and test for the requirements (CMake/Clang) instead. +option(LIBCXX_ENABLE_STD_MODULES + "Whether to enable the building the C++23 `std` module. This feature is + experimental and has additional dependencies. Only enable this when + interested in testing or developing this module. See + https://libcxx.llvm.org/Modules.html for more information." OFF) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-gcc.cfg.in") @@ -200,15 +200,8 @@ option(LIBCXX_EXTRA_SITE_DEFINES "Extra defines to add into __config_site") option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF) -option(LIBCXX_ENABLE_BACKWARDS_COMPATIBILITY_DEBUG_MODE_SYMBOLS - "Whether to include the old Debug mode symbols in the compiled library. This - is provided for backwards compatibility since the compiled library used to - always contain those symbols, regardless of whether the library was built - with the debug mode enabled. This is OFF by default, please contact the libc++ - developers if you need to turn this on, as this will be removed in LLVM 16." OFF) - # ABI Library options --------------------------------------------------------- -if (LIBCXX_TARGETING_MSVC) +if (MSVC) set(LIBCXX_DEFAULT_ABI_LIBRARY "vcruntime") elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxrt") @@ -266,11 +259,6 @@ message(FATAL_ERROR "LIBCXX_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.") endif() -# TODO: Remove this after branching for LLVM 15 -if(LIBCXX_SYSROOT OR LIBCXX_TARGET_TRIPLE OR LIBCXX_GCC_TOOLCHAIN) - message(WARNING "LIBCXX_SYSROOT, LIBCXX_TARGET_TRIPLE and LIBCXX_GCC_TOOLCHAIN are not supported anymore, please use the native CMake equivalents instead") -endif() - # Feature options ------------------------------------------------------------- option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON) option(LIBCXX_ENABLE_RTTI "Use run time type information." ON) @@ -284,9 +272,12 @@ option(LIBCXX_HAS_EXTERNAL_THREAD_API "Build libc++ with an externalized threading API. This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF) -option(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY - "Build libc++ with an externalized threading library. - This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON" OFF) + +if (LIBCXX_ENABLE_THREADS) + set(LIBCXX_PSTL_CPU_BACKEND "std_thread" CACHE STRING "Which PSTL CPU backend to use") +else() + set(LIBCXX_PSTL_CPU_BACKEND "serial" CACHE STRING "Which PSTL CPU backend to use") +endif() # Misc options ---------------------------------------------------------------- # FIXME: Turn -pedantic back ON. It is currently off because it warns @@ -333,10 +324,6 @@ message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON" " when LIBCXX_ENABLE_THREADS is also set to ON.") endif() - if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) - message(FATAL_ERROR "LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY can only be set " - "to ON when LIBCXX_ENABLE_THREADS is also set to ON.") - endif() if (LIBCXX_HAS_WIN32_THREAD_API) message(FATAL_ERROR "LIBCXX_HAS_WIN32_THREAD_API can only be set to ON" " when LIBCXX_ENABLE_THREADS is also set to ON.") @@ -345,11 +332,6 @@ endif() if (LIBCXX_HAS_EXTERNAL_THREAD_API) - if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) - message(FATAL_ERROR "The options LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY and " - "LIBCXX_HAS_EXTERNAL_THREAD_API cannot both be ON at " - "the same time") - endif() if (LIBCXX_HAS_PTHREAD_API) message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API" "and LIBCXX_HAS_PTHREAD_API cannot be both" @@ -395,6 +377,11 @@ message(FATAL_ERROR "Only one of LIBCXX_ABI_FORCE_ITANIUM and LIBCXX_ABI_FORCE_MICROSOFT can be specified.") endif () +if (LIBCXX_ENABLE_SHARED AND CMAKE_MSVC_RUNTIME_LIBRARY AND + (NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")) + message(WARNING "A static CRT linked into a shared libc++ doesn't work correctly.") +endif() + #=============================================================================== # Configure System #=============================================================================== @@ -413,6 +400,7 @@ if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1") + set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1") set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1") set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH "Path where built libc++ libraries should be installed.") @@ -426,9 +414,11 @@ if(LLVM_LIBRARY_OUTPUT_INTDIR) set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1") + set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1") else() set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX}) set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1") + set(LIBCXX_GENERATED_MODULE_DIR "${CMAKE_BINARY_DIR}/modules/c++/v1") endif() set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}") set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE PATH @@ -466,7 +456,7 @@ # 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS' if (${CMAKE_SYSTEM_NAME} MATCHES "AIX") - add_target_flags_if_supported("-mdefault-visibility-export-mapping=explicit") + add_flags_if_supported("-mdefault-visibility-export-mapping=explicit") set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF) endif() @@ -479,30 +469,12 @@ set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE) endif() -string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) -if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") - set(LIBCXX_DEBUG_BUILD ON) -else() - set(LIBCXX_DEBUG_BUILD OFF) -endif() - #=============================================================================== # Setup Compiler Flags #=============================================================================== include(HandleLibCXXABI) # Setup the ABI library flags -# Remove flags that may have snuck in. -# TODO: This shouldn't be necessary anymore since we don't support the Project -# build anymore, so the rest of LLVM can't pollute our flags. -remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG -lc++abi) -remove_flags(--stdlib=libc++ -stdlib=libc++ --stdlib=libstdc++ -stdlib=libstdc++) - -# FIXME: Remove all debug flags and flags that change which Windows -# default libraries are linked. Currently we only support linking the -# non-debug DLLs -remove_flags("/D_DEBUG" "/MTd" "/MDd" "/MT" "/Md") - # FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC. # Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors # so they don't get transformed into -Wno and -errors respectively. @@ -546,18 +518,14 @@ target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden) endif() - if (LIBCXX_CONFIGURE_IDE) - # This simply allows IDE to process <experimental/coroutine> - target_add_compile_flags_if_supported(${target} PRIVATE -fcoroutines-ts) - endif() - # Let the library headers know they are currently being used to build the # library. target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY) - if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) - target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS) - endif() + # Make sure the library can be build without transitive includes. This makes + # it easier to upgrade the library to a newer language standard without build + # errors. + target_compile_definitions(${target} PRIVATE -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) if (C_SUPPORTS_COMMENT_LIB_PRAGMA) if (LIBCXX_HAS_PTHREAD_LIB) @@ -570,65 +538,6 @@ target_compile_options(${target} PUBLIC "${LIBCXX_ADDITIONAL_COMPILE_FLAGS}") endfunction() -# Warning flags =============================================================== -function(cxx_add_warning_flags target) - target_compile_definitions(${target} PUBLIC -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) - if (MSVC) - # -W4 is the cl.exe/clang-cl equivalent of -Wall. (In cl.exe and clang-cl, - # -Wall is equivalent to -Weverything in GCC style compiler drivers.) - target_add_compile_flags_if_supported(${target} PRIVATE -W4) - else() - target_add_compile_flags_if_supported(${target} PRIVATE -Wall) - endif() - target_add_compile_flags_if_supported(${target} PRIVATE -Wextra -W -Wwrite-strings - -Wno-unused-parameter -Wno-long-long - -Werror=return-type -Wextra-semi -Wundef - -Wformat-nonliteral) - if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - target_add_compile_flags_if_supported(${target} PRIVATE - -Wno-user-defined-literals - -Wno-covered-switch-default - -Wno-suggest-override - ) - if (LIBCXX_TARGETING_CLANG_CL) - target_add_compile_flags_if_supported(${target} PRIVATE - -Wno-c++98-compat - -Wno-c++98-compat-pedantic - -Wno-c++11-compat - -Wno-undef - -Wno-reserved-id-macro - -Wno-gnu-include-next - -Wno-gcc-compat # For ignoring "'diagnose_if' is a clang extension" warnings - -Wno-zero-as-null-pointer-constant # FIXME: Remove this and fix all occurrences. - -Wno-deprecated-dynamic-exception-spec # For auto_ptr - -Wno-sign-conversion - -Wno-old-style-cast - -Wno-deprecated # FIXME: Remove this and fix all occurrences. - -Wno-shift-sign-overflow # FIXME: Why do we need this with clang-cl but not clang? - -Wno-double-promotion # FIXME: remove me - ) - endif() - elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - target_add_compile_flags_if_supported(${target} PRIVATE - -Wno-attributes - -Wno-literal-suffix - -Wno-c++14-compat - -Wno-noexcept-type - -Wno-suggest-override) - endif() - if (LIBCXX_ENABLE_WERROR) - target_add_compile_flags_if_supported(${target} PRIVATE -Werror) - target_add_compile_flags_if_supported(${target} PRIVATE -WX) - else() - # TODO(EricWF) Remove this. We shouldn't be suppressing errors when -Werror is - # added elsewhere. - target_add_compile_flags_if_supported(${target} PRIVATE -Wno-error) - endif() - if (LIBCXX_ENABLE_PEDANTIC) - target_add_compile_flags_if_supported(${target} PRIVATE -pedantic) - endif() -endfunction() - # Exception flags ============================================================= function(cxx_add_exception_flags target) if (LIBCXX_ENABLE_EXCEPTIONS) @@ -644,29 +553,14 @@ # RTTI flags ================================================================== function(cxx_add_rtti_flags target) if (NOT LIBCXX_ENABLE_RTTI) - target_add_compile_flags_if_supported(${target} PUBLIC -GR-) - target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti) + if (MSVC) + target_add_compile_flags_if_supported(${target} PUBLIC -GR-) + else() + target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti) + endif() endif() endfunction() -# Threading flags ============================================================= -if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXX_ENABLE_SHARED) - # Need to allow unresolved symbols if this is to work with shared library builds - if (APPLE) - add_link_flags("-undefined dynamic_lookup") - else() - # Relax this restriction from HandleLLVMOptions - string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") - endif() -endif() - -# Assertion flags ============================================================= -define_if(LIBCXX_DEBUG_BUILD -D_DEBUG) -if (LIBCXX_ENABLE_ASSERTIONS AND NOT LIBCXX_DEBUG_BUILD) - # MSVC doesn't like _DEBUG on release builds. See PR 4379. - define_if_not(LIBCXX_TARGETING_MSVC -D_DEBUG) -endif() - # Modules flags =============================================================== # FIXME The libc++ sources are fundamentally non-modular. They need special # versions of the headers in order to provide C++03 and legacy ABI definitions. @@ -679,6 +573,8 @@ endif() endfunction() +string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) + # Sanitizer flags ============================================================= function(get_sanitizer_flags OUT_VAR USE_SANITIZER) @@ -785,17 +681,24 @@ target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}") endif() - if (LIBCXX_TARGETING_MSVC) - if (LIBCXX_DEBUG_BUILD) + if (MSVC) + if ((NOT CMAKE_MSVC_RUNTIME_LIBRARY AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") + OR (CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug")) set(LIB_SUFFIX "d") else() set(LIB_SUFFIX "") endif() - target_link_libraries(${target} PRIVATE ucrt${LIB_SUFFIX}) # Universal C runtime - target_link_libraries(${target} PRIVATE vcruntime${LIB_SUFFIX}) # C++ runtime - target_link_libraries(${target} PRIVATE msvcrt${LIB_SUFFIX}) # C runtime startup files - target_link_libraries(${target} PRIVATE msvcprt${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals. + if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$") + set(CRT_LIB "msvcrt") + set(CXX_LIB "msvcprt") + else() + set(CRT_LIB "libcmt") + set(CXX_LIB "libcpmt") + endif() + + target_link_libraries(${target} PRIVATE ${CRT_LIB}${LIB_SUFFIX}) # C runtime startup files + target_link_libraries(${target} PRIVATE ${CXX_LIB}${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals. # Required for standards-complaint wide character formatting functions # (e.g. `printfw`/`scanfw`) target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers) @@ -829,14 +732,6 @@ # Use the ISO conforming behaviour for conversion # in printf, scanf. _CRT_STDIO_ISO_WIDE_SPECIFIERS) - # Clang-cl shared builds don't support the experimental library. - # To avoid linker errors the format_error destructor is inlined for the - # dylib. Users can never use format in this mode. - # TODO FMT Remove when format becomes mainline. - if (LIBCXX_ENABLE_SHARED) - target_compile_definitions(${target} PRIVATE - _LIBCPP_INLINE_FORMAT_ERROR_DTOR) - endif() endif() endfunction() @@ -853,21 +748,39 @@ config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD) config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL) config_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32) -config_define_if(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC) config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME) -config_define_if(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_PARALLEL_ALGORITHMS) -config_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) +config_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM) config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE) config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION) config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE) config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS) config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) -config_define_if(LIBCXX_ENABLE_DEBUG_MODE _LIBCPP_ENABLE_DEBUG_MODE) +if (LIBCXX_HARDENING_MODE STREQUAL "hardened") + config_define(1 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT) + config_define(0 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT) +elseif (LIBCXX_HARDENING_MODE STREQUAL "debug") + config_define(0 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT) + config_define(1 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT) +elseif (LIBCXX_HARDENING_MODE STREQUAL "unchecked") + config_define(0 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT) + config_define(0 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT) +endif() +# TODO(LLVM 18): Remove this after branching for LLVM 17, this is a simple +# courtesy for vendors to be notified about this change. if (LIBCXX_ENABLE_ASSERTIONS) - config_define(1 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT) + message(FATAL_ERROR "LIBCXX_ENABLE_ASSERTIONS has been replaced by LIBCXX_HARDENING_MODE=hardened") +endif() + +if (LIBCXX_PSTL_CPU_BACKEND STREQUAL "serial") + config_define(1 _LIBCPP_PSTL_CPU_BACKEND_SERIAL) +elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "std_thread") + config_define(1 _LIBCPP_PSTL_CPU_BACKEND_THREAD) +elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "libdispatch") + config_define(1 _LIBCPP_PSTL_CPU_BACKEND_LIBDISPATCH) else() - config_define(0 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT) + message(FATAL_ERROR "LIBCXX_PSTL_CPU_BACKEND is set to ${LIBCXX_PSTL_CPU_BACKEND}, which is not a valid backend. + Valid backends are: serial, std_thread and libdispatch") endif() if (LIBCXX_ABI_DEFINES) @@ -910,7 +823,7 @@ # Setup all common build flags ================================================= function(cxx_add_common_build_flags target) cxx_add_basic_build_flags(${target}) - cxx_add_warning_flags(${target}) + cxx_add_warning_flags(${target} ${LIBCXX_ENABLE_WERROR} ${LIBCXX_ENABLE_PEDANTIC}) cxx_add_windows_flags(${target}) cxx_add_exception_flags(${target}) cxx_add_rtti_flags(${target}) @@ -924,11 +837,18 @@ add_subdirectory(include) add_subdirectory(src) add_subdirectory(utils) +if (LIBCXX_ENABLE_STD_MODULES) + add_subdirectory(modules) +endif() set(LIBCXX_TEST_DEPS "cxx_experimental") -if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) - list(APPEND LIBCXX_TEST_DEPS cxx_external_threads) +if (LIBCXX_ENABLE_CLANG_TIDY) + list(APPEND LIBCXX_TEST_DEPS cxx-tidy) +endif() + +if (LIBCXX_ENABLE_STD_MODULES) + list(APPEND LIBCXX_TEST_DEPS generate-cxx-modules generate-test-module-std) endif() if (LIBCXX_INCLUDE_BENCHMARKS)