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