1 #===============================================================================
3 #===============================================================================
4 cmake_minimum_required(VERSION 3.20.0)
5 set(LLVM_SUBPROJECT_TITLE "libc++")
7 set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
9 # Add path for custom modules
10 list(INSERT CMAKE_MODULE_PATH 0
11 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
12 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
13 "${CMAKE_CURRENT_SOURCE_DIR}/../runtimes/cmake/Modules"
14 "${LLVM_COMMON_CMAKE_UTILS}"
15 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
18 set(CMAKE_FOLDER "libc++")
20 set(LIBCXX_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
21 set(LIBCXX_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
23 include(GNUInstallDirs)
26 # Require out of source build.
27 include(MacroEnsureOutOfSourceBuild)
28 MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
29 "${PROJECT_NAME} requires an out of source build. Please create a separate
30 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
32 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
33 message(STATUS "Configuring for clang-cl")
34 set(LIBCXX_TARGETING_CLANG_CL ON)
38 message(STATUS "Configuring for MSVC")
41 #===============================================================================
43 #===============================================================================
44 include(CMakeDependentOption)
45 include(HandleCompilerRT)
47 # Basic options ---------------------------------------------------------------
48 option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
49 option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
50 option(LIBCXX_ENABLE_EXCEPTIONS "Enable exceptions in the built library." ON)
51 option(LIBCXX_ENABLE_RTTI
52 "Use runtime type information.
53 This option may only be set to OFF when LIBCXX_ENABLE_EXCEPTIONS=OFF." ON)
54 option(LIBCXX_ENABLE_FILESYSTEM
55 "Whether to include support for parts of the library that rely on a filesystem being
56 available on the platform. This includes things like most parts of <filesystem> and
57 others like <fstream>" ON)
58 option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
59 set(LIBCXX_SUPPORTED_HARDENING_MODES none fast extensive debug)
60 set(LIBCXX_HARDENING_MODE "none" CACHE STRING
61 "Specify the default hardening mode to use. This mode will be used inside the
62 compiled library and will be the default when compiling user code. Note that
63 users can override this setting in their own code. This does not affect the
64 ABI. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
65 if (NOT "${LIBCXX_HARDENING_MODE}" IN_LIST LIBCXX_SUPPORTED_HARDENING_MODES)
67 "Unsupported hardening mode: '${LIBCXX_HARDENING_MODE}'. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
69 set(LIBCXX_ASSERTION_HANDLER_FILE
70 "vendor/llvm/default_assertion_handler.in"
72 "Specify the path to a header that contains a custom implementation of the
73 assertion handler that gets invoked when a hardening assertion fails. If
74 provided, this header will be included by the library, replacing the
75 default assertion handler. If this is specified as a relative path, it
76 is assumed to be relative to '<monorepo>/libcxx'.")
77 if (NOT IS_ABSOLUTE "${LIBCXX_ASSERTION_HANDLER_FILE}")
78 set(LIBCXX_ASSERTION_HANDLER_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${LIBCXX_ASSERTION_HANDLER_FILE}")
80 option(LIBCXX_ENABLE_RANDOM_DEVICE
81 "Whether to include support for std::random_device in the library. Disabling
82 this can be useful when building the library for platforms that don't have
83 a source of randomness, such as some embedded platforms. When this is not
84 supported, most of <random> will still be available, but std::random_device
86 option(LIBCXX_ENABLE_LOCALIZATION
87 "Whether to include support for localization in the library. Disabling
88 localization can be useful when porting to platforms that don't support
89 the C locale API (e.g. embedded). When localization is not supported,
90 several parts of the library will be disabled: <iostream>, <regex>, <locale>
91 will be completely unusable, and other parts may be only partly available." ON)
92 option(LIBCXX_ENABLE_UNICODE
93 "Whether to include support for Unicode in the library. Disabling Unicode can
94 be useful when porting to platforms that don't support UTF-8 encoding (e.g.
96 option(LIBCXX_HAS_TERMINAL_AVAILABLE
97 "Build libc++ with support for checking whether a stream is a terminal." ON)
98 option(LIBCXX_ENABLE_WIDE_CHARACTERS
99 "Whether to include support for wide characters in the library. Disabling
100 wide character support can be useful when porting to platforms that don't
101 support the C functionality for wide characters. When wide characters are
102 not supported, several parts of the library will be disabled, notably the
103 wide character specializations of std::basic_string." ON)
104 option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
105 option(LIBCXX_ENABLE_MONOTONIC_CLOCK
106 "Build libc++ with support for a monotonic clock.
107 This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
109 # To use time zone support in libc++ the platform needs to have the IANA
110 # database installed. Libc++ will fail to build if this is enabled on a
111 # platform that does not provide the IANA database. The default is set to the
112 # current implementation state on the different platforms.
114 # TODO TZDB make the default always ON when most platforms ship with the IANA
116 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
117 set(ENABLE_TIME_ZONE_DATABASE_DEFAULT ON)
119 set(ENABLE_TIME_ZONE_DATABASE_DEFAULT OFF)
121 option(LIBCXX_ENABLE_TIME_ZONE_DATABASE
122 "Whether to include support for time zones in the library. Disabling
123 time zone support can be useful when porting to platforms that don't
124 ship the IANA time zone database. When time zones are not supported,
125 time zone support in <chrono> will be disabled." ${ENABLE_TIME_ZONE_DATABASE_DEFAULT})
126 option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS
127 "Whether to turn on vendor availability annotations on declarations that depend
128 on definitions in a shared library. By default, we assume that we're not building
129 libc++ for any specific vendor, and we disable those annotations. Vendors wishing
130 to provide compile-time errors when using features unavailable on some version of
131 the shared library they shipped should turn this on and see `include/__configuration/availability.h`
132 for more details." OFF)
134 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
135 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-gcc.cfg.in")
137 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-mingw.cfg.in")
138 elseif(WIN32) # clang-cl
139 if (LIBCXX_ENABLE_SHARED)
140 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-clangcl.cfg.in")
142 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static-clangcl.cfg.in")
145 if (LIBCXX_ENABLE_SHARED)
146 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared.cfg.in")
148 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static.cfg.in")
151 set(LIBCXX_TEST_CONFIG "${LIBCXX_DEFAULT_TEST_CONFIG}" CACHE STRING
152 "The path to the Lit testing configuration to use when running the tests.
153 If a relative path is provided, it is assumed to be relative to '<monorepo>/libcxx/test/configs'.")
154 if (NOT IS_ABSOLUTE "${LIBCXX_TEST_CONFIG}")
155 set(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/${LIBCXX_TEST_CONFIG}")
157 message(STATUS "Using libc++ testing configuration: ${LIBCXX_TEST_CONFIG}")
158 set(LIBCXX_TEST_PARAMS "" CACHE STRING
159 "A list of parameters to run the Lit test suite with.")
161 # TODO: Figure out how to build GoogleBenchmark on those platforms, and how to build when exceptions or RTTI is disabled
162 if (WIN32 OR MINGW OR ANDROID OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX"
163 OR NOT LIBCXX_ENABLE_LOCALIZATION
164 OR NOT LIBCXX_ENABLE_THREADS
165 OR NOT LIBCXX_ENABLE_FILESYSTEM
166 OR NOT LIBCXX_ENABLE_RANDOM_DEVICE
167 OR NOT LIBCXX_ENABLE_EXCEPTIONS
168 OR NOT LIBCXX_ENABLE_RTTI)
169 set(_include_benchmarks OFF)
171 set(_include_benchmarks ON)
173 option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ${_include_benchmarks})
175 option(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS})
176 set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
177 "Define suffix of library directory name (32/64)")
178 option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON)
179 option(LIBCXX_INSTALL_LIBRARY "Install the libc++ library." ON)
180 option(LIBCXX_INSTALL_MODULES
181 "Install the libc++ C++20 module source files (experimental)." ON
183 cmake_dependent_option(LIBCXX_INSTALL_STATIC_LIBRARY
184 "Install the static libc++ library." ON
185 "LIBCXX_ENABLE_STATIC;LIBCXX_INSTALL_LIBRARY" OFF)
186 cmake_dependent_option(LIBCXX_INSTALL_SHARED_LIBRARY
187 "Install the shared libc++ library." ON
188 "LIBCXX_ENABLE_SHARED;LIBCXX_INSTALL_LIBRARY" OFF)
190 option(LIBCXX_ABI_UNSTABLE "Use the unstable ABI of libc++. This is equivalent to specifying LIBCXX_ABI_VERSION=n, where n is the not-yet-stable version." OFF)
191 if (LIBCXX_ABI_UNSTABLE)
196 set(LIBCXX_ABI_VERSION "${abi_version}" CACHE STRING
197 "ABI version of libc++. Can be either 1 or 2, where 2 is currently the unstable ABI.
198 Defaults to 1 unless LIBCXX_ABI_UNSTABLE is specified, in which case this is 2.")
199 set(LIBCXX_LIBRARY_VERSION "${LIBCXX_ABI_VERSION}.0" CACHE STRING
200 "Version of libc++. This will be reflected in the name of the shared library produced.
201 For example, -DLIBCXX_LIBRARY_VERSION=x.y will result in the library being named
202 libc++.x.y.dylib, along with the usual symlinks pointing to that. On Apple platforms,
203 this also controls the linker's 'current_version' property.")
204 set(LIBCXX_ABI_NAMESPACE "__${LIBCXX_ABI_VERSION}" CACHE STRING "The inline ABI namespace used by libc++. It defaults to __n where `n` is the current ABI version.")
205 if (NOT LIBCXX_ABI_NAMESPACE MATCHES "__.*")
206 message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE must be a reserved identifier, got '${LIBCXX_ABI_NAMESPACE}'.")
208 option(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the Itanium ABI.")
209 option(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of the Microsoft ABI.")
211 set(LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION "default" CACHE STRING
212 "Override the implementation to use for comparing typeinfos. By default, this
213 is detected automatically by the library, but this option allows overriding
214 which implementation is used unconditionally.
216 See the documentation in <libcxx/include/typeinfo> for details on what each
218 set(TYPEINFO_COMPARISON_VALUES "default;1;2;3")
219 if (NOT ("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" IN_LIST TYPEINFO_COMPARISON_VALUES))
220 message(FATAL_ERROR "Value '${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}' is not a valid value for
221 LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION")
224 set(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI macros to define in the site config header.")
225 set(LIBCXX_EXTRA_SITE_DEFINES "" CACHE STRING "Extra defines to add into __config_site")
226 option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
228 # C Library options -----------------------------------------------------------
230 set(LIBCXX_SUPPORTED_C_LIBRARIES system llvm-libc)
231 set(LIBCXX_LIBC "system" CACHE STRING "Specify C library to use. Supported values are ${LIBCXX_SUPPORTED_C_LIBRARIES}.")
232 if (NOT "${LIBCXX_LIBC}" IN_LIST LIBCXX_SUPPORTED_C_LIBRARIES)
233 message(FATAL_ERROR "Unsupported C library: '${LIBCXX_CXX_ABI}'. Supported values are ${LIBCXX_SUPPORTED_C_LIBRARIES}.")
236 # ABI Library options ---------------------------------------------------------
238 set(LIBCXX_DEFAULT_ABI_LIBRARY "vcruntime")
240 set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxabi")
243 set(LIBCXX_SUPPORTED_ABI_LIBRARIES none libcxxabi system-libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
244 set(LIBCXX_CXX_ABI "${LIBCXX_DEFAULT_ABI_LIBRARY}" CACHE STRING "Specify C++ ABI library to use. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
245 if (NOT "${LIBCXX_CXX_ABI}" IN_LIST LIBCXX_SUPPORTED_ABI_LIBRARIES)
246 message(FATAL_ERROR "Unsupported C++ ABI library: '${LIBCXX_CXX_ABI}'. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
249 option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY
250 "Use a static copy of the ABI library when linking libc++.
251 This option cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT." OFF)
253 option(LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY
254 "Statically link the ABI library to static library"
255 ${LIBCXX_ENABLE_STATIC_ABI_LIBRARY})
257 option(LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
258 "Statically link the ABI library to shared library"
259 ${LIBCXX_ENABLE_STATIC_ABI_LIBRARY})
261 # Generate and install a linker script inplace of libc++.so. The linker script
262 # will link libc++ to the correct ABI library. This option is on by default
263 # on UNIX platforms other than Apple, and on the Fuchsia platform unless we
264 # statically link libc++abi inside libc++.so, we don't build libc++.so at all
265 # or we don't have any ABI library.
266 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
267 OR NOT LIBCXX_ENABLE_SHARED
268 OR LIBCXX_CXX_ABI STREQUAL "none")
269 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
270 elseif((UNIX OR FUCHSIA) AND NOT APPLE)
271 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
273 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
275 option(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
276 "Use and install a linker script for the given ABI library"
277 ${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
279 option(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
280 "Build libc++ with definitions for operator new/delete. These are normally
281 defined in libc++abi, but this option can be used to define them in libc++
282 instead. If you define them in libc++, make sure they are NOT defined in
283 libc++abi. Doing otherwise is an ODR violation." OFF)
284 # Build libc++abi with libunwind. We need this option to determine whether to
285 # link with libunwind or libgcc_s while running the test cases.
286 option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." ON)
288 # Target options --------------------------------------------------------------
289 option(LIBCXX_BUILD_32_BITS "Build 32 bit multilib libc++. This option is not supported anymore when building the runtimes. Please specify a full triple instead." ${LLVM_BUILD_32_BITS})
290 if (LIBCXX_BUILD_32_BITS)
291 message(FATAL_ERROR "LIBCXX_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")
294 # Feature options -------------------------------------------------------------
295 option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
296 option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
297 option(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
298 option(LIBCXX_HAS_EXTERNAL_THREAD_API
299 "Build libc++ with an externalized threading API.
300 This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
302 if (LIBCXX_ENABLE_THREADS)
303 set(LIBCXX_PSTL_BACKEND "std_thread" CACHE STRING "Which PSTL backend to use")
305 set(LIBCXX_PSTL_BACKEND "serial" CACHE STRING "Which PSTL backend to use")
308 # Misc options ----------------------------------------------------------------
309 # FIXME: Turn -pedantic back ON. It is currently off because it warns
310 # about #include_next which is used everywhere.
311 option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
312 option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
314 set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT OFF)
316 set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT ON)
318 option(LIBCXX_HERMETIC_STATIC_LIBRARY
319 "Do not export any symbols from the static library." ${LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT})
321 #===============================================================================
322 # Check option configurations
323 #===============================================================================
325 # Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when
326 # LIBCXX_ENABLE_THREADS is on.
327 if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
328 message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF"
329 " when LIBCXX_ENABLE_THREADS is also set to OFF.")
332 if(NOT LIBCXX_ENABLE_THREADS)
333 if(LIBCXX_HAS_PTHREAD_API)
334 message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
335 " when LIBCXX_ENABLE_THREADS is also set to ON.")
337 if(LIBCXX_HAS_EXTERNAL_THREAD_API)
338 message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
339 " when LIBCXX_ENABLE_THREADS is also set to ON.")
341 if (LIBCXX_HAS_WIN32_THREAD_API)
342 message(FATAL_ERROR "LIBCXX_HAS_WIN32_THREAD_API can only be set to ON"
343 " when LIBCXX_ENABLE_THREADS is also set to ON.")
348 if (LIBCXX_HAS_EXTERNAL_THREAD_API)
349 if (LIBCXX_HAS_PTHREAD_API)
350 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
351 " and LIBCXX_HAS_PTHREAD_API cannot be both"
352 " set to ON at the same time.")
354 if (LIBCXX_HAS_WIN32_THREAD_API)
355 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
356 " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
357 " set to ON at the same time.")
361 if (LIBCXX_HAS_PTHREAD_API)
362 if (LIBCXX_HAS_WIN32_THREAD_API)
363 message(FATAL_ERROR "The options LIBCXX_HAS_PTHREAD_API"
364 " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
365 " set to ON at the same time.")
369 if (NOT LIBCXX_ENABLE_RTTI AND LIBCXX_ENABLE_EXCEPTIONS)
370 message(FATAL_ERROR "Libc++ cannot be built with exceptions enabled but RTTI"
371 " disabled, since that configuration is broken. See"
372 " https://github.com/llvm/llvm-project/issues/66117"
376 if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
378 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
380 if (NOT LIBCXX_ENABLE_SHARED)
381 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
385 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
386 message(FATAL_ERROR "Conflicting options given.
387 LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY cannot be specified with
388 LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
391 if (LIBCXX_ABI_FORCE_ITANIUM AND LIBCXX_ABI_FORCE_MICROSOFT)
392 message(FATAL_ERROR "Only one of LIBCXX_ABI_FORCE_ITANIUM and LIBCXX_ABI_FORCE_MICROSOFT can be specified.")
395 if (LIBCXX_ENABLE_SHARED AND CMAKE_MSVC_RUNTIME_LIBRARY AND
396 (NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$"))
397 message(WARNING "A static CRT linked into a shared libc++ doesn't work correctly.")
400 #===============================================================================
402 #===============================================================================
404 # TODO: Projects that depend on libc++ should use LIBCXX_GENERATED_INCLUDE_DIR
405 # instead of hard-coding include/c++/v1.
407 set(LIBCXX_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE STRING
408 "Path where target-agnostic libc++ headers should be installed.")
409 set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING
410 "Path where built libc++ runtime libraries should be installed.")
411 set(LIBCXX_INSTALL_MODULES_DIR "share/libc++/v1" CACHE STRING
412 "Path where target-agnostic libc++ module source files should be installed.")
414 set(LIBCXX_SHARED_OUTPUT_NAME "c++" CACHE STRING "Output name for the shared libc++ runtime library.")
415 set(LIBCXX_STATIC_OUTPUT_NAME "c++" CACHE STRING "Output name for the static libc++ runtime library.")
417 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
418 set(LIBCXX_TARGET_SUBDIR ${LLVM_DEFAULT_TARGET_TRIPLE})
419 if(LIBCXX_LIBDIR_SUBDIR)
420 string(APPEND LIBCXX_TARGET_SUBDIR /${LIBCXX_LIBDIR_SUBDIR})
422 set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LIBCXX_TARGET_SUBDIR})
423 set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
424 set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1")
425 set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LIBCXX_TARGET_SUBDIR}/c++/v1")
426 set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBCXX_TARGET_SUBDIR} CACHE STRING
427 "Path where built libc++ libraries should be installed.")
428 set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LIBCXX_TARGET_SUBDIR}/c++/v1" CACHE STRING
429 "Path where target-specific libc++ headers should be installed.")
430 unset(LIBCXX_TARGET_SUBDIR)
432 if(LLVM_LIBRARY_OUTPUT_INTDIR)
433 set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
434 set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
435 set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1")
437 set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
438 set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
439 set(LIBCXX_GENERATED_MODULE_DIR "${CMAKE_BINARY_DIR}/modules/c++/v1")
441 set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
442 set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE STRING
443 "Path where built libc++ libraries should be installed.")
444 set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE STRING
445 "Path where target-specific libc++ headers should be installed.")
448 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
449 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
450 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
452 # Declare libc++ configuration variables.
453 # They are intended for use as follows:
454 # LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
455 # LIBCXX_COMPILE_FLAGS: Compile only flags.
456 # LIBCXX_LINK_FLAGS: Linker only flags.
457 # LIBCXX_LIBRARIES: libraries libc++ is linked to.
458 set(LIBCXX_COMPILE_FLAGS "")
459 set(LIBCXX_LINK_FLAGS "")
460 set(LIBCXX_LIBRARIES "")
461 set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "" CACHE STRING
462 "Additional compile flags to use when building libc++. This should be a CMake ;-delimited list of individual
463 compiler options to use. For options that must be passed as-is to the compiler without deduplication (e.g.
464 `-Xclang -foo` option groups), consider using `SHELL:` (https://cmake.org/cmake/help/latest/command/add_compile_options.html#option-de-duplication).")
465 set(LIBCXX_ADDITIONAL_LIBRARIES "" CACHE STRING
466 "Additional libraries libc++ is linked to which can be provided in cache")
468 # Include macros for adding and removing libc++ flags.
469 include(HandleLibcxxFlags)
471 # Target flags ================================================================
472 # These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that
473 # 'config-ix' use them during feature checks. It also adds them to both
474 # 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS'
476 if (${CMAKE_SYSTEM_NAME} MATCHES "AIX")
477 add_flags_if_supported("-mdefault-visibility-export-mapping=explicit")
478 set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF)
481 # Configure compiler.
484 #===============================================================================
485 # Setup Compiler Flags
486 #===============================================================================
488 include(HandleLibC) # Setup the C library flags
489 include(HandleLibCXXABI) # Setup the ABI library flags
491 # FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
492 # Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
493 # so they don't get transformed into -Wno and -errors respectively.
494 remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
496 # Required flags ==============================================================
497 function(cxx_add_basic_build_flags target)
499 # Use C++23 for all targets.
500 set_target_properties(${target} PROPERTIES
502 CXX_STANDARD_REQUIRED OFF # TODO: Make this REQUIRED once we don't need to accommodate the LLVM documentation builders using an ancient CMake
505 # When building the dylib, don't warn for unavailable aligned allocation
506 # functions based on the deployment target -- they are always available
507 # because they are provided by the dylib itself with the exception of z/OS.
509 target_add_compile_flags_if_supported(${target} PRIVATE -fno-aligned-allocation)
511 target_add_compile_flags_if_supported(${target} PRIVATE -faligned-allocation)
514 # On all systems the system c++ standard library headers need to be excluded.
515 # MSVC only has -X, which disables all default includes; including the crt.
516 # Thus, we do nothing and hope we don't accidentally include any of the C++
518 target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++)
520 # Hide all inline function definitions which have not explicitly been marked
521 # visible. This prevents new definitions for inline functions from appearing in
522 # the dylib when get ODR used by another function.
523 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden)
525 # Our visibility annotations are not quite right for non-Clang compilers,
526 # so we end up not exporting all the symbols we should. In the future, we
527 # can improve the situation by providing an explicit list of exported
528 # symbols on all compilers.
529 if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
530 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden)
533 # Build with -fsized-deallocation, which is default in recent versions of Clang.
534 # TODO(LLVM 21): This can be dropped once we only support Clang >= 19.
535 target_add_compile_flags_if_supported(${target} PRIVATE -fsized-deallocation)
537 # Let the library headers know they are currently being used to build the
539 target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY)
541 # Make sure the library can be build without transitive includes. This makes
542 # it easier to upgrade the library to a newer language standard without build
544 target_compile_definitions(${target} PRIVATE -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
546 if (C_SUPPORTS_COMMENT_LIB_PRAGMA)
547 if (LIBCXX_HAS_PTHREAD_LIB)
548 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_PTHREAD_LIB)
550 if (LIBCXX_HAS_RT_LIB)
551 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
554 target_compile_options(${target} PUBLIC "${LIBCXX_ADDITIONAL_COMPILE_FLAGS}")
557 # Exception flags =============================================================
558 function(cxx_add_exception_flags target)
559 if (LIBCXX_ENABLE_EXCEPTIONS)
560 # Catches C++ exceptions only and tells the compiler to assume that extern C
561 # functions never throw a C++ exception.
562 target_add_compile_flags_if_supported(${target} PUBLIC -EHsc)
564 target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
565 target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
569 # RTTI flags ==================================================================
570 function(cxx_add_rtti_flags target)
571 if (NOT LIBCXX_ENABLE_RTTI)
573 target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
575 target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
580 # Modules flags ===============================================================
581 # FIXME The libc++ sources are fundamentally non-modular. They need special
582 # versions of the headers in order to provide C++03 and legacy ABI definitions.
583 # NOTE: The public headers can be used with modules in all other contexts.
584 function(cxx_add_module_flags target)
585 if (LLVM_ENABLE_MODULES)
586 # Ignore that the rest of the modules flags are now unused.
587 target_add_compile_flags_if_supported(${target} PUBLIC -Wno-unused-command-line-argument)
588 target_compile_options(${target} PUBLIC -fno-modules)
592 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
594 # Sanitizer flags =============================================================
596 function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
598 set(USE_SANITIZER "${USE_SANITIZER}")
599 # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
600 # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
601 if (USE_SANITIZER AND NOT MSVC)
602 append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
603 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
605 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
606 NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
607 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
609 if (USE_SANITIZER STREQUAL "Address")
610 append_flags(SANITIZER_FLAGS "-fsanitize=address")
611 elseif (USE_SANITIZER STREQUAL "HWAddress")
612 append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
613 elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
614 append_flags(SANITIZER_FLAGS -fsanitize=memory)
615 if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
616 append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
618 elseif (USE_SANITIZER STREQUAL "Undefined")
619 append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
620 elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
621 USE_SANITIZER STREQUAL "Undefined;Address")
622 append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
623 elseif (USE_SANITIZER STREQUAL "Thread")
624 append_flags(SANITIZER_FLAGS -fsanitize=thread)
625 elseif (USE_SANITIZER STREQUAL "DataFlow")
626 append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
628 message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
630 elseif(USE_SANITIZER AND MSVC)
631 message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
633 set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
636 get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
637 add_library(cxx-sanitizer-flags INTERFACE)
638 target_compile_options(cxx-sanitizer-flags INTERFACE ${SANITIZER_FLAGS})
640 # _LIBCPP_INSTRUMENTED_WITH_ASAN informs that library was built with ASan.
641 # Defining _LIBCPP_INSTRUMENTED_WITH_ASAN while building the library with ASan is required.
642 # Normally, the _LIBCPP_INSTRUMENTED_WITH_ASAN flag is used to keep information whether
643 # dylibs are built with AddressSanitizer. However, when building libc++,
644 # this flag needs to be defined so that the resulting dylib has all ASan functionalities guarded by this flag.
645 # If the _LIBCPP_INSTRUMENTED_WITH_ASAN flag is not defined, then parts of the ASan instrumentation code in libc++
646 # will not be compiled into it, resulting in false positives.
647 # For context, read: https://github.com/llvm/llvm-project/pull/72677#pullrequestreview-1765402800
648 string(FIND "${LLVM_USE_SANITIZER}" "Address" building_with_asan)
649 if (NOT "${building_with_asan}" STREQUAL "-1")
650 config_define(ON _LIBCPP_INSTRUMENTED_WITH_ASAN)
652 config_define(OFF _LIBCPP_INSTRUMENTED_WITH_ASAN)
655 # Link system libraries =======================================================
656 function(cxx_link_system_libraries target)
658 target_link_libraries(${target} PRIVATE "-nostdlib++")
661 if (CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER)
662 # If we're linking directly against the libunwind that we're building
663 # in the same invocation, don't try to link in the toolchain's
664 # default libunwind (which may be missing still).
665 target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
669 if (LIBCXX_USE_COMPILER_RT)
670 find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
671 if (LIBCXX_BUILTINS_LIBRARY)
672 target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}")
674 elseif (LIBCXX_HAS_GCC_LIB)
675 target_link_libraries(${target} PRIVATE gcc)
676 elseif (LIBCXX_HAS_GCC_S_LIB)
677 target_link_libraries(${target} PRIVATE gcc_s)
681 if (LIBCXX_HAS_ATOMIC_LIB)
682 target_link_libraries(${target} PRIVATE atomic)
686 target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
690 if ((NOT CMAKE_MSVC_RUNTIME_LIBRARY AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
691 OR (CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug"))
697 if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
698 set(CRT_LIB "msvcrt")
699 set(CXX_LIB "msvcprt")
701 set(CRT_LIB "libcmt")
702 set(CXX_LIB "libcpmt")
705 target_link_libraries(${target} PRIVATE ${CRT_LIB}${LIB_SUFFIX}) # C runtime startup files
706 target_link_libraries(${target} PRIVATE ${CXX_LIB}${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals.
707 # Required for standards-complaint wide character formatting functions
708 # (e.g. `printfw`/`scanfw`)
709 target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers)
712 if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21)
713 target_link_libraries(${target} PUBLIC android_support)
715 target_link_libraries(${target} PUBLIC "${LIBCXX_ADDITIONAL_LIBRARIES}")
718 # Windows-related flags =======================================================
719 function(cxx_add_windows_flags target)
720 if(WIN32 AND NOT MINGW)
721 target_compile_definitions(${target} PRIVATE
722 # Ignore the -MSC_VER mismatch, as we may build
723 # with a different compatibility version.
724 _ALLOW_MSC_VER_MISMATCH
725 # Don't check the msvcprt iterator debug levels
726 # as we will define the iterator types; libc++
727 # uses a different macro to identify the debug
729 _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
730 # We are building the c++ runtime, don't pull in
733 # Don't warn on the use of "deprecated"
734 # "insecure" functions which are standards
736 _CRT_SECURE_NO_WARNINGS
737 # Use the ISO conforming behaviour for conversion
739 _CRT_STDIO_ISO_WIDE_SPECIFIERS)
743 # Configuration file flags =====================================================
744 config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
745 config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
746 config_define(${LIBCXX_ABI_FORCE_ITANIUM} _LIBCPP_ABI_FORCE_ITANIUM)
747 config_define(${LIBCXX_ABI_FORCE_MICROSOFT} _LIBCPP_ABI_FORCE_MICROSOFT)
748 config_define(${LIBCXX_ENABLE_THREADS} _LIBCPP_HAS_THREADS)
749 config_define(${LIBCXX_ENABLE_MONOTONIC_CLOCK} _LIBCPP_HAS_MONOTONIC_CLOCK)
750 config_define(${LIBCXX_HAS_TERMINAL_AVAILABLE} _LIBCPP_HAS_TERMINAL)
751 if (NOT LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION STREQUAL "default")
752 config_define("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION)
754 config_define(${LIBCXX_HAS_PTHREAD_API} _LIBCPP_HAS_THREAD_API_PTHREAD)
755 config_define(${LIBCXX_HAS_EXTERNAL_THREAD_API} _LIBCPP_HAS_THREAD_API_EXTERNAL)
756 config_define(${LIBCXX_HAS_WIN32_THREAD_API} _LIBCPP_HAS_THREAD_API_WIN32)
757 config_define(${LIBCXX_HAS_MUSL_LIBC} _LIBCPP_HAS_MUSL_LIBC)
758 config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
759 config_define(${LIBCXX_ENABLE_FILESYSTEM} _LIBCPP_HAS_FILESYSTEM)
760 config_define(${LIBCXX_ENABLE_RANDOM_DEVICE} _LIBCPP_HAS_RANDOM_DEVICE)
761 config_define(${LIBCXX_ENABLE_LOCALIZATION} _LIBCPP_HAS_LOCALIZATION)
762 config_define(${LIBCXX_ENABLE_UNICODE} _LIBCPP_HAS_UNICODE)
763 config_define(${LIBCXX_ENABLE_WIDE_CHARACTERS} _LIBCPP_HAS_WIDE_CHARACTERS)
764 config_define(${LIBCXX_ENABLE_TIME_ZONE_DATABASE} _LIBCPP_HAS_TIME_ZONE_DATABASE)
765 config_define(${LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS} _LIBCPP_HAS_VENDOR_AVAILABILITY_ANNOTATIONS)
767 # TODO: Remove in LLVM 21. We're leaving an error to make this fail explicitly.
768 if (LIBCXX_ENABLE_ASSERTIONS)
769 message(FATAL_ERROR "LIBCXX_ENABLE_ASSERTIONS has been removed. Please use LIBCXX_HARDENING_MODE instead.")
771 if (LIBCXX_HARDENING_MODE STREQUAL "none")
772 config_define(2 _LIBCPP_HARDENING_MODE_DEFAULT)
773 elseif (LIBCXX_HARDENING_MODE STREQUAL "fast")
774 config_define(4 _LIBCPP_HARDENING_MODE_DEFAULT)
775 elseif (LIBCXX_HARDENING_MODE STREQUAL "extensive")
776 config_define(16 _LIBCPP_HARDENING_MODE_DEFAULT)
777 elseif (LIBCXX_HARDENING_MODE STREQUAL "debug")
778 config_define(8 _LIBCPP_HARDENING_MODE_DEFAULT)
781 if (LIBCXX_PSTL_BACKEND STREQUAL "serial")
782 config_define(1 _LIBCPP_PSTL_BACKEND_SERIAL)
783 elseif(LIBCXX_PSTL_BACKEND STREQUAL "std_thread")
784 config_define(1 _LIBCPP_PSTL_BACKEND_STD_THREAD)
785 elseif(LIBCXX_PSTL_BACKEND STREQUAL "libdispatch")
786 config_define(1 _LIBCPP_PSTL_BACKEND_LIBDISPATCH)
788 message(FATAL_ERROR "LIBCXX_PSTL_BACKEND is set to ${LIBCXX_PSTL_BACKEND}, which is not a valid backend.
789 Valid backends are: serial, std_thread and libdispatch")
792 if (LIBCXX_ABI_DEFINES)
794 foreach (abi_define ${LIBCXX_ABI_DEFINES})
795 if (NOT abi_define MATCHES "^_LIBCPP_ABI_")
796 message(SEND_ERROR "Invalid ABI macro ${abi_define} in LIBCXX_ABI_DEFINES")
798 list(APPEND abi_defines "#define ${abi_define}")
800 string(REPLACE ";" "\n" abi_defines "${abi_defines}")
801 config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
804 if (LIBCXX_EXTRA_SITE_DEFINES)
805 set(extra_site_defines)
806 foreach (extra_site_define ${LIBCXX_EXTRA_SITE_DEFINES})
807 # Allow defines such as DEFINE=VAL, transformed into "#define DEFINE VAL".
808 string(REPLACE "=" " " extra_site_define "${extra_site_define}")
809 list(APPEND extra_site_defines "#define ${extra_site_define}")
811 string(REPLACE ";" "\n" extra_site_defines "${extra_site_defines}")
812 config_define(${extra_site_defines} _LIBCPP_EXTRA_SITE_DEFINES)
815 # By default libc++ on Windows expects to use a shared library, which requires
816 # the headers to use DLL import/export semantics. However when building a
817 # static library only we modify the headers to disable DLL import/export.
818 if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
819 message(STATUS "Generating custom __config for non-DLL Windows build")
820 config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
823 if (WIN32 AND LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
824 # If linking libcxxabi statically into libcxx, skip the dllimport attributes
825 # on symbols we refer to from libcxxabi.
826 add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
829 # Setup all common build flags =================================================
830 function(cxx_add_common_build_flags target)
831 cxx_add_basic_build_flags(${target})
832 cxx_add_warning_flags(${target} ${LIBCXX_ENABLE_WERROR} ${LIBCXX_ENABLE_PEDANTIC})
833 cxx_add_windows_flags(${target})
834 cxx_add_exception_flags(${target})
835 cxx_add_rtti_flags(${target})
836 cxx_add_module_flags(${target})
837 cxx_link_system_libraries(${target})
838 target_link_libraries(${target} PRIVATE cxx-sanitizer-flags)
841 #===============================================================================
842 # Setup Source Code And Tests
843 #===============================================================================
844 add_custom_target(cxx-test-depends
845 COMMENT "Build dependencies required to run the libc++ test suite.")
847 add_subdirectory(include)
848 add_subdirectory(src)
849 add_subdirectory(utils)
850 add_subdirectory(modules)
852 if (LIBCXX_INCLUDE_TESTS)
853 add_subdirectory(test)
854 add_subdirectory(lib/abi)
857 if (LIBCXX_INCLUDE_DOCS)
858 add_subdirectory(docs)