|
@@ -522,50 +522,60 @@ remove_flags("/D_DEBUG" "/MTd" "/MDd" "/MT" "/Md")
|
|
remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
|
|
remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
|
|
|
|
|
|
# Required flags ==============================================================
|
|
# 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()
|
|
-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 ===============================================================
|
|
# Warning flags ===============================================================
|
|
function(cxx_add_warning_flags target)
|
|
function(cxx_add_warning_flags target)
|
|
@@ -714,6 +724,31 @@ if (LIBCXX_STANDALONE_BUILD AND SANITIZER_FLAGS)
|
|
add_flags(${SANITIZER_FLAGS})
|
|
add_flags(${SANITIZER_FLAGS})
|
|
endif()
|
|
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 =====================================================
|
|
# Configuration file flags =====================================================
|
|
if (NOT LIBCXX_ABI_VERSION EQUAL 1)
|
|
if (NOT LIBCXX_ABI_VERSION EQUAL 1)
|
|
config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
|
|
config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
|