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_ASSERTIONS
52 "Enable assertions inside the compiled library, and at the same time make it the
53 default when compiling user code. Note that assertions can be enabled or disabled
54 by users in their own code regardless of this option." OFF)
55 option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
56 option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
57 option(LIBCXX_ENABLE_FILESYSTEM
58 "Whether to include support for parts of the library that rely on a filesystem being
59 available on the platform. This includes things like most parts of <filesystem> and
60 others like <fstream>" ON)
61 option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
62 set(LIBCXX_SUPPORTED_HARDENING_MODES none fast extensive debug)
63 set(LIBCXX_HARDENING_MODE "none" CACHE STRING
64 "Specify the default hardening mode to use. This mode will be used inside the
65 compiled library and will be the default when compiling user code. Note that
66 users can override this setting in their own code. This does not affect the
67 ABI. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
68 if (NOT "${LIBCXX_HARDENING_MODE}" IN_LIST LIBCXX_SUPPORTED_HARDENING_MODES)
70 "Unsupported hardening mode: '${LIBCXX_HARDENING_MODE}'. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
72 option(LIBCXX_ENABLE_RANDOM_DEVICE
73 "Whether to include support for std::random_device in the library. Disabling
74 this can be useful when building the library for platforms that don't have
75 a source of randomness, such as some embedded platforms. When this is not
76 supported, most of <random> will still be available, but std::random_device
78 option(LIBCXX_ENABLE_LOCALIZATION
79 "Whether to include support for localization in the library. Disabling
80 localization can be useful when porting to platforms that don't support
81 the C locale API (e.g. embedded). When localization is not supported,
82 several parts of the library will be disabled: <iostream>, <regex>, <locale>
83 will be completely unusable, and other parts may be only partly available." ON)
84 option(LIBCXX_ENABLE_UNICODE
85 "Whether to include support for Unicode in the library. Disabling Unicode can
86 be useful when porting to platforms that don't support UTF-8 encoding (e.g.
88 option(LIBCXX_ENABLE_WIDE_CHARACTERS
89 "Whether to include support for wide characters in the library. Disabling
90 wide character support can be useful when porting to platforms that don't
91 support the C functionality for wide characters. When wide characters are
92 not supported, several parts of the library will be disabled, notably the
93 wide character specializations of std::basic_string." ON)
95 # To use time zone support in libc++ the platform needs to have the IANA
96 # database installed. Libc++ will fail to build if this is enabled on a
97 # platform that does not provide the IANA database. The default is set to the
98 # current implementation state on the different platforms.
100 # TODO TZDB make the default always ON when most platforms ship with the IANA
102 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
103 set(ENABLE_TIME_ZONE_DATABASE_DEFAULT ON)
105 set(ENABLE_TIME_ZONE_DATABASE_DEFAULT OFF)
107 option(LIBCXX_ENABLE_TIME_ZONE_DATABASE
108 "Whether to include support for time zones in the library. Disabling
109 time zone support can be useful when porting to platforms that don't
110 ship the IANA time zone database. When time zones are not supported,
111 time zone support in <chrono> will be disabled." ${ENABLE_TIME_ZONE_DATABASE_DEFAULT})
112 option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS
113 "Whether to turn on vendor availability annotations on declarations that depend
114 on definitions in a shared library. By default, we assume that we're not building
115 libc++ for any specific vendor, and we disable those annotations. Vendors wishing
116 to provide compile-time errors when using features unavailable on some version of
117 the shared library they shipped should turn this on and see `include/__availability`
118 for more details." OFF)
119 option(LIBCXX_ENABLE_CLANG_TIDY "Whether to compile and run clang-tidy checks" OFF)
120 # TODO MODULES Remove this option and test for the requirements (CMake/Clang) instead.
121 option(LIBCXX_ENABLE_STD_MODULES
122 "Whether to enable the building the C++23 `std` module. This feature is
123 experimental and has additional dependencies. Only enable this when
124 interested in testing or developing this module. See
125 https://libcxx.llvm.org/Modules.html for more information." OFF)
127 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
128 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-gcc.cfg.in")
130 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-mingw.cfg.in")
131 elseif(WIN32) # clang-cl
132 if (LIBCXX_ENABLE_SHARED)
133 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-clangcl.cfg.in")
135 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static-clangcl.cfg.in")
138 if (LIBCXX_ENABLE_SHARED)
139 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared.cfg.in")
141 set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static.cfg.in")
144 set(LIBCXX_TEST_CONFIG "${LIBCXX_DEFAULT_TEST_CONFIG}" CACHE STRING
145 "The path to the Lit testing configuration to use when running the tests.
146 If a relative path is provided, it is assumed to be relative to '<monorepo>/libcxx/test/configs'.")
147 if (NOT IS_ABSOLUTE "${LIBCXX_TEST_CONFIG}")
148 set(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/${LIBCXX_TEST_CONFIG}")
150 message(STATUS "Using libc++ testing configuration: ${LIBCXX_TEST_CONFIG}")
151 set(LIBCXX_TEST_PARAMS "" CACHE STRING
152 "A list of parameters to run the Lit test suite with.")
154 # Benchmark options -----------------------------------------------------------
155 option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
157 set(LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT --benchmark_min_time=0.01)
158 set(LIBCXX_BENCHMARK_TEST_ARGS "${LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT}" CACHE STRING
159 "Arguments to pass when running the benchmarks using check-cxx-benchmarks")
161 set(LIBCXX_BENCHMARK_NATIVE_STDLIB "" CACHE STRING
162 "Build the benchmarks against the specified native STL.
163 The value must be one of libc++/libstdc++")
164 set(LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN "" CACHE STRING
165 "Use alternate GCC toolchain when building the native benchmarks")
167 if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
168 if (NOT (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++"
169 OR LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++"))
170 message(FATAL_ERROR "Invalid value for LIBCXX_BENCHMARK_NATIVE_STDLIB: "
171 "'${LIBCXX_BENCHMARK_NATIVE_STDLIB}'")
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 cmake_dependent_option(LIBCXX_INSTALL_STATIC_LIBRARY
181 "Install the static libc++ library." ON
182 "LIBCXX_ENABLE_STATIC;LIBCXX_INSTALL_LIBRARY" OFF)
183 cmake_dependent_option(LIBCXX_INSTALL_SHARED_LIBRARY
184 "Install the shared libc++ library." ON
185 "LIBCXX_ENABLE_SHARED;LIBCXX_INSTALL_LIBRARY" OFF)
187 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)
188 if (LIBCXX_ABI_UNSTABLE)
193 set(LIBCXX_ABI_VERSION "${abi_version}" CACHE STRING
194 "ABI version of libc++. Can be either 1 or 2, where 2 is currently the unstable ABI.
195 Defaults to 1 unless LIBCXX_ABI_UNSTABLE is specified, in which case this is 2.")
196 set(LIBCXX_LIBRARY_VERSION "${LIBCXX_ABI_VERSION}.0" CACHE STRING
197 "Version of libc++. This will be reflected in the name of the shared library produced.
198 For example, -DLIBCXX_LIBRARY_VERSION=x.y will result in the library being named
199 libc++.x.y.dylib, along with the usual symlinks pointing to that. On Apple platforms,
200 this also controls the linker's 'current_version' property.")
201 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.")
202 if (NOT LIBCXX_ABI_NAMESPACE MATCHES "__.*")
203 message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE must be a reserved identifier, got '${LIBCXX_ABI_NAMESPACE}'.")
205 option(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the Itanium ABI.")
206 option(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of the Microsoft ABI.")
208 set(LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION "default" CACHE STRING
209 "Override the implementation to use for comparing typeinfos. By default, this
210 is detected automatically by the library, but this option allows overriding
211 which implementation is used unconditionally.
213 See the documentation in <libcxx/include/typeinfo> for details on what each
215 set(TYPEINFO_COMPARISON_VALUES "default;1;2;3")
216 if (NOT ("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" IN_LIST TYPEINFO_COMPARISON_VALUES))
217 message(FATAL_ERROR "Value '${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}' is not a valid value for
218 LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION")
221 set(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI macros to define in the site config header.")
222 set(LIBCXX_EXTRA_SITE_DEFINES "" CACHE STRING "Extra defines to add into __config_site")
223 option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
225 # ABI Library options ---------------------------------------------------------
227 set(LIBCXX_DEFAULT_ABI_LIBRARY "vcruntime")
228 elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
229 set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxrt")
231 set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxabi")
234 set(LIBCXX_SUPPORTED_ABI_LIBRARIES none libcxxabi system-libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
235 set(LIBCXX_CXX_ABI "${LIBCXX_DEFAULT_ABI_LIBRARY}" CACHE STRING "Specify C++ ABI library to use. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
236 if (NOT "${LIBCXX_CXX_ABI}" IN_LIST LIBCXX_SUPPORTED_ABI_LIBRARIES)
237 message(FATAL_ERROR "Unsupported C++ ABI library: '${LIBCXX_CXX_ABI}'. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
240 option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY
241 "Use a static copy of the ABI library when linking libc++.
242 This option cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT." OFF)
244 option(LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY
245 "Statically link the ABI library to static library"
246 ${LIBCXX_ENABLE_STATIC_ABI_LIBRARY})
248 option(LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
249 "Statically link the ABI library to shared library"
250 ${LIBCXX_ENABLE_STATIC_ABI_LIBRARY})
252 # Generate and install a linker script inplace of libc++.so. The linker script
253 # will link libc++ to the correct ABI library. This option is on by default
254 # on UNIX platforms other than Apple, and on the Fuchsia platform unless we
255 # statically link libc++abi inside libc++.so, we don't build libc++.so at all
256 # or we don't have any ABI library.
257 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
258 OR NOT LIBCXX_ENABLE_SHARED
259 OR LIBCXX_CXX_ABI STREQUAL "none")
260 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
261 elseif((UNIX OR FUCHSIA) AND NOT APPLE)
262 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
264 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
266 option(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
267 "Use and install a linker script for the given ABI library"
268 ${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
270 option(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
271 "Build libc++ with definitions for operator new/delete. These are normally
272 defined in libc++abi, but this option can be used to define them in libc++
273 instead. If you define them in libc++, make sure they are NOT defined in
274 libc++abi. Doing otherwise is an ODR violation." OFF)
275 # Build libc++abi with libunwind. We need this option to determine whether to
276 # link with libunwind or libgcc_s while running the test cases.
277 option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." ON)
279 # Target options --------------------------------------------------------------
280 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})
281 if (LIBCXX_BUILD_32_BITS)
282 message(FATAL_ERROR "LIBCXX_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")
285 # Feature options -------------------------------------------------------------
286 option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
287 option(LIBCXX_ENABLE_RTTI
288 "Use runtime type information.
289 This option may only be set to OFF when LIBCXX_ENABLE_EXCEPTIONS=OFF." ON)
290 option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
291 option(LIBCXX_ENABLE_MONOTONIC_CLOCK
292 "Build libc++ with support for a monotonic clock.
293 This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
294 option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
295 option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
296 option(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
297 option(LIBCXX_HAS_EXTERNAL_THREAD_API
298 "Build libc++ with an externalized threading API.
299 This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
301 if (LIBCXX_ENABLE_THREADS)
302 set(LIBCXX_PSTL_CPU_BACKEND "std_thread" CACHE STRING "Which PSTL CPU backend to use")
304 set(LIBCXX_PSTL_CPU_BACKEND "serial" CACHE STRING "Which PSTL CPU backend to use")
307 # Misc options ----------------------------------------------------------------
308 # FIXME: Turn -pedantic back ON. It is currently off because it warns
309 # about #include_next which is used everywhere.
310 option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
311 option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
313 option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
314 set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
315 "The Profile-rt library used to build with code coverage")
317 set(LIBCXX_CONFIGURE_IDE_DEFAULT OFF)
318 if (XCODE OR MSVC_IDE)
319 set(LIBCXX_CONFIGURE_IDE_DEFAULT ON)
321 option(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE"
322 ${LIBCXX_CONFIGURE_IDE_DEFAULT})
324 set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT OFF)
326 set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT ON)
328 option(LIBCXX_HERMETIC_STATIC_LIBRARY
329 "Do not export any symbols from the static library." ${LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT})
331 #===============================================================================
332 # Check option configurations
333 #===============================================================================
335 # Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when
336 # LIBCXX_ENABLE_THREADS is on.
337 if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
338 message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF"
339 " when LIBCXX_ENABLE_THREADS is also set to OFF.")
342 if(NOT LIBCXX_ENABLE_THREADS)
343 if(LIBCXX_HAS_PTHREAD_API)
344 message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
345 " when LIBCXX_ENABLE_THREADS is also set to ON.")
347 if(LIBCXX_HAS_EXTERNAL_THREAD_API)
348 message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
349 " when LIBCXX_ENABLE_THREADS is also set to ON.")
351 if (LIBCXX_HAS_WIN32_THREAD_API)
352 message(FATAL_ERROR "LIBCXX_HAS_WIN32_THREAD_API can only be set to ON"
353 " when LIBCXX_ENABLE_THREADS is also set to ON.")
358 if (LIBCXX_HAS_EXTERNAL_THREAD_API)
359 if (LIBCXX_HAS_PTHREAD_API)
360 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
361 " and LIBCXX_HAS_PTHREAD_API cannot be both"
362 " set to ON at the same time.")
364 if (LIBCXX_HAS_WIN32_THREAD_API)
365 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
366 " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
367 " set to ON at the same time.")
371 if (LIBCXX_HAS_PTHREAD_API)
372 if (LIBCXX_HAS_WIN32_THREAD_API)
373 message(FATAL_ERROR "The options LIBCXX_HAS_PTHREAD_API"
374 " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
375 " set to ON at the same time.")
379 if (NOT LIBCXX_ENABLE_RTTI AND LIBCXX_ENABLE_EXCEPTIONS)
380 message(FATAL_ERROR "Libc++ cannot be built with exceptions enabled but RTTI"
381 " disabled, since that configuration is broken. See"
382 " https://github.com/llvm/llvm-project/issues/66117"
386 # Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
388 if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
389 message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
392 if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
394 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
396 if (NOT LIBCXX_ENABLE_SHARED)
397 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
401 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
402 message(FATAL_ERROR "Conflicting options given.
403 LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY cannot be specified with
404 LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
407 if (LIBCXX_ABI_FORCE_ITANIUM AND LIBCXX_ABI_FORCE_MICROSOFT)
408 message(FATAL_ERROR "Only one of LIBCXX_ABI_FORCE_ITANIUM and LIBCXX_ABI_FORCE_MICROSOFT can be specified.")
411 if (LIBCXX_ENABLE_SHARED AND CMAKE_MSVC_RUNTIME_LIBRARY AND
412 (NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$"))
413 message(WARNING "A static CRT linked into a shared libc++ doesn't work correctly.")
416 #===============================================================================
418 #===============================================================================
420 # TODO: Projects that depend on libc++ should use LIBCXX_GENERATED_INCLUDE_DIR
421 # instead of hard-coding include/c++/v1.
423 set(LIBCXX_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE STRING
424 "Path where target-agnostic libc++ headers should be installed.")
425 set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING
426 "Path where built libc++ runtime libraries should be installed.")
428 set(LIBCXX_SHARED_OUTPUT_NAME "c++" CACHE STRING "Output name for the shared libc++ runtime library.")
429 set(LIBCXX_STATIC_OUTPUT_NAME "c++" CACHE STRING "Output name for the static libc++ runtime library.")
431 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
432 set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
433 set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
434 set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1")
435 set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
436 set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE STRING
437 "Path where built libc++ libraries should be installed.")
438 set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE STRING
439 "Path where target-specific libc++ headers should be installed.")
440 if(LIBCXX_LIBDIR_SUBDIR)
441 string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
442 string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
445 if(LLVM_LIBRARY_OUTPUT_INTDIR)
446 set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
447 set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
448 set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1")
450 set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
451 set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
452 set(LIBCXX_GENERATED_MODULE_DIR "${CMAKE_BINARY_DIR}/modules/c++/v1")
454 set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
455 set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE STRING
456 "Path where built libc++ libraries should be installed.")
457 set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE STRING
458 "Path where target-specific libc++ headers should be installed.")
461 file(MAKE_DIRECTORY "${LIBCXX_BINARY_INCLUDE_DIR}")
463 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
464 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
465 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
467 # Declare libc++ configuration variables.
468 # They are intended for use as follows:
469 # LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
470 # LIBCXX_COMPILE_FLAGS: Compile only flags.
471 # LIBCXX_LINK_FLAGS: Linker only flags.
472 # LIBCXX_LIBRARIES: libraries libc++ is linked to.
473 set(LIBCXX_COMPILE_FLAGS "")
474 set(LIBCXX_LINK_FLAGS "")
475 set(LIBCXX_LIBRARIES "")
476 set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "" CACHE STRING
477 "Additional Compile only flags which can be provided in cache")
478 set(LIBCXX_ADDITIONAL_LIBRARIES "" CACHE STRING
479 "Additional libraries libc++ is linked to which can be provided in cache")
481 # Include macros for adding and removing libc++ flags.
482 include(HandleLibcxxFlags)
484 # Target flags ================================================================
485 # These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that
486 # 'config-ix' use them during feature checks. It also adds them to both
487 # 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS'
489 if (${CMAKE_SYSTEM_NAME} MATCHES "AIX")
490 add_flags_if_supported("-mdefault-visibility-export-mapping=explicit")
491 set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF)
494 # Configure compiler.
497 # Configure coverage options.
498 if (LIBCXX_GENERATE_COVERAGE)
499 include(CodeCoverage)
500 set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE)
503 #===============================================================================
504 # Setup Compiler Flags
505 #===============================================================================
507 include(HandleLibCXXABI) # Setup the ABI library flags
509 # FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
510 # Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
511 # so they don't get transformed into -Wno and -errors respectively.
512 remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
514 # Required flags ==============================================================
515 function(cxx_add_basic_build_flags target)
517 # Use C++23 for all targets.
518 set_target_properties(${target} PROPERTIES
520 CXX_STANDARD_REQUIRED OFF # TODO: Make this REQUIRED once we don't need to accommodate the LLVM documentation builders using an ancient CMake
523 # When building the dylib, don't warn for unavailable aligned allocation
524 # functions based on the deployment target -- they are always available
525 # because they are provided by the dylib itself with the exception of z/OS.
527 target_add_compile_flags_if_supported(${target} PRIVATE -fno-aligned-allocation)
529 target_add_compile_flags_if_supported(${target} PRIVATE -faligned-allocation)
532 # On all systems the system c++ standard library headers need to be excluded.
533 # MSVC only has -X, which disables all default includes; including the crt.
534 # Thus, we do nothing and hope we don't accidentally include any of the C++
536 target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++)
538 # Hide all inline function definitions which have not explicitly been marked
539 # visible. This prevents new definitions for inline functions from appearing in
540 # the dylib when get ODR used by another function.
541 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden)
543 # Our visibility annotations are not quite right for non-Clang compilers,
544 # so we end up not exporting all the symbols we should. In the future, we
545 # can improve the situation by providing an explicit list of exported
546 # symbols on all compilers.
547 if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
548 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden)
551 # Let the library headers know they are currently being used to build the
553 target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY)
555 # Make sure the library can be build without transitive includes. This makes
556 # it easier to upgrade the library to a newer language standard without build
558 target_compile_definitions(${target} PRIVATE -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
560 if (C_SUPPORTS_COMMENT_LIB_PRAGMA)
561 if (LIBCXX_HAS_PTHREAD_LIB)
562 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_PTHREAD_LIB)
564 if (LIBCXX_HAS_RT_LIB)
565 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
568 target_compile_options(${target} PUBLIC "${LIBCXX_ADDITIONAL_COMPILE_FLAGS}")
571 # Exception flags =============================================================
572 function(cxx_add_exception_flags target)
573 if (LIBCXX_ENABLE_EXCEPTIONS)
574 # Catches C++ exceptions only and tells the compiler to assume that extern C
575 # functions never throw a C++ exception.
576 target_add_compile_flags_if_supported(${target} PUBLIC -EHsc)
578 target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
579 target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
583 # RTTI flags ==================================================================
584 function(cxx_add_rtti_flags target)
585 if (NOT LIBCXX_ENABLE_RTTI)
587 target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
589 target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
594 # Modules flags ===============================================================
595 # FIXME The libc++ sources are fundamentally non-modular. They need special
596 # versions of the headers in order to provide C++03 and legacy ABI definitions.
597 # NOTE: The public headers can be used with modules in all other contexts.
598 function(cxx_add_module_flags target)
599 if (LLVM_ENABLE_MODULES)
600 # Ignore that the rest of the modules flags are now unused.
601 target_add_compile_flags_if_supported(${target} PUBLIC -Wno-unused-command-line-argument)
602 target_compile_options(${target} PUBLIC -fno-modules)
606 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
608 # Sanitizer flags =============================================================
610 function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
612 set(USE_SANITIZER "${USE_SANITIZER}")
613 # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
614 # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
615 if (USE_SANITIZER AND NOT MSVC)
616 append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
617 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
619 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
620 NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
621 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
623 if (USE_SANITIZER STREQUAL "Address")
624 append_flags(SANITIZER_FLAGS "-fsanitize=address")
625 elseif (USE_SANITIZER STREQUAL "HWAddress")
626 append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
627 elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
628 append_flags(SANITIZER_FLAGS -fsanitize=memory)
629 if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
630 append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
632 elseif (USE_SANITIZER STREQUAL "Undefined")
633 append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
634 elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
635 USE_SANITIZER STREQUAL "Undefined;Address")
636 append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
637 elseif (USE_SANITIZER STREQUAL "Thread")
638 append_flags(SANITIZER_FLAGS -fsanitize=thread)
639 elseif (USE_SANITIZER STREQUAL "DataFlow")
640 append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
642 message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
644 elseif(USE_SANITIZER AND MSVC)
645 message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
647 set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
650 get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
651 add_library(cxx-sanitizer-flags INTERFACE)
652 target_compile_options(cxx-sanitizer-flags INTERFACE ${SANITIZER_FLAGS})
654 # _LIBCPP_INSTRUMENTED_WITH_ASAN informs that library was built with ASan.
655 # Defining _LIBCPP_INSTRUMENTED_WITH_ASAN while building the library with ASan is required.
656 # Normally, the _LIBCPP_INSTRUMENTED_WITH_ASAN flag is used to keep information whether
657 # dylibs are built with AddressSanitizer. However, when building libc++,
658 # this flag needs to be defined so that the resulting dylib has all ASan functionalities guarded by this flag.
659 # If the _LIBCPP_INSTRUMENTED_WITH_ASAN flag is not defined, then parts of the ASan instrumentation code in libc++
660 # will not be compiled into it, resulting in false positives.
661 # For context, read: https://github.com/llvm/llvm-project/pull/72677#pullrequestreview-1765402800
662 string(FIND "${LLVM_USE_SANITIZER}" "Address" building_with_asan)
663 if (NOT "${building_with_asan}" STREQUAL "-1")
664 config_define(ON _LIBCPP_INSTRUMENTED_WITH_ASAN)
667 # Link system libraries =======================================================
668 function(cxx_link_system_libraries target)
670 target_link_libraries(${target} PRIVATE "-nostdlib++")
673 if (CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER)
674 # If we're linking directly against the libunwind that we're building
675 # in the same invocation, don't try to link in the toolchain's
676 # default libunwind (which may be missing still).
677 target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
681 if (LIBCXX_USE_COMPILER_RT)
682 find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
683 if (LIBCXX_BUILTINS_LIBRARY)
684 target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}")
686 elseif (LIBCXX_HAS_GCC_LIB)
687 target_link_libraries(${target} PRIVATE gcc)
688 elseif (LIBCXX_HAS_GCC_S_LIB)
689 target_link_libraries(${target} PRIVATE gcc_s)
693 if (LIBCXX_HAS_ATOMIC_LIB)
694 target_link_libraries(${target} PRIVATE atomic)
698 target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
702 if ((NOT CMAKE_MSVC_RUNTIME_LIBRARY AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
703 OR (CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug"))
709 if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
710 set(CRT_LIB "msvcrt")
711 set(CXX_LIB "msvcprt")
713 set(CRT_LIB "libcmt")
714 set(CXX_LIB "libcpmt")
717 target_link_libraries(${target} PRIVATE ${CRT_LIB}${LIB_SUFFIX}) # C runtime startup files
718 target_link_libraries(${target} PRIVATE ${CXX_LIB}${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals.
719 # Required for standards-complaint wide character formatting functions
720 # (e.g. `printfw`/`scanfw`)
721 target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers)
724 if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21)
725 target_link_libraries(${target} PUBLIC android_support)
727 target_link_libraries(${target} PUBLIC "${LIBCXX_ADDITIONAL_LIBRARIES}")
730 # Windows-related flags =======================================================
731 function(cxx_add_windows_flags target)
732 if(WIN32 AND NOT MINGW)
733 target_compile_definitions(${target} PRIVATE
734 # Ignore the -MSC_VER mismatch, as we may build
735 # with a different compatibility version.
736 _ALLOW_MSC_VER_MISMATCH
737 # Don't check the msvcprt iterator debug levels
738 # as we will define the iterator types; libc++
739 # uses a different macro to identify the debug
741 _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
742 # We are building the c++ runtime, don't pull in
745 # Don't warn on the use of "deprecated"
746 # "insecure" functions which are standards
748 _CRT_SECURE_NO_WARNINGS
749 # Use the ISO conforming behaviour for conversion
751 _CRT_STDIO_ISO_WIDE_SPECIFIERS)
755 # Configuration file flags =====================================================
756 config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
757 config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
758 config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
759 config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
760 config_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
761 config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
762 if (NOT LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION STREQUAL "default")
763 config_define("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION)
765 config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD)
766 config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL)
767 config_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32)
768 config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
769 config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
770 config_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM)
771 config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
772 config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
773 config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE)
774 config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS)
775 config_define_if_not(LIBCXX_ENABLE_STD_MODULES _LIBCPP_HAS_NO_STD_MODULES)
776 config_define_if_not(LIBCXX_ENABLE_TIME_ZONE_DATABASE _LIBCPP_HAS_NO_TIME_ZONE_DATABASE)
777 config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
779 # TODO(LLVM 19): Produce a deprecation warning.
780 if (LIBCXX_ENABLE_ASSERTIONS)
781 set(LIBCXX_HARDENING_MODE "extensive")
783 if (LIBCXX_HARDENING_MODE STREQUAL "none")
784 config_define(2 _LIBCPP_HARDENING_MODE_DEFAULT)
785 elseif (LIBCXX_HARDENING_MODE STREQUAL "fast")
786 config_define(4 _LIBCPP_HARDENING_MODE_DEFAULT)
787 elseif (LIBCXX_HARDENING_MODE STREQUAL "extensive")
788 config_define(16 _LIBCPP_HARDENING_MODE_DEFAULT)
789 elseif (LIBCXX_HARDENING_MODE STREQUAL "debug")
790 config_define(8 _LIBCPP_HARDENING_MODE_DEFAULT)
793 if (LIBCXX_PSTL_CPU_BACKEND STREQUAL "serial")
794 config_define(1 _LIBCPP_PSTL_CPU_BACKEND_SERIAL)
795 elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "std_thread")
796 config_define(1 _LIBCPP_PSTL_CPU_BACKEND_THREAD)
797 elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "libdispatch")
798 config_define(1 _LIBCPP_PSTL_CPU_BACKEND_LIBDISPATCH)
800 message(FATAL_ERROR "LIBCXX_PSTL_CPU_BACKEND is set to ${LIBCXX_PSTL_CPU_BACKEND}, which is not a valid backend.
801 Valid backends are: serial, std_thread and libdispatch")
804 if (LIBCXX_ABI_DEFINES)
806 foreach (abi_define ${LIBCXX_ABI_DEFINES})
807 if (NOT abi_define MATCHES "^_LIBCPP_ABI_")
808 message(SEND_ERROR "Invalid ABI macro ${abi_define} in LIBCXX_ABI_DEFINES")
810 list(APPEND abi_defines "#define ${abi_define}")
812 string(REPLACE ";" "\n" abi_defines "${abi_defines}")
813 config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
816 if (LIBCXX_EXTRA_SITE_DEFINES)
817 set(extra_site_defines)
818 foreach (extra_site_define ${LIBCXX_EXTRA_SITE_DEFINES})
819 # Allow defines such as DEFINE=VAL, transformed into "#define DEFINE VAL".
820 string(REPLACE "=" " " extra_site_define "${extra_site_define}")
821 list(APPEND extra_site_defines "#define ${extra_site_define}")
823 string(REPLACE ";" "\n" extra_site_defines "${extra_site_defines}")
824 config_define(${extra_site_defines} _LIBCPP_EXTRA_SITE_DEFINES)
827 # By default libc++ on Windows expects to use a shared library, which requires
828 # the headers to use DLL import/export semantics. However when building a
829 # static library only we modify the headers to disable DLL import/export.
830 if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
831 message(STATUS "Generating custom __config for non-DLL Windows build")
832 config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
835 if (WIN32 AND LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
836 # If linking libcxxabi statically into libcxx, skip the dllimport attributes
837 # on symbols we refer to from libcxxabi.
838 add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
841 # Setup all common build flags =================================================
842 function(cxx_add_common_build_flags target)
843 cxx_add_basic_build_flags(${target})
844 cxx_add_warning_flags(${target} ${LIBCXX_ENABLE_WERROR} ${LIBCXX_ENABLE_PEDANTIC})
845 cxx_add_windows_flags(${target})
846 cxx_add_exception_flags(${target})
847 cxx_add_rtti_flags(${target})
848 cxx_add_module_flags(${target})
849 cxx_link_system_libraries(${target})
850 target_link_libraries(${target} PRIVATE cxx-sanitizer-flags)
853 #===============================================================================
854 # Setup Source Code And Tests
855 #===============================================================================
856 add_subdirectory(include)
857 add_subdirectory(src)
858 add_subdirectory(utils)
859 if (LIBCXX_ENABLE_STD_MODULES)
860 add_subdirectory(modules)
863 set(LIBCXX_TEST_DEPS "cxx_experimental")
865 if (LIBCXX_ENABLE_CLANG_TIDY)
866 list(APPEND LIBCXX_TEST_DEPS cxx-tidy)
869 if (LIBCXX_ENABLE_STD_MODULES)
870 list(APPEND LIBCXX_TEST_DEPS generate-cxx-modules generate-test-module-std)
873 if (LIBCXX_INCLUDE_BENCHMARKS)
874 add_subdirectory(benchmarks)
877 if (LIBCXX_INCLUDE_TESTS)
878 add_subdirectory(test)
879 add_subdirectory(lib/abi)
882 if (LIBCXX_INCLUDE_DOCS)
883 add_subdirectory(docs)