diff options
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/CMakeLists.txt | 111 | ||||
-rw-r--r-- | libcxx/src/CMakeLists.txt | 33 |
2 files changed, 77 insertions, 67 deletions
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index 51ef0492551..54265633ff9 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -522,50 +522,60 @@ remove_flags("/D_DEBUG" "/MTd" "/MDd" "/MT" "/Md") remove_flags(-Wno-pedantic -pedantic-errors -pedantic) # Required flags ============================================================== -if (LIBCXX_HAS_MUSL_LIBC OR LIBCXX_TARGETING_CLANG_CL) - # musl's pthread implementations uses volatile types in their structs which is - # not a constexpr in C++11 but is in C++14, so we use C++14 with musl. - set(LIBCXX_STANDARD_VER c++14 CACHE STRING "internal option to change build dialect") -else() - set(LIBCXX_STANDARD_VER c++11 CACHE STRING "internal option to change build dialect") -endif() -add_compile_flags_if_supported(-std=${LIBCXX_STANDARD_VER}) -add_compile_flags_if_supported("/std:${LIBCXX_STANDARD_VER}") -mangle_name("LIBCXX_SUPPORTS_STD_EQ_${LIBCXX_STANDARD_VER}_FLAG" SUPPORTS_DIALECT_NAME) -mangle_name("LIBCXX_SUPPORTS_STD_COLON_${LIBCXX_STANDARD_VER}_FLAG" SUPPORTS_DIALECT_NAME_MSVC) -if(NOT ${SUPPORTS_DIALECT_NAME} AND NOT ${SUPPORTS_DIALECT_NAME_MSVC}) - if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" AND NOT "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") - message(FATAL_ERROR "C++11 or greater is required but the compiler does not support ${LIBCXX_STANDARD_VER}") +function(cxx_add_basic_build_flags target) + if (LIBCXX_HAS_MUSL_LIBC OR LIBCXX_TARGETING_CLANG_CL) + # musl's pthread implementations uses volatile types in their structs which is + # not a constexpr in C++11 but is in C++14, so we use C++14 with musl. + set(LIBCXX_STANDARD_VER c++14 CACHE STRING "internal option to change build dialect") + else() + set(LIBCXX_STANDARD_VER c++11 CACHE STRING "internal option to change build dialect") + endif() + target_add_compile_flags_if_supported(${target} PRIVATE -std=${LIBCXX_STANDARD_VER}) + target_add_compile_flags_if_supported(${target} PRIVATE "/std:${LIBCXX_STANDARD_VER}") + mangle_name("LIBCXX_SUPPORTS_STD_EQ_${LIBCXX_STANDARD_VER}_FLAG" SUPPORTS_DIALECT_NAME) + mangle_name("LIBCXX_SUPPORTS_STD_COLON_${LIBCXX_STANDARD_VER}_FLAG" SUPPORTS_DIALECT_NAME_MSVC) + if(NOT ${SUPPORTS_DIALECT_NAME} AND NOT ${SUPPORTS_DIALECT_NAME_MSVC}) + if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" AND NOT "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") + message(FATAL_ERROR "C++11 or greater is required but the compiler does not support ${LIBCXX_STANDARD_VER}") + endif() endif() -endif() - -# On all systems the system c++ standard library headers need to be excluded. -# MSVC only has -X, which disables all default includes; including the crt. -# Thus, we do nothing and hope we don't accidentally include any of the C++ -# headers -add_compile_flags_if_supported(-nostdinc++) -# Hide all inline function definitions which have not explicitly been marked -# visible. This prevents new definitions for inline functions from appearing in -# the dylib when get ODR used by another function. -add_compile_flags_if_supported(-fvisibility-inlines-hidden) + # On all systems the system c++ standard library headers need to be excluded. + # MSVC only has -X, which disables all default includes; including the crt. + # Thus, we do nothing and hope we don't accidentally include any of the C++ + # headers + target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++) + + # Hide all inline function definitions which have not explicitly been marked + # visible. This prevents new definitions for inline functions from appearing in + # the dylib when get ODR used by another function. + target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden) + + # Our visibility annotations are not quite right for non-Clang compilers, + # so we end up not exporting all the symbols we should. In the future, we + # can improve the situation by providing an explicit list of exported + # symbols on all compilers. + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden) + endif() -if (LIBCXX_CONFIGURE_IDE) - # This simply allows IDE to process <experimental/coroutine> - add_compile_flags_if_supported(-fcoroutines-ts) -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. -add_definitions(-D_LIBCPP_BUILDING_LIBRARY) + # 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) - add_definitions(-D_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS) -endif() + if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) + target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS) + endif() -if (LIBCXX_HAS_COMMENT_LIB_PRAGMA) - add_definitions(-D_LIBCPP_HAS_COMMENT_LIB_PRAGMA) -endif() + if (LIBCXX_HAS_COMMENT_LIB_PRAGMA) + target_compile_definitions(${target} PRIVATE -D_LIBCPP_HAS_COMMENT_LIB_PRAGMA) + endif() +endfunction() # Warning flags =============================================================== function(cxx_add_warning_flags target) @@ -714,6 +724,31 @@ if (LIBCXX_STANDALONE_BUILD AND SANITIZER_FLAGS) add_flags(${SANITIZER_FLAGS}) endif() +# Windows-related flags ======================================================= +function(cxx_add_windows_flags target) + if(WIN32 AND NOT MINGW) + target_compile_definitions(${target} PRIVATE + # Ignore the -MSC_VER mismatch, as we may build + # with a different compatibility version. + _ALLOW_MSC_VER_MISMATCH + # Don't check the msvcprt iterator debug levels + # as we will define the iterator types; libc++ + # uses a different macro to identify the debug + # level. + _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH + # We are building the c++ runtime, don't pull in + # msvcprt. + _CRTBLD + # Don't warn on the use of "deprecated" + # "insecure" functions which are standards + # specified. + _CRT_SECURE_NO_WARNINGS + # Use the ISO conforming behaviour for conversion + # in printf, scanf. + _CRT_STDIO_ISO_WIDE_SPECIFIERS) + endif() +endfunction() + # Configuration file flags ===================================================== if (NOT LIBCXX_ABI_VERSION EQUAL 1) config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION) diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt index b85243fc751..c9c3f180870 100644 --- a/libcxx/src/CMakeLists.txt +++ b/libcxx/src/CMakeLists.txt @@ -204,35 +204,6 @@ function(cxx_set_common_defines name) if(LIBCXX_CXX_ABI_HEADER_TARGET) add_dependencies(${name} ${LIBCXX_CXX_ABI_HEADER_TARGET}) endif() - # Our visibility annotations are not quite right for non-Clang compilers, - # so we end up not exporting all the symbols we should. In the future, we - # can improve the situation by providing an explicit list of exported - # symbols on all compilers. - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - target_compile_options(${name} PRIVATE -fvisibility=hidden) - endif() - if(WIN32 AND NOT MINGW) - target_compile_definitions(${name} - PRIVATE - # Ignore the -MSC_VER mismatch, as we may build - # with a different compatibility version. - _ALLOW_MSC_VER_MISMATCH - # Don't check the msvcprt iterator debug levels - # as we will define the iterator types; libc++ - # uses a different macro to identify the debug - # level. - _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH - # We are building the c++ runtime, don't pull in - # msvcprt. - _CRTBLD - # Don't warn on the use of "deprecated" - # "insecure" functions which are standards - # specified. - _CRT_SECURE_NO_WARNINGS - # Use the ISO conforming behaviour for conversion - # in printf, scanf. - _CRT_STDIO_ISO_WIDE_SPECIFIERS) - endif() if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS) target_link_libraries(${name} PUBLIC pstl::ParallelSTL) @@ -259,8 +230,10 @@ if (LIBCXX_ENABLE_SHARED) SOVERSION "${LIBCXX_ABI_VERSION}" DEFINE_SYMBOL "" ) + cxx_add_basic_build_flags(cxx_shared) cxx_set_common_defines(cxx_shared) cxx_add_warning_flags(cxx_shared) + cxx_add_windows_flags(cxx_shared) # Link against LLVM libunwind if (LIBCXXABI_USE_LLVM_UNWINDER) @@ -360,8 +333,10 @@ if (LIBCXX_ENABLE_STATIC) LINK_FLAGS "${LIBCXX_LINK_FLAGS}" OUTPUT_NAME "c++" ) + cxx_add_basic_build_flags(cxx_static) cxx_set_common_defines(cxx_static) cxx_add_warning_flags(cxx_static) + cxx_add_windows_flags(cxx_static) if (LIBCXX_HERMETIC_STATIC_LIBRARY) # If the hermetic library doesn't define the operator new/delete functions |