1 # See https://libcxx.llvm.org/docs/BuildingLibcxx.html for instructions on how
2 # to build libcxx with CMake.
4 #===============================================================================
6 #===============================================================================
7 cmake_minimum_required(VERSION 3.20.0)
9 set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
11 # Add path for custom modules
12 list(INSERT CMAKE_MODULE_PATH 0
13 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
14 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
15 "${CMAKE_CURRENT_SOURCE_DIR}/../runtimes/cmake/Modules"
16 "${LLVM_COMMON_CMAKE_UTILS}"
17 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
20 set(CMAKE_FOLDER "libc++")
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")
26 include(GNUInstallDirs)
29 # Require out of source build.
30 include(MacroEnsureOutOfSourceBuild)
31 MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
32 "${PROJECT_NAME} requires an out of source build. Please create a separate
33 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
35 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
36 message(STATUS "Configuring for clang-cl")
37 set(LIBCXX_TARGETING_CLANG_CL ON)
41 message(STATUS "Configuring for MSVC")
44 #===============================================================================
46 #===============================================================================
47 include(CMakeDependentOption)
48 include(HandleCompilerRT)
50 # Basic options ---------------------------------------------------------------
51 option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
52 option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
53 option(LIBCXX_ENABLE_FILESYSTEM
54 "Whether to include support for parts of the library that rely on a filesystem being
55 available on the platform. This includes things like most parts of <filesystem> and
56 others like <fstream>" ON)
57 option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
58 set(LIBCXX_SUPPORTED_HARDENING_MODES unchecked hardened debug)
59 set(LIBCXX_HARDENING_MODE "unchecked" CACHE STRING
60 "Specify the default hardening mode to use. This mode will be used inside the
61 compiled library and will be the default when compiling user code. Note that
62 users can override this setting in their own code. This does not affect the
63 ABI. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
64 if (NOT "${LIBCXX_HARDENING_MODE}" IN_LIST LIBCXX_SUPPORTED_HARDENING_MODES)
66 "Unsupported hardening mode: '${LIBCXX_HARDENING_MODE}'. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
68 option(LIBCXX_ENABLE_RANDOM_DEVICE
69 "Whether to include support for std::random_device in the library. Disabling
70 this can be useful when building the library for platforms that don't have
71 a source of randomness, such as some embedded platforms. When this is not
72 supported, most of <random> will still be available, but std::random_device
74 option(LIBCXX_ENABLE_LOCALIZATION
75 "Whether to include support for localization in the library. Disabling
76 localization can be useful when porting to platforms that don't support
77 the C locale API (e.g. embedded). When localization is not supported,
78 several parts of the library will be disabled: <iostream>, <regex>, <locale>
79 will be completely unusable, and other parts may be only partly available." ON)
80 option(LIBCXX_ENABLE_UNICODE
81 "Whether to include support for Unicode in the library. Disabling Unicode can
82 be useful when porting to platforms that don't support UTF-8 encoding (e.g.
84 option(LIBCXX_ENABLE_WIDE_CHARACTERS
85 "Whether to include support for wide characters in the library. Disabling
86 wide character support can be useful when porting to platforms that don't
87 support the C functionality for wide characters. When wide characters are
88 not supported, several parts of the library will be disabled, notably the
89 wide character specializations of std::basic_string." ON)
91 # To use time zone support in libc++ the platform needs to have the IANA
92 # database installed. Libc++ will fail to build if this is enabled on a
93 # platform that does not provide the IANA database. The default is set to the
94 # current implementation state on the different platforms.
96 # TODO TZDB make the default always ON when most platforms ship with the IANA
98 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
99 set(ENABLE_TIME_ZONE_DATABASE_DEFAULT ON)
101 set(ENABLE_TIME_ZONE_DATABASE_DEFAULT OFF)
103 option(LIBCXX_ENABLE_TIME_ZONE_DATABASE
104 "Whether to include support for time zones in the library. Disabling
105 time zone support can be useful when porting to platforms that don't
106 ship the IANA time zone database. When time zones are not supported,
107 time zone support in <chrono> will be disabled." ${ENABLE_TIME_ZONE_DATABASE_DEFAULT})
108 option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS
109 "Whether to turn on vendor availability annotations on declarations that depend
110 on definitions in a shared library. By default, we assume that we're not building
111 libc++ for any specific vendor, and we disable those annotations. Vendors wishing
112 to provide compile-time errors when using features unavailable on some version of
113 the shared library they shipped should turn this on and see `include/__availability`
114 for more details." OFF)
115 option(LIBCXX_ENABLE_CLANG_TIDY "Whether to compile and run clang-tidy checks" OFF)
116 # TODO MODULES Remove this option and test for the requirements (CMake/Clang) instead.
117 option(LIBCXX_ENABLE_STD_MODULES
118 "Whether to enable the building the C++23 `std` module. This feature is
119 experimental and has additional dependencies. Only enable this when
120 interested in testing or developing this module. See
121 https://libcxx.llvm.org/Modules.html for more information." OFF)
123 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
124 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-gcc.cfg.in")
126 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-mingw.cfg.in")
127 elseif(WIN32) # clang-cl
128 if (LIBCXX_ENABLE_SHARED)
129 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-clangcl.cfg.in")
131 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static-clangcl.cfg.in")
134 if (LIBCXX_ENABLE_SHARED)
135 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared.cfg.in")
137 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static.cfg.in")
140 set(LIBCXX_TEST_CONFIG "${LIBCXX_DEFAULT_TEST_CONFIG}" CACHE STRING
141 "The path to the Lit testing configuration to use when running the tests.
142 If a relative path is provided, it is assumed to be relative to '<monorepo>/libcxx/test/configs'.")
143 if (NOT IS_ABSOLUTE "${LIBCXX_TEST_CONFIG}")
144 set(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/${LIBCXX_TEST_CONFIG}")
146 message(STATUS "Using libc++ testing configuration: ${LIBCXX_TEST_CONFIG}")
147 set(LIBCXX_TEST_PARAMS "" CACHE STRING
148 "A list of parameters to run the Lit test suite with.")
150 # Benchmark options -----------------------------------------------------------
151 option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
153 set(LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT --benchmark_min_time=0.01)
154 set(LIBCXX_BENCHMARK_TEST_ARGS "${LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT}" CACHE STRING
155 "Arguments to pass when running the benchmarks using check-cxx-benchmarks")
157 set(LIBCXX_BENCHMARK_NATIVE_STDLIB "" CACHE STRING
158 "Build the benchmarks against the specified native STL.
159 The value must be one of libc++/libstdc++")
160 set(LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN "" CACHE STRING
161 "Use alternate GCC toolchain when building the native benchmarks")
163 if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
164 if (NOT (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++"
165 OR LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++"))
166 message(FATAL_ERROR "Invalid value for LIBCXX_BENCHMARK_NATIVE_STDLIB: "
167 "'${LIBCXX_BENCHMARK_NATIVE_STDLIB}'")
171 option(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS})
172 set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
173 "Define suffix of library directory name (32/64)")
174 option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON)
175 option(LIBCXX_INSTALL_LIBRARY "Install the libc++ library." ON)
176 cmake_dependent_option(LIBCXX_INSTALL_STATIC_LIBRARY
177 "Install the static libc++ library." ON
178 "LIBCXX_ENABLE_STATIC;LIBCXX_INSTALL_LIBRARY" OFF)
179 cmake_dependent_option(LIBCXX_INSTALL_SHARED_LIBRARY
180 "Install the shared libc++ library." ON
181 "LIBCXX_ENABLE_SHARED;LIBCXX_INSTALL_LIBRARY" OFF)
183 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)
184 if (LIBCXX_ABI_UNSTABLE)
189 set(LIBCXX_ABI_VERSION "${abi_version}" CACHE STRING
190 "ABI version of libc++. Can be either 1 or 2, where 2 is currently the unstable ABI.
191 Defaults to 1 unless LIBCXX_ABI_UNSTABLE is specified, in which case this is 2.")
192 set(LIBCXX_LIBRARY_VERSION "${LIBCXX_ABI_VERSION}.0" CACHE STRING
193 "Version of libc++. This will be reflected in the name of the shared library produced.
194 For example, -DLIBCXX_LIBRARY_VERSION=x.y will result in the library being named
195 libc++.x.y.dylib, along with the usual symlinks pointing to that. On Apple platforms,
196 this also controls the linker's 'current_version' property.")
197 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.")
198 if (NOT LIBCXX_ABI_NAMESPACE MATCHES "__.*")
199 message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE must be a reserved identifier, got '${LIBCXX_ABI_NAMESPACE}'.")
201 option(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the Itanium ABI.")
202 option(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of the Microsoft ABI.")
204 set(LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION "default" CACHE STRING
205 "Override the implementation to use for comparing typeinfos. By default, this
206 is detected automatically by the library, but this option allows overriding
207 which implementation is used unconditionally.
209 See the documentation in <libcxx/include/typeinfo> for details on what each
211 set(TYPEINFO_COMPARISON_VALUES "default;1;2;3")
212 if (NOT ("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" IN_LIST TYPEINFO_COMPARISON_VALUES))
213 message(FATAL_ERROR "Value '${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}' is not a valid value for
214 LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION")
217 set(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI macros to define in the site config header.")
218 set(LIBCXX_EXTRA_SITE_DEFINES "" CACHE STRING "Extra defines to add into __config_site")
219 option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
221 # ABI Library options ---------------------------------------------------------
223 set(LIBCXX_DEFAULT_ABI_LIBRARY "vcruntime")
224 elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
225 set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxrt")
227 set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxabi")
230 set(LIBCXX_SUPPORTED_ABI_LIBRARIES none libcxxabi system-libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
231 set(LIBCXX_CXX_ABI "${LIBCXX_DEFAULT_ABI_LIBRARY}" CACHE STRING "Specify C++ ABI library to use. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
232 if (NOT "${LIBCXX_CXX_ABI}" IN_LIST LIBCXX_SUPPORTED_ABI_LIBRARIES)
233 message(FATAL_ERROR "Unsupported C++ ABI library: '${LIBCXX_CXX_ABI}'. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
236 option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY
237 "Use a static copy of the ABI library when linking libc++.
238 This option cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT." OFF)
240 option(LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY
241 "Statically link the ABI library to static library"
242 ${LIBCXX_ENABLE_STATIC_ABI_LIBRARY})
244 option(LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
245 "Statically link the ABI library to shared library"
246 ${LIBCXX_ENABLE_STATIC_ABI_LIBRARY})
248 # Generate and install a linker script inplace of libc++.so. The linker script
249 # will link libc++ to the correct ABI library. This option is on by default
250 # on UNIX platforms other than Apple unless
251 # 'LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY' is on. This option is also
252 # disabled when the ABI library is not specified or is specified to be "none".
253 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
254 if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
255 AND NOT LIBCXX_CXX_ABI STREQUAL "none"
256 AND Python3_EXECUTABLE
257 AND LIBCXX_ENABLE_SHARED)
258 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
261 option(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
262 "Use and install a linker script for the given ABI library"
263 ${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
265 option(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
266 "Build libc++ with definitions for operator new/delete. These are normally
267 defined in libc++abi, but this option can be used to define them in libc++
268 instead. If you define them in libc++, make sure they are NOT defined in
269 libc++abi. Doing otherwise is an ODR violation." OFF)
270 # Build libc++abi with libunwind. We need this option to determine whether to
271 # link with libunwind or libgcc_s while running the test cases.
272 option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
274 # Target options --------------------------------------------------------------
275 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})
276 if (LIBCXX_BUILD_32_BITS)
277 message(FATAL_ERROR "LIBCXX_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")
280 # Feature options -------------------------------------------------------------
281 option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
282 option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
283 option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
284 option(LIBCXX_ENABLE_MONOTONIC_CLOCK
285 "Build libc++ with support for a monotonic clock.
286 This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
287 option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
288 option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
289 option(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
290 option(LIBCXX_HAS_EXTERNAL_THREAD_API
291 "Build libc++ with an externalized threading API.
292 This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
294 if (LIBCXX_ENABLE_THREADS)
295 set(LIBCXX_PSTL_CPU_BACKEND "std_thread" CACHE STRING "Which PSTL CPU backend to use")
297 set(LIBCXX_PSTL_CPU_BACKEND "serial" CACHE STRING "Which PSTL CPU backend to use")
300 # Misc options ----------------------------------------------------------------
301 # FIXME: Turn -pedantic back ON. It is currently off because it warns
302 # about #include_next which is used everywhere.
303 option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
304 option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
305 option(LIBCXX_DISABLE_MACRO_CONFLICT_WARNINGS "Disable #warnings about conflicting macros." OFF)
307 option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
308 set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
309 "The Profile-rt library used to build with code coverage")
311 set(LIBCXX_CONFIGURE_IDE_DEFAULT OFF)
312 if (XCODE OR MSVC_IDE)
313 set(LIBCXX_CONFIGURE_IDE_DEFAULT ON)
315 option(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE"
316 ${LIBCXX_CONFIGURE_IDE_DEFAULT})
318 set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT OFF)
320 set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT ON)
322 option(LIBCXX_HERMETIC_STATIC_LIBRARY
323 "Do not export any symbols from the static library." ${LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT})
325 #===============================================================================
326 # Check option configurations
327 #===============================================================================
329 # Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when
330 # LIBCXX_ENABLE_THREADS is on.
331 if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
332 message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF"
333 " when LIBCXX_ENABLE_THREADS is also set to OFF.")
336 if(NOT LIBCXX_ENABLE_THREADS)
337 if(LIBCXX_HAS_PTHREAD_API)
338 message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
339 " when LIBCXX_ENABLE_THREADS is also set to ON.")
341 if(LIBCXX_HAS_EXTERNAL_THREAD_API)
342 message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
343 " when LIBCXX_ENABLE_THREADS is also set to ON.")
345 if (LIBCXX_HAS_WIN32_THREAD_API)
346 message(FATAL_ERROR "LIBCXX_HAS_WIN32_THREAD_API can only be set to ON"
347 " when LIBCXX_ENABLE_THREADS is also set to ON.")
352 if (LIBCXX_HAS_EXTERNAL_THREAD_API)
353 if (LIBCXX_HAS_PTHREAD_API)
354 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
355 " and LIBCXX_HAS_PTHREAD_API cannot be both"
356 " set to ON at the same time.")
358 if (LIBCXX_HAS_WIN32_THREAD_API)
359 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
360 " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
361 " set to ON at the same time.")
365 if (LIBCXX_HAS_PTHREAD_API)
366 if (LIBCXX_HAS_WIN32_THREAD_API)
367 message(FATAL_ERROR "The options LIBCXX_HAS_PTHREAD_API"
368 " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
369 " set to ON at the same time.")
373 # Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
375 if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
376 message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
379 if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
381 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
383 if (NOT LIBCXX_ENABLE_SHARED)
384 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
388 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
389 message(FATAL_ERROR "Conflicting options given.
390 LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY cannot be specified with
391 LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
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.")
398 if (LIBCXX_ENABLE_SHARED AND CMAKE_MSVC_RUNTIME_LIBRARY AND
399 (NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$"))
400 message(WARNING "A static CRT linked into a shared libc++ doesn't work correctly.")
403 #===============================================================================
405 #===============================================================================
407 # TODO: Projects that depend on libc++ should use LIBCXX_GENERATED_INCLUDE_DIR
408 # instead of hard-coding include/c++/v1.
410 set(LIBCXX_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE STRING
411 "Path where target-agnostic libc++ headers should be installed.")
412 set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING
413 "Path where built libc++ runtime libraries should be installed.")
415 set(LIBCXX_SHARED_OUTPUT_NAME "c++" CACHE STRING "Output name for the shared libc++ runtime library.")
416 set(LIBCXX_STATIC_OUTPUT_NAME "c++" CACHE STRING "Output name for the static libc++ runtime library.")
418 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
419 set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
420 set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
421 set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1")
422 set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
423 set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE STRING
424 "Path where built libc++ libraries should be installed.")
425 set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE STRING
426 "Path where target-specific libc++ headers should be installed.")
427 if(LIBCXX_LIBDIR_SUBDIR)
428 string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
429 string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_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 file(MAKE_DIRECTORY "${LIBCXX_BINARY_INCLUDE_DIR}")
450 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
451 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
452 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
454 # Declare libc++ configuration variables.
455 # They are intended for use as follows:
456 # LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
457 # LIBCXX_COMPILE_FLAGS: Compile only flags.
458 # LIBCXX_LINK_FLAGS: Linker only flags.
459 # LIBCXX_LIBRARIES: libraries libc++ is linked to.
460 set(LIBCXX_COMPILE_FLAGS "")
461 set(LIBCXX_LINK_FLAGS "")
462 set(LIBCXX_LIBRARIES "")
463 set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "" CACHE STRING
464 "Additional Compile only flags which can be provided in cache")
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 # Configure coverage options.
485 if (LIBCXX_GENERATE_COVERAGE)
486 include(CodeCoverage)
487 set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE)
490 #===============================================================================
491 # Setup Compiler Flags
492 #===============================================================================
494 include(HandleLibCXXABI) # Setup the ABI library flags
496 # FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
497 # Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
498 # so they don't get transformed into -Wno and -errors respectively.
499 remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
501 # Required flags ==============================================================
502 function(cxx_add_basic_build_flags target)
504 # Require C++20 for all targets. C++17 is needed to use aligned allocation
505 # in the dylib. C++20 is needed to use char8_t.
506 set_target_properties(${target} PROPERTIES
508 CXX_STANDARD_REQUIRED YES
511 # When building the dylib, don't warn for unavailable aligned allocation
512 # functions based on the deployment target -- they are always available
513 # because they are provided by the dylib itself with the exception of z/OS.
515 target_add_compile_flags_if_supported(${target} PRIVATE -fno-aligned-allocation)
517 target_add_compile_flags_if_supported(${target} PRIVATE -faligned-allocation)
520 # On all systems the system c++ standard library headers need to be excluded.
521 # MSVC only has -X, which disables all default includes; including the crt.
522 # Thus, we do nothing and hope we don't accidentally include any of the C++
524 target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++)
526 # Hide all inline function definitions which have not explicitly been marked
527 # visible. This prevents new definitions for inline functions from appearing in
528 # the dylib when get ODR used by another function.
529 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden)
531 # Our visibility annotations are not quite right for non-Clang compilers,
532 # so we end up not exporting all the symbols we should. In the future, we
533 # can improve the situation by providing an explicit list of exported
534 # symbols on all compilers.
535 if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
536 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden)
539 # Let the library headers know they are currently being used to build the
541 target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY)
543 # Make sure the library can be build without transitive includes. This makes
544 # it easier to upgrade the library to a newer language standard without build
546 target_compile_definitions(${target} PRIVATE -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
548 if (C_SUPPORTS_COMMENT_LIB_PRAGMA)
549 if (LIBCXX_HAS_PTHREAD_LIB)
550 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_PTHREAD_LIB)
552 if (LIBCXX_HAS_RT_LIB)
553 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
556 target_compile_options(${target} PUBLIC "${LIBCXX_ADDITIONAL_COMPILE_FLAGS}")
559 # Exception flags =============================================================
560 function(cxx_add_exception_flags target)
561 if (LIBCXX_ENABLE_EXCEPTIONS)
562 # Catches C++ exceptions only and tells the compiler to assume that extern C
563 # functions never throw a C++ exception.
564 target_add_compile_flags_if_supported(${target} PUBLIC -EHsc)
566 target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
567 target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
571 # RTTI flags ==================================================================
572 function(cxx_add_rtti_flags target)
573 if (NOT LIBCXX_ENABLE_RTTI)
575 target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
577 target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
582 # Modules flags ===============================================================
583 # FIXME The libc++ sources are fundamentally non-modular. They need special
584 # versions of the headers in order to provide C++03 and legacy ABI definitions.
585 # NOTE: The public headers can be used with modules in all other contexts.
586 function(cxx_add_module_flags target)
587 if (LLVM_ENABLE_MODULES)
588 # Ignore that the rest of the modules flags are now unused.
589 target_add_compile_flags_if_supported(${target} PUBLIC -Wno-unused-command-line-argument)
590 target_compile_options(${target} PUBLIC -fno-modules)
594 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
596 # Sanitizer flags =============================================================
598 function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
600 set(USE_SANITIZER "${USE_SANITIZER}")
601 # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
602 # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
603 if (USE_SANITIZER AND NOT MSVC)
604 append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
605 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
607 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
608 NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
609 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
611 if (USE_SANITIZER STREQUAL "Address")
612 append_flags(SANITIZER_FLAGS "-fsanitize=address")
613 elseif (USE_SANITIZER STREQUAL "HWAddress")
614 append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
615 elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
616 append_flags(SANITIZER_FLAGS -fsanitize=memory)
617 if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
618 append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
620 elseif (USE_SANITIZER STREQUAL "Undefined")
621 append_flags(SANITIZER_FLAGS "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
622 elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
623 USE_SANITIZER STREQUAL "Undefined;Address")
624 append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
625 elseif (USE_SANITIZER STREQUAL "Thread")
626 append_flags(SANITIZER_FLAGS -fsanitize=thread)
627 elseif (USE_SANITIZER STREQUAL "DataFlow")
628 append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
630 message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
632 elseif(USE_SANITIZER AND MSVC)
633 message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
635 set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
638 get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
640 # Link system libraries =======================================================
641 function(cxx_link_system_libraries target)
643 # In order to remove just libc++ from the link step
644 # we need to use -nostdlib++ whenever it is supported.
645 # Unfortunately this cannot be used universally because for example g++ supports
646 # only -nodefaultlibs in which case all libraries will be removed and
647 # all libraries but c++ have to be added in manually.
648 if (CXX_SUPPORTS_NOSTDLIBXX_FLAG)
649 target_add_link_flags_if_supported(${target} PRIVATE "-nostdlib++")
651 target_add_link_flags_if_supported(${target} PRIVATE "-nodefaultlibs")
652 target_add_compile_flags_if_supported(${target} PRIVATE "/Zl")
653 target_add_link_flags_if_supported(${target} PRIVATE "/nodefaultlib")
656 if (CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER)
657 # If we're linking directly against the libunwind that we're building
658 # in the same invocation, don't try to link in the toolchain's
659 # default libunwind (which may be missing still).
660 target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
663 if (LIBCXX_HAS_SYSTEM_LIB)
664 target_link_libraries(${target} PRIVATE System)
667 if (LIBCXX_HAS_PTHREAD_LIB)
668 target_link_libraries(${target} PRIVATE pthread)
671 if (LIBCXX_HAS_C_LIB)
672 target_link_libraries(${target} PRIVATE c)
675 if (LIBCXX_HAS_M_LIB)
676 target_link_libraries(${target} PRIVATE m)
679 if (LIBCXX_HAS_RT_LIB)
680 target_link_libraries(${target} PRIVATE rt)
683 if (LIBCXX_USE_COMPILER_RT)
684 find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
685 if (LIBCXX_BUILTINS_LIBRARY)
686 target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}")
688 elseif (LIBCXX_HAS_GCC_LIB)
689 target_link_libraries(${target} PRIVATE gcc)
690 elseif (LIBCXX_HAS_GCC_S_LIB)
691 target_link_libraries(${target} PRIVATE gcc_s)
694 if (LIBCXX_HAS_ATOMIC_LIB)
695 target_link_libraries(${target} PRIVATE atomic)
699 target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
703 if ((NOT CMAKE_MSVC_RUNTIME_LIBRARY AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
704 OR (CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug"))
710 if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
711 set(CRT_LIB "msvcrt")
712 set(CXX_LIB "msvcprt")
714 set(CRT_LIB "libcmt")
715 set(CXX_LIB "libcpmt")
718 target_link_libraries(${target} PRIVATE ${CRT_LIB}${LIB_SUFFIX}) # C runtime startup files
719 target_link_libraries(${target} PRIVATE ${CXX_LIB}${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals.
720 # Required for standards-complaint wide character formatting functions
721 # (e.g. `printfw`/`scanfw`)
722 target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers)
725 if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21)
726 target_link_libraries(${target} PUBLIC android_support)
728 target_link_libraries(${target} PUBLIC "${LIBCXX_ADDITIONAL_LIBRARIES}")
731 # Windows-related flags =======================================================
732 function(cxx_add_windows_flags target)
733 if(WIN32 AND NOT MINGW)
734 target_compile_definitions(${target} PRIVATE
735 # Ignore the -MSC_VER mismatch, as we may build
736 # with a different compatibility version.
737 _ALLOW_MSC_VER_MISMATCH
738 # Don't check the msvcprt iterator debug levels
739 # as we will define the iterator types; libc++
740 # uses a different macro to identify the debug
742 _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
743 # We are building the c++ runtime, don't pull in
746 # Don't warn on the use of "deprecated"
747 # "insecure" functions which are standards
749 _CRT_SECURE_NO_WARNINGS
750 # Use the ISO conforming behaviour for conversion
752 _CRT_STDIO_ISO_WIDE_SPECIFIERS)
756 # Configuration file flags =====================================================
757 config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
758 config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
759 config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
760 config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
761 config_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
762 config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
763 if (NOT LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION STREQUAL "default")
764 config_define("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION)
766 config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD)
767 config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL)
768 config_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32)
769 config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
770 config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
771 config_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM)
772 config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
773 config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
774 config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE)
775 config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS)
776 config_define_if_not(LIBCXX_ENABLE_STD_MODULES _LIBCPP_HAS_NO_STD_MODULES)
777 config_define_if_not(LIBCXX_ENABLE_TIME_ZONE_DATABASE _LIBCPP_HAS_NO_TIME_ZONE_DATABASE)
778 config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
779 if (LIBCXX_HARDENING_MODE STREQUAL "hardened")
780 config_define(1 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT)
781 config_define(0 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT)
782 elseif (LIBCXX_HARDENING_MODE STREQUAL "debug")
783 config_define(0 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT)
784 config_define(1 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT)
785 elseif (LIBCXX_HARDENING_MODE STREQUAL "unchecked")
786 config_define(0 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT)
787 config_define(0 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT)
789 # TODO(LLVM 19): Remove this after branching for LLVM 18, this is a simple
790 # courtesy for vendors to be notified about this change.
791 if (LIBCXX_ENABLE_ASSERTIONS)
792 message(FATAL_ERROR "LIBCXX_ENABLE_ASSERTIONS has been replaced by LIBCXX_HARDENING_MODE=hardened")
795 if (LIBCXX_PSTL_CPU_BACKEND STREQUAL "serial")
796 config_define(1 _LIBCPP_PSTL_CPU_BACKEND_SERIAL)
797 elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "std_thread")
798 config_define(1 _LIBCPP_PSTL_CPU_BACKEND_THREAD)
799 elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "libdispatch")
800 config_define(1 _LIBCPP_PSTL_CPU_BACKEND_LIBDISPATCH)
802 message(FATAL_ERROR "LIBCXX_PSTL_CPU_BACKEND is set to ${LIBCXX_PSTL_CPU_BACKEND}, which is not a valid backend.
803 Valid backends are: serial, std_thread and libdispatch")
806 if (LIBCXX_ABI_DEFINES)
808 foreach (abi_define ${LIBCXX_ABI_DEFINES})
809 if (NOT abi_define MATCHES "^_LIBCPP_ABI_")
810 message(SEND_ERROR "Invalid ABI macro ${abi_define} in LIBCXX_ABI_DEFINES")
812 list(APPEND abi_defines "#define ${abi_define}")
814 string(REPLACE ";" "\n" abi_defines "${abi_defines}")
815 config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
818 if (LIBCXX_EXTRA_SITE_DEFINES)
819 set(extra_site_defines)
820 foreach (extra_site_define ${LIBCXX_EXTRA_SITE_DEFINES})
821 # Allow defines such as DEFINE=VAL, transformed into "#define DEFINE VAL".
822 string(REPLACE "=" " " extra_site_define "${extra_site_define}")
823 list(APPEND extra_site_defines "#define ${extra_site_define}")
825 string(REPLACE ";" "\n" extra_site_defines "${extra_site_defines}")
826 config_define(${extra_site_defines} _LIBCPP_EXTRA_SITE_DEFINES)
829 # By default libc++ on Windows expects to use a shared library, which requires
830 # the headers to use DLL import/export semantics. However when building a
831 # static library only we modify the headers to disable DLL import/export.
832 if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
833 message(STATUS "Generating custom __config for non-DLL Windows build")
834 config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
837 if (WIN32 AND LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
838 # If linking libcxxabi statically into libcxx, skip the dllimport attributes
839 # on symbols we refer to from libcxxabi.
840 add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
843 # Setup all common build flags =================================================
844 function(cxx_add_common_build_flags target)
845 cxx_add_basic_build_flags(${target})
846 cxx_add_warning_flags(${target} ${LIBCXX_ENABLE_WERROR} ${LIBCXX_ENABLE_PEDANTIC})
847 cxx_add_windows_flags(${target})
848 cxx_add_exception_flags(${target})
849 cxx_add_rtti_flags(${target})
850 cxx_add_module_flags(${target})
851 cxx_link_system_libraries(${target})
854 #===============================================================================
855 # Setup Source Code And Tests
856 #===============================================================================
857 add_subdirectory(include)
858 add_subdirectory(src)
859 add_subdirectory(utils)
860 if (LIBCXX_ENABLE_STD_MODULES)
861 add_subdirectory(modules)
864 set(LIBCXX_TEST_DEPS "cxx_experimental")
866 if (LIBCXX_ENABLE_CLANG_TIDY)
867 list(APPEND LIBCXX_TEST_DEPS cxx-tidy)
870 if (LIBCXX_ENABLE_STD_MODULES)
871 list(APPEND LIBCXX_TEST_DEPS generate-cxx-modules generate-test-module-std)
874 if (LIBCXX_INCLUDE_BENCHMARKS)
875 add_subdirectory(benchmarks)
878 if (LIBCXX_INCLUDE_TESTS)
879 add_subdirectory(test)
880 add_subdirectory(lib/abi)
883 if (LIBCXX_INCLUDE_DOCS)
884 add_subdirectory(docs)