xref: /netbsd-src/external/apache2/llvm/dist/libcxx/CMakeLists.txt (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg# See https://libcxx.llvm.org/docs/BuildingLibcxx.html for instructions on how
2*4d6fc14bSjoerg# to build libcxx with CMake.
3*4d6fc14bSjoerg
4*4d6fc14bSjoergif (NOT IS_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../libcxxabi")
5*4d6fc14bSjoerg  message(FATAL_ERROR "libc++ now requires being built in a monorepo layout with libcxxabi available")
6*4d6fc14bSjoergendif()
7*4d6fc14bSjoerg
8*4d6fc14bSjoerg#===============================================================================
9*4d6fc14bSjoerg# Setup Project
10*4d6fc14bSjoerg#===============================================================================
11*4d6fc14bSjoergcmake_minimum_required(VERSION 3.13.4)
12*4d6fc14bSjoerg
13*4d6fc14bSjoergset(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
14*4d6fc14bSjoerg
15*4d6fc14bSjoerg# Add path for custom modules
16*4d6fc14bSjoergset(CMAKE_MODULE_PATH
17*4d6fc14bSjoerg  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
18*4d6fc14bSjoerg  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
19*4d6fc14bSjoerg  ${CMAKE_MODULE_PATH}
20*4d6fc14bSjoerg  )
21*4d6fc14bSjoerg
22*4d6fc14bSjoergset(CMAKE_FOLDER "libc++")
23*4d6fc14bSjoerg
24*4d6fc14bSjoergset(LIBCXX_SOURCE_DIR  ${CMAKE_CURRENT_SOURCE_DIR})
25*4d6fc14bSjoergset(LIBCXX_BINARY_DIR  ${CMAKE_CURRENT_BINARY_DIR})
26*4d6fc14bSjoergset(LIBCXX_BINARY_INCLUDE_DIR "${LIBCXX_BINARY_DIR}/include/c++build")
27*4d6fc14bSjoerg
28*4d6fc14bSjoergif (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBCXX_STANDALONE_BUILD)
29*4d6fc14bSjoerg  project(libcxx CXX C)
30*4d6fc14bSjoerg
31*4d6fc14bSjoerg  set(PACKAGE_NAME libcxx)
32*4d6fc14bSjoerg  set(PACKAGE_VERSION 13.0.0git)
33*4d6fc14bSjoerg  set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
34*4d6fc14bSjoerg  set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org")
35*4d6fc14bSjoerg
36*4d6fc14bSjoerg  # In a standalone build, we don't have llvm to automatically generate the
37*4d6fc14bSjoerg  # llvm-lit script for us.  So we need to provide an explicit directory that
38*4d6fc14bSjoerg  # the configurator should write the script into.
39*4d6fc14bSjoerg  set(LIBCXX_STANDALONE_BUILD 1)
40*4d6fc14bSjoerg  set(LLVM_LIT_OUTPUT_DIR "${LIBCXX_BINARY_DIR}/bin")
41*4d6fc14bSjoerg
42*4d6fc14bSjoerg  # Find the LLVM sources and simulate LLVM CMake options.
43*4d6fc14bSjoerg  include(HandleOutOfTreeLLVM)
44*4d6fc14bSjoergendif()
45*4d6fc14bSjoerg
46*4d6fc14bSjoergif (LIBCXX_STANDALONE_BUILD)
47*4d6fc14bSjoerg  find_package(Python3 COMPONENTS Interpreter)
48*4d6fc14bSjoerg  if(NOT Python3_Interpreter_FOUND)
49*4d6fc14bSjoerg    message(WARNING "Python3 not found, using python2 as a fallback")
50*4d6fc14bSjoerg    find_package(Python2 COMPONENTS Interpreter REQUIRED)
51*4d6fc14bSjoerg    if(Python2_VERSION VERSION_LESS 2.7)
52*4d6fc14bSjoerg      message(SEND_ERROR "Python 2.7 or newer is required")
53*4d6fc14bSjoerg    endif()
54*4d6fc14bSjoerg
55*4d6fc14bSjoerg    # Treat python2 as python3
56*4d6fc14bSjoerg    add_executable(Python3::Interpreter IMPORTED)
57*4d6fc14bSjoerg    set_target_properties(Python3::Interpreter PROPERTIES
58*4d6fc14bSjoerg      IMPORTED_LOCATION ${Python2_EXECUTABLE})
59*4d6fc14bSjoerg    set(Python3_EXECUTABLE ${Python2_EXECUTABLE})
60*4d6fc14bSjoerg  endif()
61*4d6fc14bSjoergendif()
62*4d6fc14bSjoerg
63*4d6fc14bSjoerg# Require out of source build.
64*4d6fc14bSjoerginclude(MacroEnsureOutOfSourceBuild)
65*4d6fc14bSjoergMACRO_ENSURE_OUT_OF_SOURCE_BUILD(
66*4d6fc14bSjoerg "${PROJECT_NAME} requires an out of source build. Please create a separate
67*4d6fc14bSjoerg build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
68*4d6fc14bSjoerg )
69*4d6fc14bSjoergif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
70*4d6fc14bSjoerg  message(STATUS "Configuring for clang-cl")
71*4d6fc14bSjoerg  set(LIBCXX_TARGETING_CLANG_CL ON)
72*4d6fc14bSjoergendif()
73*4d6fc14bSjoerg
74*4d6fc14bSjoergif (MSVC)
75*4d6fc14bSjoerg  set(LIBCXX_TARGETING_MSVC ON)
76*4d6fc14bSjoerg  message(STATUS "Configuring for MSVC")
77*4d6fc14bSjoergelse()
78*4d6fc14bSjoerg  set(LIBCXX_TARGETING_MSVC OFF)
79*4d6fc14bSjoergendif()
80*4d6fc14bSjoerg
81*4d6fc14bSjoerg#===============================================================================
82*4d6fc14bSjoerg# Setup CMake Options
83*4d6fc14bSjoerg#===============================================================================
84*4d6fc14bSjoerginclude(CMakeDependentOption)
85*4d6fc14bSjoerginclude(HandleCompilerRT)
86*4d6fc14bSjoerg
87*4d6fc14bSjoerg# Basic options ---------------------------------------------------------------
88*4d6fc14bSjoergoption(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." OFF)
89*4d6fc14bSjoergoption(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
90*4d6fc14bSjoergoption(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
91*4d6fc14bSjoergoption(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON)
92*4d6fc14bSjoergset(ENABLE_FILESYSTEM_DEFAULT ON)
93*4d6fc14bSjoergif (WIN32 AND NOT MINGW)
94*4d6fc14bSjoerg  # Filesystem is buildable for windows, but it requires __int128 helper
95*4d6fc14bSjoerg  # functions, that currently are provided by libgcc or compiler_rt builtins.
96*4d6fc14bSjoerg  # These are available in MinGW environments, but not currently in MSVC
97*4d6fc14bSjoerg  # environments.
98*4d6fc14bSjoerg  set(ENABLE_FILESYSTEM_DEFAULT OFF)
99*4d6fc14bSjoergendif()
100*4d6fc14bSjoergoption(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of the main libc++ library"
101*4d6fc14bSjoerg    ${ENABLE_FILESYSTEM_DEFAULT})
102*4d6fc14bSjoergoption(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
103*4d6fc14bSjoergoption(LIBCXX_ENABLE_PARALLEL_ALGORITHMS "Enable the parallel algorithms library. This requires the PSTL to be available." OFF)
104*4d6fc14bSjoergoption(LIBCXX_ENABLE_DEBUG_MODE_SUPPORT
105*4d6fc14bSjoerg  "Whether to include support for libc++'s debugging mode in the library.
106*4d6fc14bSjoerg   By default, this is turned on. If you turn it off and try to enable the
107*4d6fc14bSjoerg   debug mode when compiling a program against libc++, it will fail to link
108*4d6fc14bSjoerg   since the required support isn't provided in the library." ON)
109*4d6fc14bSjoergoption(LIBCXX_ENABLE_RANDOM_DEVICE
110*4d6fc14bSjoerg  "Whether to include support for std::random_device in the library. Disabling
111*4d6fc14bSjoerg   this can be useful when building the library for platforms that don't have
112*4d6fc14bSjoerg   a source of randomness, such as some embedded platforms. When this is not
113*4d6fc14bSjoerg   supported, most of <random> will still be available, but std::random_device
114*4d6fc14bSjoerg   will not." ON)
115*4d6fc14bSjoergoption(LIBCXX_ENABLE_LOCALIZATION
116*4d6fc14bSjoerg  "Whether to include support for localization in the library. Disabling
117*4d6fc14bSjoerg   localization can be useful when porting to platforms that don't support
118*4d6fc14bSjoerg   the C locale API (e.g. embedded). When localization is not supported,
119*4d6fc14bSjoerg   several parts of the library will be disabled: <iostream>, <regex>, <locale>
120*4d6fc14bSjoerg   will be completely unusable, and other parts may be only partly available." ON)
121*4d6fc14bSjoergoption(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS
122*4d6fc14bSjoerg  "Whether to turn on vendor availability annotations on declarations that depend
123*4d6fc14bSjoerg   on definitions in a shared library. By default, we assume that we're not building
124*4d6fc14bSjoerg   libc++ for any specific vendor, and we disable those annotations. Vendors wishing
125*4d6fc14bSjoerg   to provide compile-time errors when using features unavailable on some version of
126*4d6fc14bSjoerg   the shared library they shipped should turn this on and see `include/__availability`
127*4d6fc14bSjoerg   for more details." OFF)
128*4d6fc14bSjoergset(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/legacy.cfg.in" CACHE STRING
129*4d6fc14bSjoerg    "The Lit testing configuration to use when running the tests.")
130*4d6fc14bSjoergset(LIBCXX_TEST_PARAMS "" CACHE STRING
131*4d6fc14bSjoerg    "A list of parameters to run the Lit test suite with.")
132*4d6fc14bSjoerg
133*4d6fc14bSjoerg# Benchmark options -----------------------------------------------------------
134*4d6fc14bSjoergoption(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
135*4d6fc14bSjoerg
136*4d6fc14bSjoergset(LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT --benchmark_min_time=0.01)
137*4d6fc14bSjoergset(LIBCXX_BENCHMARK_TEST_ARGS "${LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT}" CACHE STRING
138*4d6fc14bSjoerg    "Arguments to pass when running the benchmarks using check-cxx-benchmarks")
139*4d6fc14bSjoerg
140*4d6fc14bSjoergset(LIBCXX_BENCHMARK_NATIVE_STDLIB "" CACHE STRING
141*4d6fc14bSjoerg        "Build the benchmarks against the specified native STL.
142*4d6fc14bSjoerg         The value must be one of libc++/libstdc++")
143*4d6fc14bSjoergset(LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN "" CACHE STRING
144*4d6fc14bSjoerg    "Use alternate GCC toolchain when building the native benchmarks")
145*4d6fc14bSjoerg
146*4d6fc14bSjoergif (LIBCXX_BENCHMARK_NATIVE_STDLIB)
147*4d6fc14bSjoerg  if (NOT (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++"
148*4d6fc14bSjoerg        OR LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++"))
149*4d6fc14bSjoerg    message(FATAL_ERROR "Invalid value for LIBCXX_BENCHMARK_NATIVE_STDLIB: "
150*4d6fc14bSjoerg            "'${LIBCXX_BENCHMARK_NATIVE_STDLIB}'")
151*4d6fc14bSjoerg  endif()
152*4d6fc14bSjoergendif()
153*4d6fc14bSjoerg
154*4d6fc14bSjoergoption(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS})
155*4d6fc14bSjoergset(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
156*4d6fc14bSjoerg    "Define suffix of library directory name (32/64)")
157*4d6fc14bSjoergoption(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON)
158*4d6fc14bSjoergoption(LIBCXX_INSTALL_LIBRARY "Install the libc++ library." ON)
159*4d6fc14bSjoergcmake_dependent_option(LIBCXX_INSTALL_STATIC_LIBRARY
160*4d6fc14bSjoerg  "Install the static libc++ library." ON
161*4d6fc14bSjoerg  "LIBCXX_ENABLE_STATIC;LIBCXX_INSTALL_LIBRARY" OFF)
162*4d6fc14bSjoergcmake_dependent_option(LIBCXX_INSTALL_SHARED_LIBRARY
163*4d6fc14bSjoerg  "Install the shared libc++ library." ON
164*4d6fc14bSjoerg  "LIBCXX_ENABLE_SHARED;LIBCXX_INSTALL_LIBRARY" OFF)
165*4d6fc14bSjoergcmake_dependent_option(LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY
166*4d6fc14bSjoerg        "Install libc++experimental.a" ON
167*4d6fc14bSjoerg        "LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY;LIBCXX_INSTALL_LIBRARY" OFF)
168*4d6fc14bSjoerg
169*4d6fc14bSjoergset(LIBCXX_ABI_VERSION "1" CACHE STRING "ABI version of libc++. Can be either 1 or 2, where 2 is currently not stable. Defaults to 1.")
170*4d6fc14bSjoergset(LIBCXX_ABI_NAMESPACE "" CACHE STRING "The inline ABI namespace used by libc++. It defaults to __n where `n` is the current ABI version.")
171*4d6fc14bSjoergoption(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF)
172*4d6fc14bSjoergoption(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the Itanium ABI.")
173*4d6fc14bSjoergoption(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of the Microsoft ABI.")
174*4d6fc14bSjoerg
175*4d6fc14bSjoergset(LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION "default" CACHE STRING
176*4d6fc14bSjoerg  "Override the implementation to use for comparing typeinfos. By default, this
177*4d6fc14bSjoerg   is detected automatically by the library, but this option allows overriding
178*4d6fc14bSjoerg   which implementation is used unconditionally.
179*4d6fc14bSjoerg
180*4d6fc14bSjoerg   See the documentation in <libcxx/include/typeinfo> for details on what each
181*4d6fc14bSjoerg   value means.")
182*4d6fc14bSjoergset(TYPEINFO_COMPARISON_VALUES "default;1;2;3")
183*4d6fc14bSjoergif (NOT ("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" IN_LIST TYPEINFO_COMPARISON_VALUES))
184*4d6fc14bSjoerg  message(FATAL_ERROR "Value '${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}' is not a valid value for
185*4d6fc14bSjoerg                       LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION")
186*4d6fc14bSjoergendif()
187*4d6fc14bSjoerg
188*4d6fc14bSjoergoption(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT "Enable per TU ABI insulation by default. To be used by vendors." OFF)
189*4d6fc14bSjoergset(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI macros to define in the site config header.")
190*4d6fc14bSjoergoption(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
191*4d6fc14bSjoergset(LIBCXX_LIBCPPABI_VERSION "2" CACHE STRING "Version of libc++abi's ABI to re-export from libc++ when re-exporting is enabled.
192*4d6fc14bSjoerg                                               Note that this is not related to the version of libc++'s ABI itself!")
193*4d6fc14bSjoerg
194*4d6fc14bSjoerg# ABI Library options ---------------------------------------------------------
195*4d6fc14bSjoergset(LIBCXX_CXX_ABI "default" CACHE STRING "Specify C++ ABI library to use.")
196*4d6fc14bSjoergset(CXXABIS none default libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
197*4d6fc14bSjoergset_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
198*4d6fc14bSjoerg
199*4d6fc14bSjoerg# Setup the default options if LIBCXX_CXX_ABI is not specified.
200*4d6fc14bSjoergif (LIBCXX_CXX_ABI STREQUAL "default")
201*4d6fc14bSjoerg  if (LIBCXX_TARGETING_MSVC)
202*4d6fc14bSjoerg    # FIXME: Figure out how to configure the ABI library on Windows.
203*4d6fc14bSjoerg    set(LIBCXX_CXX_ABI_LIBNAME "vcruntime")
204*4d6fc14bSjoerg  elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
205*4d6fc14bSjoerg    set(LIBCXX_CXX_ABI_LIBNAME "libcxxrt")
206*4d6fc14bSjoerg  elseif (NOT LIBCXX_STANDALONE_BUILD OR HAVE_LIBCXXABI)
207*4d6fc14bSjoerg    set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
208*4d6fc14bSjoerg  else()
209*4d6fc14bSjoerg    set(LIBCXX_CXX_ABI_LIBNAME "default")
210*4d6fc14bSjoerg  endif()
211*4d6fc14bSjoergelse()
212*4d6fc14bSjoerg  set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
213*4d6fc14bSjoergendif()
214*4d6fc14bSjoerg
215*4d6fc14bSjoergoption(LIBCXX_ENABLE_STATIC_ABI_LIBRARY
216*4d6fc14bSjoerg  "Use a static copy of the ABI library when linking libc++.
217*4d6fc14bSjoerg   This option cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT." OFF)
218*4d6fc14bSjoerg
219*4d6fc14bSjoergcmake_dependent_option(LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY
220*4d6fc14bSjoerg  "Statically link the ABI library to static library" ON
221*4d6fc14bSjoerg  "LIBCXX_ENABLE_STATIC_ABI_LIBRARY;LIBCXX_ENABLE_STATIC" OFF)
222*4d6fc14bSjoerg
223*4d6fc14bSjoergcmake_dependent_option(LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
224*4d6fc14bSjoerg  "Statically link the ABI library to shared library" ON
225*4d6fc14bSjoerg  "LIBCXX_ENABLE_STATIC_ABI_LIBRARY;LIBCXX_ENABLE_SHARED" OFF)
226*4d6fc14bSjoerg
227*4d6fc14bSjoerg# Generate and install a linker script inplace of libc++.so. The linker script
228*4d6fc14bSjoerg# will link libc++ to the correct ABI library. This option is on by default
229*4d6fc14bSjoerg# on UNIX platforms other than Apple unless 'LIBCXX_ENABLE_STATIC_ABI_LIBRARY'
230*4d6fc14bSjoerg# is on. This option is also disabled when the ABI library is not specified
231*4d6fc14bSjoerg# or is specified to be "none".
232*4d6fc14bSjoergset(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
233*4d6fc14bSjoergif (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
234*4d6fc14bSjoerg      AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"
235*4d6fc14bSjoerg      AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "default"
236*4d6fc14bSjoerg      AND Python3_EXECUTABLE
237*4d6fc14bSjoerg      AND LIBCXX_ENABLE_SHARED)
238*4d6fc14bSjoerg    set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
239*4d6fc14bSjoergendif()
240*4d6fc14bSjoerg
241*4d6fc14bSjoergoption(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
242*4d6fc14bSjoerg      "Use and install a linker script for the given ABI library"
243*4d6fc14bSjoerg      ${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
244*4d6fc14bSjoerg
245*4d6fc14bSjoergoption(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
246*4d6fc14bSjoerg  "Build libc++ with definitions for operator new/delete. These are normally
247*4d6fc14bSjoerg   defined in libc++abi, but this option can be used to define them in libc++
248*4d6fc14bSjoerg   instead. If you define them in libc++, make sure they are NOT defined in
249*4d6fc14bSjoerg   libc++abi. Doing otherwise is an ODR violation." OFF)
250*4d6fc14bSjoerg# Build libc++abi with libunwind. We need this option to determine whether to
251*4d6fc14bSjoerg# link with libunwind or libgcc_s while running the test cases.
252*4d6fc14bSjoergoption(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
253*4d6fc14bSjoerg
254*4d6fc14bSjoerg# Target options --------------------------------------------------------------
255*4d6fc14bSjoergoption(LIBCXX_BUILD_32_BITS "Build 32 bit libc++." ${LLVM_BUILD_32_BITS})
256*4d6fc14bSjoergset(LIBCXX_TARGET_TRIPLE "" CACHE STRING "Use alternate target triple.")
257*4d6fc14bSjoergset(LIBCXX_SYSROOT "" CACHE STRING "Use alternate sysroot.")
258*4d6fc14bSjoergset(LIBCXX_GCC_TOOLCHAIN "" CACHE STRING "Use alternate GCC toolchain.")
259*4d6fc14bSjoerg
260*4d6fc14bSjoerg# Feature options -------------------------------------------------------------
261*4d6fc14bSjoergoption(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
262*4d6fc14bSjoergoption(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
263*4d6fc14bSjoergoption(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE "Build libc++ with support for the global filesystem namespace." ON)
264*4d6fc14bSjoergoption(LIBCXX_ENABLE_STDIN "Build libc++ with support for stdin/std::cin." ON)
265*4d6fc14bSjoergoption(LIBCXX_ENABLE_STDOUT "Build libc++ with support for stdout/std::cout." ON)
266*4d6fc14bSjoergoption(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
267*4d6fc14bSjoergoption(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS "Build libc++ with support for thread-unsafe C functions" ON)
268*4d6fc14bSjoergoption(LIBCXX_ENABLE_MONOTONIC_CLOCK
269*4d6fc14bSjoerg  "Build libc++ with support for a monotonic clock.
270*4d6fc14bSjoerg   This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
271*4d6fc14bSjoergoption(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
272*4d6fc14bSjoergoption(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
273*4d6fc14bSjoergoption(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
274*4d6fc14bSjoergoption(LIBCXX_HAS_EXTERNAL_THREAD_API
275*4d6fc14bSjoerg  "Build libc++ with an externalized threading API.
276*4d6fc14bSjoerg   This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
277*4d6fc14bSjoergoption(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY
278*4d6fc14bSjoerg    "Build libc++ with an externalized threading library.
279*4d6fc14bSjoerg     This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON" OFF)
280*4d6fc14bSjoerg
281*4d6fc14bSjoerg# Misc options ----------------------------------------------------------------
282*4d6fc14bSjoerg# FIXME: Turn -pedantic back ON. It is currently off because it warns
283*4d6fc14bSjoerg# about #include_next which is used everywhere.
284*4d6fc14bSjoergoption(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
285*4d6fc14bSjoergoption(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
286*4d6fc14bSjoergoption(LIBCXX_DISABLE_MACRO_CONFLICT_WARNINGS "Disable #warnings about conflicting macros." OFF)
287*4d6fc14bSjoerg
288*4d6fc14bSjoergoption(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
289*4d6fc14bSjoergset(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
290*4d6fc14bSjoerg    "The Profile-rt library used to build with code coverage")
291*4d6fc14bSjoerg
292*4d6fc14bSjoergset(LIBCXX_CONFIGURE_IDE_DEFAULT OFF)
293*4d6fc14bSjoergif (XCODE OR MSVC_IDE)
294*4d6fc14bSjoerg  set(LIBCXX_CONFIGURE_IDE_DEFAULT ON)
295*4d6fc14bSjoergendif()
296*4d6fc14bSjoergoption(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE"
297*4d6fc14bSjoerg      ${LIBCXX_CONFIGURE_IDE_DEFAULT})
298*4d6fc14bSjoerg
299*4d6fc14bSjoergoption(LIBCXX_HERMETIC_STATIC_LIBRARY
300*4d6fc14bSjoerg  "Do not export any symbols from the static library." OFF)
301*4d6fc14bSjoerg
302*4d6fc14bSjoerg#===============================================================================
303*4d6fc14bSjoerg# Check option configurations
304*4d6fc14bSjoerg#===============================================================================
305*4d6fc14bSjoerg
306*4d6fc14bSjoerg# Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when
307*4d6fc14bSjoerg# LIBCXX_ENABLE_THREADS is on.
308*4d6fc14bSjoergif(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
309*4d6fc14bSjoerg  message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF"
310*4d6fc14bSjoerg                      " when LIBCXX_ENABLE_THREADS is also set to OFF.")
311*4d6fc14bSjoergendif()
312*4d6fc14bSjoerg
313*4d6fc14bSjoergif(NOT LIBCXX_ENABLE_THREADS)
314*4d6fc14bSjoerg  if(LIBCXX_HAS_PTHREAD_API)
315*4d6fc14bSjoerg    message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
316*4d6fc14bSjoerg                        " when LIBCXX_ENABLE_THREADS is also set to ON.")
317*4d6fc14bSjoerg  endif()
318*4d6fc14bSjoerg  if(LIBCXX_HAS_EXTERNAL_THREAD_API)
319*4d6fc14bSjoerg    message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
320*4d6fc14bSjoerg                        " when LIBCXX_ENABLE_THREADS is also set to ON.")
321*4d6fc14bSjoerg  endif()
322*4d6fc14bSjoerg  if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
323*4d6fc14bSjoerg    message(FATAL_ERROR "LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY can only be set "
324*4d6fc14bSjoerg                        "to ON when LIBCXX_ENABLE_THREADS is also set to ON.")
325*4d6fc14bSjoerg  endif()
326*4d6fc14bSjoerg  if (LIBCXX_HAS_WIN32_THREAD_API)
327*4d6fc14bSjoerg    message(FATAL_ERROR "LIBCXX_HAS_WIN32_THREAD_API can only be set to ON"
328*4d6fc14bSjoerg                        " when LIBCXX_ENABLE_THREADS is also set to ON.")
329*4d6fc14bSjoerg  endif()
330*4d6fc14bSjoerg
331*4d6fc14bSjoergendif()
332*4d6fc14bSjoerg
333*4d6fc14bSjoergif (LIBCXX_HAS_EXTERNAL_THREAD_API)
334*4d6fc14bSjoerg  if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
335*4d6fc14bSjoerg    message(FATAL_ERROR "The options LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY and "
336*4d6fc14bSjoerg                        "LIBCXX_HAS_EXTERNAL_THREAD_API cannot both be ON at "
337*4d6fc14bSjoerg                        "the same time")
338*4d6fc14bSjoerg  endif()
339*4d6fc14bSjoerg  if (LIBCXX_HAS_PTHREAD_API)
340*4d6fc14bSjoerg    message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
341*4d6fc14bSjoerg                        "and LIBCXX_HAS_PTHREAD_API cannot be both"
342*4d6fc14bSjoerg                        "set to ON at the same time.")
343*4d6fc14bSjoerg  endif()
344*4d6fc14bSjoerg  if (LIBCXX_HAS_WIN32_THREAD_API)
345*4d6fc14bSjoerg    message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
346*4d6fc14bSjoerg                        "and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
347*4d6fc14bSjoerg                        "set to ON at the same time.")
348*4d6fc14bSjoerg  endif()
349*4d6fc14bSjoergendif()
350*4d6fc14bSjoerg
351*4d6fc14bSjoergif (LIBCXX_HAS_PTHREAD_API)
352*4d6fc14bSjoerg  if (LIBCXX_HAS_WIN32_THREAD_API)
353*4d6fc14bSjoerg    message(FATAL_ERROR "The options LIBCXX_HAS_PTHREAD_API"
354*4d6fc14bSjoerg                        "and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
355*4d6fc14bSjoerg                        "set to ON at the same time.")
356*4d6fc14bSjoerg  endif()
357*4d6fc14bSjoergendif()
358*4d6fc14bSjoerg
359*4d6fc14bSjoerg# Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
360*4d6fc14bSjoerg# is ON.
361*4d6fc14bSjoergif (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
362*4d6fc14bSjoerg  message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
363*4d6fc14bSjoergendif()
364*4d6fc14bSjoerg
365*4d6fc14bSjoerg# Set LIBCXX_BUILD_32_BITS to (LIBCXX_BUILD_32_BITS OR LLVM_BUILD_32_BITS)
366*4d6fc14bSjoerg# and check that we can build with 32 bits if requested.
367*4d6fc14bSjoergif (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32)
368*4d6fc14bSjoerg  if (LIBCXX_BUILD_32_BITS AND NOT LLVM_BUILD_32_BITS) # Don't duplicate the output from LLVM
369*4d6fc14bSjoerg    message(STATUS "Building 32 bits executables and libraries.")
370*4d6fc14bSjoerg  endif()
371*4d6fc14bSjoergelseif(LIBCXX_BUILD_32_BITS)
372*4d6fc14bSjoerg  message(FATAL_ERROR "LIBCXX_BUILD_32_BITS=ON is not supported on this platform.")
373*4d6fc14bSjoergendif()
374*4d6fc14bSjoerg
375*4d6fc14bSjoerg# Warn users that LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option.
376*4d6fc14bSjoergif (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
377*4d6fc14bSjoerg  message(WARNING "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option")
378*4d6fc14bSjoerg  if (LIBCXX_ENABLE_STATIC AND NOT Python3_EXECUTABLE)
379*4d6fc14bSjoerg    message(FATAL_ERROR "LIBCXX_ENABLE_STATIC_ABI_LIBRARY requires python but it was not found.")
380*4d6fc14bSjoerg  endif()
381*4d6fc14bSjoergendif()
382*4d6fc14bSjoerg
383*4d6fc14bSjoergif (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
384*4d6fc14bSjoerg    if (APPLE)
385*4d6fc14bSjoerg      message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
386*4d6fc14bSjoerg    endif()
387*4d6fc14bSjoerg    if (NOT LIBCXX_ENABLE_SHARED)
388*4d6fc14bSjoerg      message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
389*4d6fc14bSjoerg    endif()
390*4d6fc14bSjoergendif()
391*4d6fc14bSjoerg
392*4d6fc14bSjoergif (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
393*4d6fc14bSjoerg    message(FATAL_ERROR "Conflicting options given.
394*4d6fc14bSjoerg        LIBCXX_ENABLE_STATIC_ABI_LIBRARY cannot be specified with
395*4d6fc14bSjoerg        LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
396*4d6fc14bSjoergendif()
397*4d6fc14bSjoerg
398*4d6fc14bSjoergif (LIBCXX_ABI_FORCE_ITANIUM AND LIBCXX_ABI_FORCE_MICROSOFT)
399*4d6fc14bSjoerg  message(FATAL_ERROR "Only one of LIBCXX_ABI_FORCE_ITANIUM and LIBCXX_ABI_FORCE_MICROSOFT can be specified.")
400*4d6fc14bSjoergendif ()
401*4d6fc14bSjoerg
402*4d6fc14bSjoerg#===============================================================================
403*4d6fc14bSjoerg# Configure System
404*4d6fc14bSjoerg#===============================================================================
405*4d6fc14bSjoerg
406*4d6fc14bSjoerg# TODO: Projects that depend on libc++ should use LIBCXX_GENERATED_INCLUDE_DIR
407*4d6fc14bSjoerg# instead of hard-coding include/c++/v1.
408*4d6fc14bSjoergif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
409*4d6fc14bSjoerg  set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
410*4d6fc14bSjoerg  set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
411*4d6fc14bSjoerg  set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
412*4d6fc14bSjoerg  set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE})
413*4d6fc14bSjoerg  set(LIBCXX_INSTALL_INCLUDE_DIR "include/c++/v1")
414*4d6fc14bSjoerg  set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
415*4d6fc14bSjoerg  if(LIBCXX_LIBDIR_SUBDIR)
416*4d6fc14bSjoerg    string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
417*4d6fc14bSjoerg    string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
418*4d6fc14bSjoerg  endif()
419*4d6fc14bSjoergelseif(LLVM_LIBRARY_OUTPUT_INTDIR)
420*4d6fc14bSjoerg  set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
421*4d6fc14bSjoerg  set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
422*4d6fc14bSjoerg  set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
423*4d6fc14bSjoerg  set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX})
424*4d6fc14bSjoerg  set(LIBCXX_INSTALL_INCLUDE_DIR "include/c++/v1")
425*4d6fc14bSjoerg  set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}")
426*4d6fc14bSjoergelse()
427*4d6fc14bSjoerg  set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
428*4d6fc14bSjoerg  set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
429*4d6fc14bSjoerg  set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
430*4d6fc14bSjoerg  set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX})
431*4d6fc14bSjoerg  set(LIBCXX_INSTALL_INCLUDE_DIR "include/c++/v1")
432*4d6fc14bSjoerg  set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}")
433*4d6fc14bSjoergendif()
434*4d6fc14bSjoerg
435*4d6fc14bSjoergfile(MAKE_DIRECTORY "${LIBCXX_BINARY_INCLUDE_DIR}")
436*4d6fc14bSjoerg
437*4d6fc14bSjoergset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
438*4d6fc14bSjoergset(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
439*4d6fc14bSjoergset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
440*4d6fc14bSjoerg
441*4d6fc14bSjoerg# Declare libc++ configuration variables.
442*4d6fc14bSjoerg# They are intended for use as follows:
443*4d6fc14bSjoerg# LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
444*4d6fc14bSjoerg# LIBCXX_COMPILE_FLAGS: Compile only flags.
445*4d6fc14bSjoerg# LIBCXX_LINK_FLAGS: Linker only flags.
446*4d6fc14bSjoerg# LIBCXX_LIBRARIES: libraries libc++ is linked to.
447*4d6fc14bSjoergset(LIBCXX_COMPILE_FLAGS "")
448*4d6fc14bSjoergset(LIBCXX_LINK_FLAGS "")
449*4d6fc14bSjoergset(LIBCXX_LIBRARIES "")
450*4d6fc14bSjoerg
451*4d6fc14bSjoerg# Include macros for adding and removing libc++ flags.
452*4d6fc14bSjoerginclude(HandleLibcxxFlags)
453*4d6fc14bSjoerg
454*4d6fc14bSjoerg# Target flags ================================================================
455*4d6fc14bSjoerg# These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that
456*4d6fc14bSjoerg# 'config-ix' use them during feature checks. It also adds them to both
457*4d6fc14bSjoerg# 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS'
458*4d6fc14bSjoergadd_target_flags_if(LIBCXX_BUILD_32_BITS "-m32")
459*4d6fc14bSjoerg
460*4d6fc14bSjoergif(LIBCXX_TARGET_TRIPLE)
461*4d6fc14bSjoerg  add_target_flags("--target=${LIBCXX_TARGET_TRIPLE}")
462*4d6fc14bSjoergelseif(CMAKE_CXX_COMPILER_TARGET)
463*4d6fc14bSjoerg  set(LIBCXX_TARGET_TRIPLE "${CMAKE_CXX_COMPILER_TARGET}")
464*4d6fc14bSjoergendif()
465*4d6fc14bSjoergif(LIBCXX_SYSROOT)
466*4d6fc14bSjoerg  add_target_flags("--sysroot=${LIBCXX_SYSROOT}")
467*4d6fc14bSjoergelseif(CMAKE_SYSROOT)
468*4d6fc14bSjoerg  set(LIBCXX_SYSROOT "${CMAKE_SYSROOT}")
469*4d6fc14bSjoergendif()
470*4d6fc14bSjoergif(LIBCXX_GCC_TOOLCHAIN)
471*4d6fc14bSjoerg  add_target_flags("--gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}")
472*4d6fc14bSjoergelseif(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN)
473*4d6fc14bSjoerg  set(LIBCXX_GCC_TOOLCHAIN "${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
474*4d6fc14bSjoergendif()
475*4d6fc14bSjoerg
476*4d6fc14bSjoergif(LIBCXX_TARGET_TRIPLE)
477*4d6fc14bSjoerg  set(TARGET_TRIPLE "${LIBCXX_TARGET_TRIPLE}")
478*4d6fc14bSjoergendif()
479*4d6fc14bSjoerg
480*4d6fc14bSjoerg# Configure compiler.
481*4d6fc14bSjoerginclude(config-ix)
482*4d6fc14bSjoerg
483*4d6fc14bSjoerg# Configure coverage options.
484*4d6fc14bSjoergif (LIBCXX_GENERATE_COVERAGE)
485*4d6fc14bSjoerg  include(CodeCoverage)
486*4d6fc14bSjoerg  set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE)
487*4d6fc14bSjoergendif()
488*4d6fc14bSjoerg
489*4d6fc14bSjoergstring(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
490*4d6fc14bSjoergif (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
491*4d6fc14bSjoerg  set(LIBCXX_DEBUG_BUILD ON)
492*4d6fc14bSjoergelse()
493*4d6fc14bSjoerg  set(LIBCXX_DEBUG_BUILD OFF)
494*4d6fc14bSjoergendif()
495*4d6fc14bSjoerg
496*4d6fc14bSjoerg#===============================================================================
497*4d6fc14bSjoerg# Setup Compiler Flags
498*4d6fc14bSjoerg#===============================================================================
499*4d6fc14bSjoerg
500*4d6fc14bSjoerginclude(HandleLibCXXABI) # Setup the ABI library flags
501*4d6fc14bSjoerg
502*4d6fc14bSjoergif (NOT LIBCXX_STANDALONE_BUILD)
503*4d6fc14bSjoerg  # Remove flags that may have snuck in.
504*4d6fc14bSjoerg  remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
505*4d6fc14bSjoerg               -lc++abi)
506*4d6fc14bSjoergendif()
507*4d6fc14bSjoergremove_flags(--stdlib=libc++ -stdlib=libc++ --stdlib=libstdc++ -stdlib=libstdc++)
508*4d6fc14bSjoerg
509*4d6fc14bSjoerg# FIXME: Remove all debug flags and flags that change which Windows
510*4d6fc14bSjoerg# default libraries are linked. Currently we only support linking the
511*4d6fc14bSjoerg# non-debug DLLs
512*4d6fc14bSjoergremove_flags("/D_DEBUG" "/MTd" "/MDd" "/MT" "/Md")
513*4d6fc14bSjoerg
514*4d6fc14bSjoerg# FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
515*4d6fc14bSjoerg# Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
516*4d6fc14bSjoerg# so they don't get transformed into -Wno and -errors respectively.
517*4d6fc14bSjoergremove_flags(-Wno-pedantic -pedantic-errors -pedantic)
518*4d6fc14bSjoerg
519*4d6fc14bSjoerg# Required flags ==============================================================
520*4d6fc14bSjoergfunction(cxx_add_basic_build_flags target)
521*4d6fc14bSjoerg
522*4d6fc14bSjoerg  # Require C++20 for all targets. C++17 is needed to use aligned allocation
523*4d6fc14bSjoerg  # in the dylib. C++20 is needed to use char8_t.
524*4d6fc14bSjoerg  set_target_properties(${target} PROPERTIES
525*4d6fc14bSjoerg    CXX_STANDARD 20
526*4d6fc14bSjoerg    CXX_STANDARD_REQUIRED NO
527*4d6fc14bSjoerg    CXX_EXTENSIONS NO)
528*4d6fc14bSjoerg
529*4d6fc14bSjoerg  # When building the dylib, don't warn for unavailable aligned allocation
530*4d6fc14bSjoerg  # functions based on the deployment target -- they are always available
531*4d6fc14bSjoerg  # because they are provided by the dylib itself with the excepton of z/OS.
532*4d6fc14bSjoerg  if (ZOS)
533*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -fno-aligned-allocation)
534*4d6fc14bSjoerg  else()
535*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -faligned-allocation)
536*4d6fc14bSjoerg  endif()
537*4d6fc14bSjoerg
538*4d6fc14bSjoerg  # On all systems the system c++ standard library headers need to be excluded.
539*4d6fc14bSjoerg  # MSVC only has -X, which disables all default includes; including the crt.
540*4d6fc14bSjoerg  # Thus, we do nothing and hope we don't accidentally include any of the C++
541*4d6fc14bSjoerg  # headers
542*4d6fc14bSjoerg  target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++)
543*4d6fc14bSjoerg
544*4d6fc14bSjoerg  # Hide all inline function definitions which have not explicitly been marked
545*4d6fc14bSjoerg  # visible. This prevents new definitions for inline functions from appearing in
546*4d6fc14bSjoerg  # the dylib when get ODR used by another function.
547*4d6fc14bSjoerg  target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden)
548*4d6fc14bSjoerg
549*4d6fc14bSjoerg  # Our visibility annotations are not quite right for non-Clang compilers,
550*4d6fc14bSjoerg  # so we end up not exporting all the symbols we should. In the future, we
551*4d6fc14bSjoerg  # can improve the situation by providing an explicit list of exported
552*4d6fc14bSjoerg  # symbols on all compilers.
553*4d6fc14bSjoerg  if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
554*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden)
555*4d6fc14bSjoerg  endif()
556*4d6fc14bSjoerg
557*4d6fc14bSjoerg  if (LIBCXX_CONFIGURE_IDE)
558*4d6fc14bSjoerg    # This simply allows IDE to process <experimental/coroutine>
559*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -fcoroutines-ts)
560*4d6fc14bSjoerg  endif()
561*4d6fc14bSjoerg
562*4d6fc14bSjoerg  # Let the library headers know they are currently being used to build the
563*4d6fc14bSjoerg  # library.
564*4d6fc14bSjoerg  target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY)
565*4d6fc14bSjoerg
566*4d6fc14bSjoerg  if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS)
567*4d6fc14bSjoerg    target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS)
568*4d6fc14bSjoerg  endif()
569*4d6fc14bSjoerg
570*4d6fc14bSjoerg  if (LIBCXX_HAS_COMMENT_LIB_PRAGMA)
571*4d6fc14bSjoerg    if (LIBCXX_HAS_PTHREAD_LIB)
572*4d6fc14bSjoerg      target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_PTHREAD_LIB)
573*4d6fc14bSjoerg    endif()
574*4d6fc14bSjoerg    if (LIBCXX_HAS_RT_LIB)
575*4d6fc14bSjoerg      target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
576*4d6fc14bSjoerg    endif()
577*4d6fc14bSjoerg  endif()
578*4d6fc14bSjoergendfunction()
579*4d6fc14bSjoerg
580*4d6fc14bSjoerg# Warning flags ===============================================================
581*4d6fc14bSjoergfunction(cxx_add_warning_flags target)
582*4d6fc14bSjoerg  target_compile_definitions(${target} PUBLIC -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
583*4d6fc14bSjoerg  if (MSVC)
584*4d6fc14bSjoerg    # -W4 is the cl.exe/clang-cl equivalent of -Wall. (In cl.exe and clang-cl,
585*4d6fc14bSjoerg    # -Wall is equivalent to -Weverything in GCC style compiler drivers.)
586*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -W4)
587*4d6fc14bSjoerg  else()
588*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -Wall)
589*4d6fc14bSjoerg  endif()
590*4d6fc14bSjoerg  target_add_compile_flags_if_supported(${target} PRIVATE -Wextra -W -Wwrite-strings
591*4d6fc14bSjoerg                                                          -Wno-unused-parameter -Wno-long-long
592*4d6fc14bSjoerg                                                          -Werror=return-type -Wextra-semi -Wundef)
593*4d6fc14bSjoerg  if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
594*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE
595*4d6fc14bSjoerg      -Wno-user-defined-literals
596*4d6fc14bSjoerg      -Wno-covered-switch-default
597*4d6fc14bSjoerg      -Wno-suggest-override
598*4d6fc14bSjoerg      -Wno-ignored-attributes # FIXME: Caused by _LIBCPP_NODEBUG_TYPE not being supported on older clangs
599*4d6fc14bSjoerg    )
600*4d6fc14bSjoerg    if (LIBCXX_TARGETING_CLANG_CL)
601*4d6fc14bSjoerg      target_add_compile_flags_if_supported(${target} PRIVATE
602*4d6fc14bSjoerg        -Wno-c++98-compat
603*4d6fc14bSjoerg        -Wno-c++98-compat-pedantic
604*4d6fc14bSjoerg        -Wno-c++11-compat
605*4d6fc14bSjoerg        -Wno-undef
606*4d6fc14bSjoerg        -Wno-reserved-id-macro
607*4d6fc14bSjoerg        -Wno-gnu-include-next
608*4d6fc14bSjoerg        -Wno-gcc-compat # For ignoring "'diagnose_if' is a clang extension" warnings
609*4d6fc14bSjoerg        -Wno-zero-as-null-pointer-constant # FIXME: Remove this and fix all occurrences.
610*4d6fc14bSjoerg        -Wno-deprecated-dynamic-exception-spec # For auto_ptr
611*4d6fc14bSjoerg        -Wno-sign-conversion
612*4d6fc14bSjoerg        -Wno-old-style-cast
613*4d6fc14bSjoerg        -Wno-deprecated # FIXME: Remove this and fix all occurrences.
614*4d6fc14bSjoerg        -Wno-shift-sign-overflow # FIXME: Why do we need this with clang-cl but not clang?
615*4d6fc14bSjoerg        -Wno-double-promotion # FIXME: remove me
616*4d6fc14bSjoerg      )
617*4d6fc14bSjoerg    endif()
618*4d6fc14bSjoerg  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
619*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE
620*4d6fc14bSjoerg      -Wno-literal-suffix
621*4d6fc14bSjoerg      -Wno-c++14-compat
622*4d6fc14bSjoerg      -Wno-noexcept-type
623*4d6fc14bSjoerg      -Wno-suggest-override)
624*4d6fc14bSjoerg  endif()
625*4d6fc14bSjoerg  if (LIBCXX_ENABLE_WERROR)
626*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -Werror)
627*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -WX)
628*4d6fc14bSjoerg  else()
629*4d6fc14bSjoerg    # TODO(EricWF) Remove this. We shouldn't be suppressing errors when -Werror is
630*4d6fc14bSjoerg    # added elsewhere.
631*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -Wno-error)
632*4d6fc14bSjoerg  endif()
633*4d6fc14bSjoerg  if (LIBCXX_ENABLE_PEDANTIC)
634*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE -pedantic)
635*4d6fc14bSjoerg  endif()
636*4d6fc14bSjoerg  if (LIBCXX_DISABLE_MACRO_CONFLICT_WARNINGS)
637*4d6fc14bSjoerg    target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS)
638*4d6fc14bSjoerg  endif()
639*4d6fc14bSjoergendfunction()
640*4d6fc14bSjoerg
641*4d6fc14bSjoerg# Exception flags =============================================================
642*4d6fc14bSjoergfunction(cxx_add_exception_flags target)
643*4d6fc14bSjoerg  if (LIBCXX_ENABLE_EXCEPTIONS)
644*4d6fc14bSjoerg    # Catches C++ exceptions only and tells the compiler to assume that extern C
645*4d6fc14bSjoerg    # functions never throw a C++ exception.
646*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PUBLIC -EHsc)
647*4d6fc14bSjoerg  else()
648*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
649*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
650*4d6fc14bSjoerg  endif()
651*4d6fc14bSjoergendfunction()
652*4d6fc14bSjoerg
653*4d6fc14bSjoerg# RTTI flags ==================================================================
654*4d6fc14bSjoergfunction(cxx_add_rtti_flags target)
655*4d6fc14bSjoerg  if (NOT LIBCXX_ENABLE_RTTI)
656*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
657*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
658*4d6fc14bSjoerg  endif()
659*4d6fc14bSjoergendfunction()
660*4d6fc14bSjoerg
661*4d6fc14bSjoerg# Threading flags =============================================================
662*4d6fc14bSjoergif (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXX_ENABLE_SHARED)
663*4d6fc14bSjoerg  # Need to allow unresolved symbols if this is to work with shared library builds
664*4d6fc14bSjoerg  if (APPLE)
665*4d6fc14bSjoerg    add_link_flags("-undefined dynamic_lookup")
666*4d6fc14bSjoerg  else()
667*4d6fc14bSjoerg    # Relax this restriction from HandleLLVMOptions
668*4d6fc14bSjoerg    string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
669*4d6fc14bSjoerg  endif()
670*4d6fc14bSjoergendif()
671*4d6fc14bSjoerg
672*4d6fc14bSjoerg# Assertion flags =============================================================
673*4d6fc14bSjoergdefine_if(LIBCXX_ENABLE_ASSERTIONS -UNDEBUG)
674*4d6fc14bSjoergdefine_if_not(LIBCXX_ENABLE_ASSERTIONS -DNDEBUG)
675*4d6fc14bSjoergdefine_if(LIBCXX_ENABLE_ASSERTIONS -D_LIBCPP_DEBUG=0)
676*4d6fc14bSjoergdefine_if(LIBCXX_DEBUG_BUILD -D_DEBUG)
677*4d6fc14bSjoergif (LIBCXX_ENABLE_ASSERTIONS AND NOT LIBCXX_DEBUG_BUILD)
678*4d6fc14bSjoerg  # MSVC doesn't like _DEBUG on release builds. See PR 4379.
679*4d6fc14bSjoerg  define_if_not(LIBCXX_TARGETING_MSVC -D_DEBUG)
680*4d6fc14bSjoergendif()
681*4d6fc14bSjoerg
682*4d6fc14bSjoerg# Modules flags ===============================================================
683*4d6fc14bSjoerg# FIXME The libc++ sources are fundamentally non-modular. They need special
684*4d6fc14bSjoerg# versions of the headers in order to provide C++03 and legacy ABI definitions.
685*4d6fc14bSjoerg# NOTE: The public headers can be used with modules in all other contexts.
686*4d6fc14bSjoergfunction(cxx_add_module_flags target)
687*4d6fc14bSjoerg  if (LLVM_ENABLE_MODULES)
688*4d6fc14bSjoerg    # Ignore that the rest of the modules flags are now unused.
689*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PUBLIC -Wno-unused-command-line-argument)
690*4d6fc14bSjoerg    target_compile_options(${target} PUBLIC -fno-modules)
691*4d6fc14bSjoerg  endif()
692*4d6fc14bSjoergendfunction()
693*4d6fc14bSjoerg
694*4d6fc14bSjoerg# Sanitizer flags =============================================================
695*4d6fc14bSjoerg
696*4d6fc14bSjoergfunction(get_sanitizer_flags OUT_VAR  USE_SANITIZER)
697*4d6fc14bSjoerg  set(SANITIZER_FLAGS)
698*4d6fc14bSjoerg  set(USE_SANITIZER "${USE_SANITIZER}")
699*4d6fc14bSjoerg  # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
700*4d6fc14bSjoerg  # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
701*4d6fc14bSjoerg  if (USE_SANITIZER AND NOT MSVC)
702*4d6fc14bSjoerg    append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
703*4d6fc14bSjoerg    append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
704*4d6fc14bSjoerg
705*4d6fc14bSjoerg    if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
706*4d6fc14bSjoerg            NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
707*4d6fc14bSjoerg      append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
708*4d6fc14bSjoerg    endif()
709*4d6fc14bSjoerg    if (USE_SANITIZER STREQUAL "Address")
710*4d6fc14bSjoerg      append_flags(SANITIZER_FLAGS "-fsanitize=address")
711*4d6fc14bSjoerg    elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
712*4d6fc14bSjoerg      append_flags(SANITIZER_FLAGS -fsanitize=memory)
713*4d6fc14bSjoerg      if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
714*4d6fc14bSjoerg        append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
715*4d6fc14bSjoerg      endif()
716*4d6fc14bSjoerg    elseif (USE_SANITIZER STREQUAL "Undefined")
717*4d6fc14bSjoerg      append_flags(SANITIZER_FLAGS "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
718*4d6fc14bSjoerg    elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
719*4d6fc14bSjoerg            USE_SANITIZER STREQUAL "Undefined;Address")
720*4d6fc14bSjoerg      append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
721*4d6fc14bSjoerg    elseif (USE_SANITIZER STREQUAL "Thread")
722*4d6fc14bSjoerg      append_flags(SANITIZER_FLAGS -fsanitize=thread)
723*4d6fc14bSjoerg    elseif (USE_SANITIZER STREQUAL "DataFlow")
724*4d6fc14bSjoerg      append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
725*4d6fc14bSjoerg    else()
726*4d6fc14bSjoerg      message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
727*4d6fc14bSjoerg    endif()
728*4d6fc14bSjoerg  elseif(USE_SANITIZER AND MSVC)
729*4d6fc14bSjoerg    message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
730*4d6fc14bSjoerg  endif()
731*4d6fc14bSjoerg  set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
732*4d6fc14bSjoergendfunction()
733*4d6fc14bSjoerg
734*4d6fc14bSjoerg# Configure for sanitizers. If LIBCXX_STANDALONE_BUILD then we have to do
735*4d6fc14bSjoerg# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
736*4d6fc14bSjoergif (LIBCXX_STANDALONE_BUILD)
737*4d6fc14bSjoerg  set(LLVM_USE_SANITIZER "" CACHE STRING
738*4d6fc14bSjoerg      "Define the sanitizer used to build the library and tests")
739*4d6fc14bSjoergendif()
740*4d6fc14bSjoergget_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
741*4d6fc14bSjoergif (LIBCXX_STANDALONE_BUILD AND SANITIZER_FLAGS)
742*4d6fc14bSjoerg  add_flags(${SANITIZER_FLAGS})
743*4d6fc14bSjoergendif()
744*4d6fc14bSjoerg
745*4d6fc14bSjoerg# Link system libraries =======================================================
746*4d6fc14bSjoergfunction(cxx_link_system_libraries target)
747*4d6fc14bSjoerg
748*4d6fc14bSjoerg# In order to remove just libc++ from the link step
749*4d6fc14bSjoerg# we need to use -nostdlib++ whenever it is supported.
750*4d6fc14bSjoerg# Unfortunately this cannot be used universally because for example g++ supports
751*4d6fc14bSjoerg# only -nodefaultlibs in which case all libraries will be removed and
752*4d6fc14bSjoerg# all libraries but c++ have to be added in manually.
753*4d6fc14bSjoerg  if (LIBCXX_SUPPORTS_NOSTDLIBXX_FLAG)
754*4d6fc14bSjoerg    target_add_link_flags_if_supported(${target} PRIVATE "-nostdlib++")
755*4d6fc14bSjoerg  else()
756*4d6fc14bSjoerg    target_add_link_flags_if_supported(${target} PRIVATE "-nodefaultlibs")
757*4d6fc14bSjoerg    target_add_compile_flags_if_supported(${target} PRIVATE "/Zl")
758*4d6fc14bSjoerg    target_add_link_flags_if_supported(${target} PRIVATE "/nodefaultlib")
759*4d6fc14bSjoerg  endif()
760*4d6fc14bSjoerg
761*4d6fc14bSjoerg  if (LIBCXX_HAS_SYSTEM_LIB)
762*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE System)
763*4d6fc14bSjoerg  endif()
764*4d6fc14bSjoerg
765*4d6fc14bSjoerg  if (LIBCXX_HAS_PTHREAD_LIB)
766*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE pthread)
767*4d6fc14bSjoerg  endif()
768*4d6fc14bSjoerg
769*4d6fc14bSjoerg  if (LIBCXX_HAS_C_LIB)
770*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE c)
771*4d6fc14bSjoerg  endif()
772*4d6fc14bSjoerg
773*4d6fc14bSjoerg  if (LIBCXX_HAS_M_LIB)
774*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE m)
775*4d6fc14bSjoerg  endif()
776*4d6fc14bSjoerg
777*4d6fc14bSjoerg  if (LIBCXX_HAS_RT_LIB)
778*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE rt)
779*4d6fc14bSjoerg  endif()
780*4d6fc14bSjoerg
781*4d6fc14bSjoerg  if (LIBCXX_USE_COMPILER_RT)
782*4d6fc14bSjoerg    find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
783*4d6fc14bSjoerg    if (LIBCXX_BUILTINS_LIBRARY)
784*4d6fc14bSjoerg      target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}")
785*4d6fc14bSjoerg    endif()
786*4d6fc14bSjoerg  elseif (LIBCXX_HAS_GCC_LIB)
787*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE gcc)
788*4d6fc14bSjoerg  elseif (LIBCXX_HAS_GCC_S_LIB)
789*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE gcc_s)
790*4d6fc14bSjoerg  endif()
791*4d6fc14bSjoerg
792*4d6fc14bSjoerg  if (LIBCXX_HAS_ATOMIC_LIB)
793*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE atomic)
794*4d6fc14bSjoerg  endif()
795*4d6fc14bSjoerg
796*4d6fc14bSjoerg  if (MINGW)
797*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
798*4d6fc14bSjoerg  endif()
799*4d6fc14bSjoerg
800*4d6fc14bSjoerg  if (LIBCXX_TARGETING_MSVC)
801*4d6fc14bSjoerg    if (LIBCXX_DEBUG_BUILD)
802*4d6fc14bSjoerg      set(LIB_SUFFIX "d")
803*4d6fc14bSjoerg    else()
804*4d6fc14bSjoerg      set(LIB_SUFFIX "")
805*4d6fc14bSjoerg    endif()
806*4d6fc14bSjoerg
807*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE ucrt${LIB_SUFFIX}) # Universal C runtime
808*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE vcruntime${LIB_SUFFIX}) # C++ runtime
809*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE msvcrt${LIB_SUFFIX}) # C runtime startup files
810*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE msvcprt${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals.
811*4d6fc14bSjoerg    # Required for standards-complaint wide character formatting functions
812*4d6fc14bSjoerg    # (e.g. `printfw`/`scanfw`)
813*4d6fc14bSjoerg    target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers)
814*4d6fc14bSjoerg  endif()
815*4d6fc14bSjoerg
816*4d6fc14bSjoerg  if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21)
817*4d6fc14bSjoerg    target_link_libraries(${target} PUBLIC android_support)
818*4d6fc14bSjoerg  endif()
819*4d6fc14bSjoergendfunction()
820*4d6fc14bSjoerg
821*4d6fc14bSjoerg# Windows-related flags =======================================================
822*4d6fc14bSjoergfunction(cxx_add_windows_flags target)
823*4d6fc14bSjoerg  if(WIN32 AND NOT MINGW)
824*4d6fc14bSjoerg    target_compile_definitions(${target} PRIVATE
825*4d6fc14bSjoerg                                 # Ignore the -MSC_VER mismatch, as we may build
826*4d6fc14bSjoerg                                 # with a different compatibility version.
827*4d6fc14bSjoerg                                 _ALLOW_MSC_VER_MISMATCH
828*4d6fc14bSjoerg                                 # Don't check the msvcprt iterator debug levels
829*4d6fc14bSjoerg                                 # as we will define the iterator types; libc++
830*4d6fc14bSjoerg                                 # uses a different macro to identify the debug
831*4d6fc14bSjoerg                                 # level.
832*4d6fc14bSjoerg                                 _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
833*4d6fc14bSjoerg                                 # We are building the c++ runtime, don't pull in
834*4d6fc14bSjoerg                                 # msvcprt.
835*4d6fc14bSjoerg                                 _CRTBLD
836*4d6fc14bSjoerg                                 # Don't warn on the use of "deprecated"
837*4d6fc14bSjoerg                                 # "insecure" functions which are standards
838*4d6fc14bSjoerg                                 # specified.
839*4d6fc14bSjoerg                                 _CRT_SECURE_NO_WARNINGS
840*4d6fc14bSjoerg                                 # Use the ISO conforming behaviour for conversion
841*4d6fc14bSjoerg                                 # in printf, scanf.
842*4d6fc14bSjoerg                                 _CRT_STDIO_ISO_WIDE_SPECIFIERS)
843*4d6fc14bSjoerg  endif()
844*4d6fc14bSjoergendfunction()
845*4d6fc14bSjoerg
846*4d6fc14bSjoerg# Configuration file flags =====================================================
847*4d6fc14bSjoergif (NOT LIBCXX_ABI_VERSION EQUAL 1)
848*4d6fc14bSjoerg  config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
849*4d6fc14bSjoergendif()
850*4d6fc14bSjoergif (NOT LIBCXX_ABI_NAMESPACE STREQUAL "")
851*4d6fc14bSjoerg  if (NOT LIBCXX_ABI_NAMESPACE MATCHES "__.*")
852*4d6fc14bSjoerg    message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE must be a reserved identifier.")
853*4d6fc14bSjoerg  endif()
854*4d6fc14bSjoerg  if (LIBCXX_ABI_NAMESPACE MATCHES "__[0-9]+$")
855*4d6fc14bSjoerg    message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE '${LIBCXX_ABI_NAMESPACE}' is reserved for use by libc++.")
856*4d6fc14bSjoerg  endif()
857*4d6fc14bSjoerg  config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
858*4d6fc14bSjoergendif()
859*4d6fc14bSjoergconfig_define_if(LIBCXX_ABI_UNSTABLE _LIBCPP_ABI_UNSTABLE)
860*4d6fc14bSjoergconfig_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
861*4d6fc14bSjoergconfig_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
862*4d6fc14bSjoergconfig_define_if(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT)
863*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE)
864*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_STDIN _LIBCPP_HAS_NO_STDIN)
865*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_STDOUT _LIBCPP_HAS_NO_STDOUT)
866*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
867*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
868*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS)
869*4d6fc14bSjoergif (NOT LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION STREQUAL "default")
870*4d6fc14bSjoerg  config_define("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION)
871*4d6fc14bSjoergendif()
872*4d6fc14bSjoergconfig_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD)
873*4d6fc14bSjoergconfig_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL)
874*4d6fc14bSjoergconfig_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32)
875*4d6fc14bSjoergconfig_define_if(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
876*4d6fc14bSjoergconfig_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
877*4d6fc14bSjoergconfig_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
878*4d6fc14bSjoergconfig_define_if(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_PARALLEL_ALGORITHMS)
879*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
880*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
881*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
882*4d6fc14bSjoergconfig_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
883*4d6fc14bSjoerg
884*4d6fc14bSjoergif (LIBCXX_ABI_DEFINES)
885*4d6fc14bSjoerg  set(abi_defines)
886*4d6fc14bSjoerg  foreach (abi_define ${LIBCXX_ABI_DEFINES})
887*4d6fc14bSjoerg    if (NOT abi_define MATCHES "^_LIBCPP_ABI_")
888*4d6fc14bSjoerg      message(SEND_ERROR "Invalid ABI macro ${abi_define} in LIBCXX_ABI_DEFINES")
889*4d6fc14bSjoerg    endif()
890*4d6fc14bSjoerg    list(APPEND abi_defines "#define ${abi_define}")
891*4d6fc14bSjoerg  endforeach()
892*4d6fc14bSjoerg  string(REPLACE ";" "\n" abi_defines "${abi_defines}")
893*4d6fc14bSjoerg  config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
894*4d6fc14bSjoergendif()
895*4d6fc14bSjoerg
896*4d6fc14bSjoerg# By default libc++ on Windows expects to use a shared library, which requires
897*4d6fc14bSjoerg# the headers to use DLL import/export semantics. However when building a
898*4d6fc14bSjoerg# static library only we modify the headers to disable DLL import/export.
899*4d6fc14bSjoergif (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
900*4d6fc14bSjoerg  message(STATUS "Generating custom __config for non-DLL Windows build")
901*4d6fc14bSjoerg  config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
902*4d6fc14bSjoergendif()
903*4d6fc14bSjoerg
904*4d6fc14bSjoergif (WIN32 AND LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
905*4d6fc14bSjoerg  # If linking libcxxabi statically into libcxx, skip the dllimport attributes
906*4d6fc14bSjoerg  # on symbols we refer to from libcxxabi.
907*4d6fc14bSjoerg  add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
908*4d6fc14bSjoergendif()
909*4d6fc14bSjoerg
910*4d6fc14bSjoerg# Setup all common build flags =================================================
911*4d6fc14bSjoergfunction(cxx_add_common_build_flags target)
912*4d6fc14bSjoerg  cxx_add_basic_build_flags(${target})
913*4d6fc14bSjoerg  cxx_add_warning_flags(${target})
914*4d6fc14bSjoerg  cxx_add_windows_flags(${target})
915*4d6fc14bSjoerg  cxx_add_exception_flags(${target})
916*4d6fc14bSjoerg  cxx_add_rtti_flags(${target})
917*4d6fc14bSjoerg  cxx_add_module_flags(${target})
918*4d6fc14bSjoerg  cxx_link_system_libraries(${target})
919*4d6fc14bSjoergendfunction()
920*4d6fc14bSjoerg
921*4d6fc14bSjoerg#===============================================================================
922*4d6fc14bSjoerg# Setup Source Code And Tests
923*4d6fc14bSjoerg#===============================================================================
924*4d6fc14bSjoergadd_subdirectory(include)
925*4d6fc14bSjoergadd_subdirectory(src)
926*4d6fc14bSjoerg
927*4d6fc14bSjoergset(LIBCXX_TEST_DEPS "")
928*4d6fc14bSjoerg
929*4d6fc14bSjoergif (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
930*4d6fc14bSjoerg  list(APPEND LIBCXX_TEST_DEPS cxx_experimental)
931*4d6fc14bSjoergendif()
932*4d6fc14bSjoerg
933*4d6fc14bSjoergif (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
934*4d6fc14bSjoerg  list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)
935*4d6fc14bSjoergendif()
936*4d6fc14bSjoerg
937*4d6fc14bSjoergif (LIBCXX_INCLUDE_BENCHMARKS)
938*4d6fc14bSjoerg  add_subdirectory(benchmarks)
939*4d6fc14bSjoergendif()
940*4d6fc14bSjoerg
941*4d6fc14bSjoergif (LIBCXX_INCLUDE_TESTS)
942*4d6fc14bSjoerg  add_subdirectory(test)
943*4d6fc14bSjoerg  add_subdirectory(lib/abi)
944*4d6fc14bSjoerg  if (LIBCXX_STANDALONE_BUILD)
945*4d6fc14bSjoerg    include(AddLLVM) # for get_llvm_lit_path
946*4d6fc14bSjoerg    # Make sure the llvm-lit script is generated into the bin directory, and
947*4d6fc14bSjoerg    # do it after adding all tests, since the generated script will only work
948*4d6fc14bSjoerg    # correctly discovered tests against test locations from the source tree
949*4d6fc14bSjoerg    # that have already been discovered.
950*4d6fc14bSjoerg    add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit
951*4d6fc14bSjoerg                     ${CMAKE_CURRENT_BINARY_DIR}/llvm-lit)
952*4d6fc14bSjoerg  endif()
953*4d6fc14bSjoergendif()
954*4d6fc14bSjoerg
955*4d6fc14bSjoergif (LIBCXX_INCLUDE_DOCS)
956*4d6fc14bSjoerg  add_subdirectory(docs)
957*4d6fc14bSjoergendif()
958