[Flang][HLFIR] : Use the attributes from the ultimate symbol (#71195)
[llvm-project.git] / libcxx / CMakeLists.txt
blobde7fa8e3be31a8a12419ed6387793b0c2127c188
1 # See https://libcxx.llvm.org/docs/BuildingLibcxx.html for instructions on how
2 # to build libcxx with CMake.
4 #===============================================================================
5 # Setup Project
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"
18   )
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)
27 include(WarningFlags)
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."
34  )
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)
38 endif()
40 if (MSVC)
41   message(STATUS "Configuring for MSVC")
42 endif()
44 #===============================================================================
45 # Setup CMake Options
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 unchecked hardened safe debug)
63 set(LIBCXX_HARDENING_MODE "unchecked" 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)
69   message(FATAL_ERROR
70     "Unsupported hardening mode: '${LIBCXX_HARDENING_MODE}'. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
71 endif()
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
77    will not." ON)
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.
87    embedded)." ON)
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
101 # database.
102 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
103   set(ENABLE_TIME_ZONE_DATABASE_DEFAULT ON)
104 else()
105   set(ENABLE_TIME_ZONE_DATABASE_DEFAULT OFF)
106 endif()
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")
129 elseif(MINGW)
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")
134   else()
135     set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static-clangcl.cfg.in")
136   endif()
137 else()
138   if (LIBCXX_ENABLE_SHARED)
139     set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared.cfg.in")
140   else()
141     set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static.cfg.in")
142   endif()
143 endif()
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}")
149 endif()
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}'")
172   endif()
173 endif()
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)
189   set(abi_version "2")
190 else()
191   set(abi_version "1")
192 endif()
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}'.")
204 endif()
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
214    value means.")
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")
219 endif()
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 ---------------------------------------------------------
226 if (MSVC)
227   set(LIBCXX_DEFAULT_ABI_LIBRARY "vcruntime")
228 elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
229   set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxrt")
230 else()
231   set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxabi")
232 endif()
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}.")
238 endif()
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 unless
255 # 'LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY' is on. This option is also
256 # disabled when the ABI library is not specified or is specified to be "none".
257 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
258 if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
259       AND NOT LIBCXX_CXX_ABI STREQUAL "none"
260       AND Python3_EXECUTABLE
261       AND LIBCXX_ENABLE_SHARED)
262     set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
263 endif()
265 option(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
266       "Use and install a linker script for the given ABI library"
267       ${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
269 option(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
270   "Build libc++ with definitions for operator new/delete. These are normally
271    defined in libc++abi, but this option can be used to define them in libc++
272    instead. If you define them in libc++, make sure they are NOT defined in
273    libc++abi. Doing otherwise is an ODR violation." OFF)
274 # Build libc++abi with libunwind. We need this option to determine whether to
275 # link with libunwind or libgcc_s while running the test cases.
276 option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
278 # Target options --------------------------------------------------------------
279 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})
280 if (LIBCXX_BUILD_32_BITS)
281   message(FATAL_ERROR "LIBCXX_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")
282 endif()
284 # Feature options -------------------------------------------------------------
285 option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
286 option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
287 option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
288 option(LIBCXX_ENABLE_MONOTONIC_CLOCK
289   "Build libc++ with support for a monotonic clock.
290    This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
291 option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
292 option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
293 option(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
294 option(LIBCXX_HAS_EXTERNAL_THREAD_API
295   "Build libc++ with an externalized threading API.
296    This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
298 if (LIBCXX_ENABLE_THREADS)
299   set(LIBCXX_PSTL_CPU_BACKEND "std_thread" CACHE STRING "Which PSTL CPU backend to use")
300 else()
301   set(LIBCXX_PSTL_CPU_BACKEND "serial" CACHE STRING "Which PSTL CPU backend to use")
302 endif()
304 # Misc options ----------------------------------------------------------------
305 # FIXME: Turn -pedantic back ON. It is currently off because it warns
306 # about #include_next which is used everywhere.
307 option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
308 option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
310 option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
311 set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
312     "The Profile-rt library used to build with code coverage")
314 set(LIBCXX_CONFIGURE_IDE_DEFAULT OFF)
315 if (XCODE OR MSVC_IDE)
316   set(LIBCXX_CONFIGURE_IDE_DEFAULT ON)
317 endif()
318 option(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE"
319       ${LIBCXX_CONFIGURE_IDE_DEFAULT})
321 set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT OFF)
322 if (WIN32)
323   set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT ON)
324 endif()
325 option(LIBCXX_HERMETIC_STATIC_LIBRARY
326   "Do not export any symbols from the static library." ${LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT})
328 #===============================================================================
329 # Check option configurations
330 #===============================================================================
332 # Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when
333 # LIBCXX_ENABLE_THREADS is on.
334 if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
335   message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF"
336                       " when LIBCXX_ENABLE_THREADS is also set to OFF.")
337 endif()
339 if(NOT LIBCXX_ENABLE_THREADS)
340   if(LIBCXX_HAS_PTHREAD_API)
341     message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
342                         " when LIBCXX_ENABLE_THREADS is also set to ON.")
343   endif()
344   if(LIBCXX_HAS_EXTERNAL_THREAD_API)
345     message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
346                         " when LIBCXX_ENABLE_THREADS is also set to ON.")
347   endif()
348   if (LIBCXX_HAS_WIN32_THREAD_API)
349     message(FATAL_ERROR "LIBCXX_HAS_WIN32_THREAD_API can only be set to ON"
350                         " when LIBCXX_ENABLE_THREADS is also set to ON.")
351   endif()
353 endif()
355 if (LIBCXX_HAS_EXTERNAL_THREAD_API)
356   if (LIBCXX_HAS_PTHREAD_API)
357     message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
358                         " and LIBCXX_HAS_PTHREAD_API cannot be both"
359                         " set to ON at the same time.")
360   endif()
361   if (LIBCXX_HAS_WIN32_THREAD_API)
362     message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
363                         " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
364                         " set to ON at the same time.")
365   endif()
366 endif()
368 if (LIBCXX_HAS_PTHREAD_API)
369   if (LIBCXX_HAS_WIN32_THREAD_API)
370     message(FATAL_ERROR "The options LIBCXX_HAS_PTHREAD_API"
371                         " and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
372                         " set to ON at the same time.")
373   endif()
374 endif()
376 # Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
377 # is ON.
378 if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
379   message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
380 endif()
382 if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
383     if (APPLE)
384       message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
385     endif()
386     if (NOT LIBCXX_ENABLE_SHARED)
387       message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
388     endif()
389 endif()
391 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
392     message(FATAL_ERROR "Conflicting options given.
393         LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY cannot be specified with
394         LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
395 endif()
397 if (LIBCXX_ABI_FORCE_ITANIUM AND LIBCXX_ABI_FORCE_MICROSOFT)
398   message(FATAL_ERROR "Only one of LIBCXX_ABI_FORCE_ITANIUM and LIBCXX_ABI_FORCE_MICROSOFT can be specified.")
399 endif ()
401 if (LIBCXX_ENABLE_SHARED AND CMAKE_MSVC_RUNTIME_LIBRARY AND
402     (NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$"))
403   message(WARNING "A static CRT linked into a shared libc++ doesn't work correctly.")
404 endif()
406 #===============================================================================
407 # Configure System
408 #===============================================================================
410 # TODO: Projects that depend on libc++ should use LIBCXX_GENERATED_INCLUDE_DIR
411 # instead of hard-coding include/c++/v1.
413 set(LIBCXX_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE STRING
414     "Path where target-agnostic libc++ headers should be installed.")
415 set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING
416     "Path where built libc++ runtime libraries should be installed.")
418 set(LIBCXX_SHARED_OUTPUT_NAME "c++" CACHE STRING "Output name for the shared libc++ runtime library.")
419 set(LIBCXX_STATIC_OUTPUT_NAME "c++" CACHE STRING "Output name for the static libc++ runtime library.")
421 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
422   set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
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/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
426   set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE STRING
427       "Path where built libc++ libraries should be installed.")
428   set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE STRING
429       "Path where target-specific libc++ headers should be installed.")
430   if(LIBCXX_LIBDIR_SUBDIR)
431     string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
432     string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
433   endif()
434 else()
435   if(LLVM_LIBRARY_OUTPUT_INTDIR)
436     set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
437     set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
438     set(LIBCXX_GENERATED_MODULE_DIR "${LLVM_BINARY_DIR}/modules/c++/v1")
439   else()
440     set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
441     set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
442     set(LIBCXX_GENERATED_MODULE_DIR "${CMAKE_BINARY_DIR}/modules/c++/v1")
443   endif()
444   set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
445   set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE STRING
446       "Path where built libc++ libraries should be installed.")
447   set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE STRING
448       "Path where target-specific libc++ headers should be installed.")
449 endif()
451 file(MAKE_DIRECTORY "${LIBCXX_BINARY_INCLUDE_DIR}")
453 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
454 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
455 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
457 # Declare libc++ configuration variables.
458 # They are intended for use as follows:
459 # LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
460 # LIBCXX_COMPILE_FLAGS: Compile only flags.
461 # LIBCXX_LINK_FLAGS: Linker only flags.
462 # LIBCXX_LIBRARIES: libraries libc++ is linked to.
463 set(LIBCXX_COMPILE_FLAGS "")
464 set(LIBCXX_LINK_FLAGS "")
465 set(LIBCXX_LIBRARIES "")
466 set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "" CACHE STRING
467     "Additional Compile only flags which can be provided in cache")
468 set(LIBCXX_ADDITIONAL_LIBRARIES "" CACHE STRING
469     "Additional libraries libc++ is linked to which can be provided in cache")
471 # Include macros for adding and removing libc++ flags.
472 include(HandleLibcxxFlags)
474 # Target flags ================================================================
475 # These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that
476 # 'config-ix' use them during feature checks. It also adds them to both
477 # 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS'
479 if (${CMAKE_SYSTEM_NAME} MATCHES "AIX")
480   add_flags_if_supported("-mdefault-visibility-export-mapping=explicit")
481   set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF)
482 endif()
484 # Configure compiler.
485 include(config-ix)
487 # Configure coverage options.
488 if (LIBCXX_GENERATE_COVERAGE)
489   include(CodeCoverage)
490   set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE)
491 endif()
493 #===============================================================================
494 # Setup Compiler Flags
495 #===============================================================================
497 include(HandleLibCXXABI) # Setup the ABI library flags
499 # FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
500 # Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
501 # so they don't get transformed into -Wno and -errors respectively.
502 remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
504 # Required flags ==============================================================
505 function(cxx_add_basic_build_flags target)
507   # Use C++23 for all targets.
508   set_target_properties(${target} PROPERTIES
509     CXX_STANDARD 23
510     CXX_STANDARD_REQUIRED OFF
511     CXX_EXTENSIONS NO)
513   # When building the dylib, don't warn for unavailable aligned allocation
514   # functions based on the deployment target -- they are always available
515   # because they are provided by the dylib itself with the exception of z/OS.
516   if (ZOS)
517     target_add_compile_flags_if_supported(${target} PRIVATE -fno-aligned-allocation)
518   else()
519     target_add_compile_flags_if_supported(${target} PRIVATE -faligned-allocation)
520   endif()
522   # On all systems the system c++ standard library headers need to be excluded.
523   # MSVC only has -X, which disables all default includes; including the crt.
524   # Thus, we do nothing and hope we don't accidentally include any of the C++
525   # headers
526   target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++)
528   # Hide all inline function definitions which have not explicitly been marked
529   # visible. This prevents new definitions for inline functions from appearing in
530   # the dylib when get ODR used by another function.
531   target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden)
533   # Our visibility annotations are not quite right for non-Clang compilers,
534   # so we end up not exporting all the symbols we should. In the future, we
535   # can improve the situation by providing an explicit list of exported
536   # symbols on all compilers.
537   if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
538     target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden)
539   endif()
541   # Let the library headers know they are currently being used to build the
542   # library.
543   target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY)
545   # Make sure the library can be build without transitive includes. This makes
546   # it easier to upgrade the library to a newer language standard without build
547   # errors.
548   target_compile_definitions(${target} PRIVATE -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
550   if (C_SUPPORTS_COMMENT_LIB_PRAGMA)
551     if (LIBCXX_HAS_PTHREAD_LIB)
552       target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_PTHREAD_LIB)
553     endif()
554     if (LIBCXX_HAS_RT_LIB)
555       target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
556     endif()
557   endif()
558   target_compile_options(${target} PUBLIC "${LIBCXX_ADDITIONAL_COMPILE_FLAGS}")
559 endfunction()
561 # Exception flags =============================================================
562 function(cxx_add_exception_flags target)
563   if (LIBCXX_ENABLE_EXCEPTIONS)
564     # Catches C++ exceptions only and tells the compiler to assume that extern C
565     # functions never throw a C++ exception.
566     target_add_compile_flags_if_supported(${target} PUBLIC -EHsc)
567   else()
568     target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
569     target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
570   endif()
571 endfunction()
573 # RTTI flags ==================================================================
574 function(cxx_add_rtti_flags target)
575   if (NOT LIBCXX_ENABLE_RTTI)
576     if (MSVC)
577       target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
578     else()
579       target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
580     endif()
581   endif()
582 endfunction()
584 # Modules flags ===============================================================
585 # FIXME The libc++ sources are fundamentally non-modular. They need special
586 # versions of the headers in order to provide C++03 and legacy ABI definitions.
587 # NOTE: The public headers can be used with modules in all other contexts.
588 function(cxx_add_module_flags target)
589   if (LLVM_ENABLE_MODULES)
590     # Ignore that the rest of the modules flags are now unused.
591     target_add_compile_flags_if_supported(${target} PUBLIC -Wno-unused-command-line-argument)
592     target_compile_options(${target} PUBLIC -fno-modules)
593   endif()
594 endfunction()
596 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
598 # Sanitizer flags =============================================================
600 function(get_sanitizer_flags OUT_VAR  USE_SANITIZER)
601   set(SANITIZER_FLAGS)
602   set(USE_SANITIZER "${USE_SANITIZER}")
603   # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
604   # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
605   if (USE_SANITIZER AND NOT MSVC)
606     append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
607     append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
609     if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
610             NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
611       append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
612     endif()
613     if (USE_SANITIZER STREQUAL "Address")
614       append_flags(SANITIZER_FLAGS "-fsanitize=address")
615     elseif (USE_SANITIZER STREQUAL "HWAddress")
616       append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
617     elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
618       append_flags(SANITIZER_FLAGS -fsanitize=memory)
619       if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
620         append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
621       endif()
622     elseif (USE_SANITIZER STREQUAL "Undefined")
623       append_flags(SANITIZER_FLAGS "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
624     elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
625             USE_SANITIZER STREQUAL "Undefined;Address")
626       append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
627     elseif (USE_SANITIZER STREQUAL "Thread")
628       append_flags(SANITIZER_FLAGS -fsanitize=thread)
629     elseif (USE_SANITIZER STREQUAL "DataFlow")
630       append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
631     else()
632       message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
633     endif()
634   elseif(USE_SANITIZER AND MSVC)
635     message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
636   endif()
637   set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
638 endfunction()
640 get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
642 # Link system libraries =======================================================
643 function(cxx_link_system_libraries target)
644   if (NOT MSVC)
645     target_link_libraries(${target} PRIVATE "-nostdlib++")
646   endif()
648   if (CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER)
649     # If we're linking directly against the libunwind that we're building
650     # in the same invocation, don't try to link in the toolchain's
651     # default libunwind (which may be missing still).
652     target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
653   endif()
655   if (LIBCXX_USE_COMPILER_RT)
656     find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
657     if (LIBCXX_BUILTINS_LIBRARY)
658       target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}")
659     endif()
660   elseif (LIBCXX_HAS_GCC_LIB)
661     target_link_libraries(${target} PRIVATE gcc)
662   elseif (LIBCXX_HAS_GCC_S_LIB)
663     target_link_libraries(${target} PRIVATE gcc_s)
664   endif()
666   if (LIBCXX_HAS_ATOMIC_LIB)
667     target_link_libraries(${target} PRIVATE atomic)
668   endif()
670   if (MINGW)
671     target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
672   endif()
674   if (MSVC)
675     if ((NOT CMAKE_MSVC_RUNTIME_LIBRARY AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
676         OR (CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug"))
677       set(LIB_SUFFIX "d")
678     else()
679       set(LIB_SUFFIX "")
680     endif()
682     if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
683       set(CRT_LIB "msvcrt")
684       set(CXX_LIB "msvcprt")
685     else()
686       set(CRT_LIB "libcmt")
687       set(CXX_LIB "libcpmt")
688     endif()
690     target_link_libraries(${target} PRIVATE ${CRT_LIB}${LIB_SUFFIX}) # C runtime startup files
691     target_link_libraries(${target} PRIVATE ${CXX_LIB}${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals.
692     # Required for standards-complaint wide character formatting functions
693     # (e.g. `printfw`/`scanfw`)
694     target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers)
695   endif()
697   if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21)
698     target_link_libraries(${target} PUBLIC android_support)
699   endif()
700   target_link_libraries(${target} PUBLIC "${LIBCXX_ADDITIONAL_LIBRARIES}")
701 endfunction()
703 # Windows-related flags =======================================================
704 function(cxx_add_windows_flags target)
705   if(WIN32 AND NOT MINGW)
706     target_compile_definitions(${target} PRIVATE
707                                  # Ignore the -MSC_VER mismatch, as we may build
708                                  # with a different compatibility version.
709                                  _ALLOW_MSC_VER_MISMATCH
710                                  # Don't check the msvcprt iterator debug levels
711                                  # as we will define the iterator types; libc++
712                                  # uses a different macro to identify the debug
713                                  # level.
714                                  _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
715                                  # We are building the c++ runtime, don't pull in
716                                  # msvcprt.
717                                  _CRTBLD
718                                  # Don't warn on the use of "deprecated"
719                                  # "insecure" functions which are standards
720                                  # specified.
721                                  _CRT_SECURE_NO_WARNINGS
722                                  # Use the ISO conforming behaviour for conversion
723                                  # in printf, scanf.
724                                  _CRT_STDIO_ISO_WIDE_SPECIFIERS)
725   endif()
726 endfunction()
728 # Configuration file flags =====================================================
729 config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
730 config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
731 config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
732 config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
733 config_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
734 config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
735 if (NOT LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION STREQUAL "default")
736   config_define("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION)
737 endif()
738 config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD)
739 config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL)
740 config_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32)
741 config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
742 config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
743 config_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM)
744 config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
745 config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
746 config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE)
747 config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS)
748 config_define_if_not(LIBCXX_ENABLE_STD_MODULES _LIBCPP_HAS_NO_STD_MODULES)
749 config_define_if_not(LIBCXX_ENABLE_TIME_ZONE_DATABASE _LIBCPP_HAS_NO_TIME_ZONE_DATABASE)
750 config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
752 # TODO(LLVM 19): Produce a deprecation warning.
753 if (LIBCXX_ENABLE_ASSERTIONS)
754   set(LIBCXX_HARDENING_MODE "safe")
755 endif()
756 if (LIBCXX_HARDENING_MODE STREQUAL "hardened")
757   config_define(1 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT)
758   config_define(0 _LIBCPP_ENABLE_SAFE_MODE_DEFAULT)
759   config_define(0 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT)
760 elseif (LIBCXX_HARDENING_MODE STREQUAL "safe")
761   config_define(0 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT)
762   config_define(1 _LIBCPP_ENABLE_SAFE_MODE_DEFAULT)
763   config_define(0 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT)
764 elseif (LIBCXX_HARDENING_MODE STREQUAL "debug")
765   config_define(0 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT)
766   config_define(0 _LIBCPP_ENABLE_SAFE_MODE_DEFAULT)
767   config_define(1 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT)
768 elseif (LIBCXX_HARDENING_MODE STREQUAL "unchecked")
769   config_define(0 _LIBCPP_ENABLE_HARDENED_MODE_DEFAULT)
770   config_define(0 _LIBCPP_ENABLE_SAFE_MODE_DEFAULT)
771   config_define(0 _LIBCPP_ENABLE_DEBUG_MODE_DEFAULT)
772 endif()
774 if (LIBCXX_PSTL_CPU_BACKEND STREQUAL "serial")
775   config_define(1 _LIBCPP_PSTL_CPU_BACKEND_SERIAL)
776 elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "std_thread")
777   config_define(1 _LIBCPP_PSTL_CPU_BACKEND_THREAD)
778 elseif(LIBCXX_PSTL_CPU_BACKEND STREQUAL "libdispatch")
779   config_define(1 _LIBCPP_PSTL_CPU_BACKEND_LIBDISPATCH)
780 else()
781   message(FATAL_ERROR "LIBCXX_PSTL_CPU_BACKEND is set to ${LIBCXX_PSTL_CPU_BACKEND}, which is not a valid backend.
782                        Valid backends are: serial, std_thread and libdispatch")
783 endif()
785 if (LIBCXX_ABI_DEFINES)
786   set(abi_defines)
787   foreach (abi_define ${LIBCXX_ABI_DEFINES})
788     if (NOT abi_define MATCHES "^_LIBCPP_ABI_")
789       message(SEND_ERROR "Invalid ABI macro ${abi_define} in LIBCXX_ABI_DEFINES")
790     endif()
791     list(APPEND abi_defines "#define ${abi_define}")
792   endforeach()
793   string(REPLACE ";" "\n" abi_defines "${abi_defines}")
794   config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
795 endif()
797 if (LIBCXX_EXTRA_SITE_DEFINES)
798   set(extra_site_defines)
799   foreach (extra_site_define ${LIBCXX_EXTRA_SITE_DEFINES})
800     # Allow defines such as DEFINE=VAL, transformed into "#define DEFINE VAL".
801     string(REPLACE "=" " " extra_site_define "${extra_site_define}")
802     list(APPEND extra_site_defines "#define ${extra_site_define}")
803   endforeach()
804   string(REPLACE ";" "\n" extra_site_defines "${extra_site_defines}")
805   config_define(${extra_site_defines} _LIBCPP_EXTRA_SITE_DEFINES)
806 endif()
808 # By default libc++ on Windows expects to use a shared library, which requires
809 # the headers to use DLL import/export semantics. However when building a
810 # static library only we modify the headers to disable DLL import/export.
811 if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
812   message(STATUS "Generating custom __config for non-DLL Windows build")
813   config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
814 endif()
816 if (WIN32 AND LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
817   # If linking libcxxabi statically into libcxx, skip the dllimport attributes
818   # on symbols we refer to from libcxxabi.
819   add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
820 endif()
822 # Setup all common build flags =================================================
823 function(cxx_add_common_build_flags target)
824   cxx_add_basic_build_flags(${target})
825   cxx_add_warning_flags(${target} ${LIBCXX_ENABLE_WERROR} ${LIBCXX_ENABLE_PEDANTIC})
826   cxx_add_windows_flags(${target})
827   cxx_add_exception_flags(${target})
828   cxx_add_rtti_flags(${target})
829   cxx_add_module_flags(${target})
830   cxx_link_system_libraries(${target})
831 endfunction()
833 #===============================================================================
834 # Setup Source Code And Tests
835 #===============================================================================
836 add_subdirectory(include)
837 add_subdirectory(src)
838 add_subdirectory(utils)
839 if (LIBCXX_ENABLE_STD_MODULES)
840   add_subdirectory(modules)
841 endif()
843 set(LIBCXX_TEST_DEPS "cxx_experimental")
845 if (LIBCXX_ENABLE_CLANG_TIDY)
846   list(APPEND LIBCXX_TEST_DEPS cxx-tidy)
847 endif()
849 if (LIBCXX_ENABLE_STD_MODULES)
850   list(APPEND LIBCXX_TEST_DEPS generate-cxx-modules generate-test-module-std)
851 endif()
853 if (LIBCXX_INCLUDE_BENCHMARKS)
854   add_subdirectory(benchmarks)
855 endif()
857 if (LIBCXX_INCLUDE_TESTS)
858   add_subdirectory(test)
859   add_subdirectory(lib/abi)
860 endif()
862 if (LIBCXX_INCLUDE_DOCS)
863   add_subdirectory(docs)
864 endif()