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