[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / libcxx / CMakeLists.txt
blobc729542d8cd370bbb2cd4e3f4eea22b400a14a6f
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_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)
65   message(FATAL_ERROR
66     "Unsupported hardening mode: '${LIBCXX_HARDENING_MODE}'. Supported values are ${LIBCXX_SUPPORTED_HARDENING_MODES}.")
67 endif()
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
73    will not." ON)
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.
83    embedded)." ON)
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
97 # database.
98 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
99   set(ENABLE_TIME_ZONE_DATABASE_DEFAULT ON)
100 else()
101   set(ENABLE_TIME_ZONE_DATABASE_DEFAULT OFF)
102 endif()
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")
125 elseif(MINGW)
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")
130   else()
131     set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static-clangcl.cfg.in")
132   endif()
133 else()
134   if (LIBCXX_ENABLE_SHARED)
135     set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared.cfg.in")
136   else()
137     set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static.cfg.in")
138   endif()
139 endif()
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}")
145 endif()
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}'")
168   endif()
169 endif()
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)
185   set(abi_version "2")
186 else()
187   set(abi_version "1")
188 endif()
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}'.")
200 endif()
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
210    value means.")
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")
215 endif()
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 ---------------------------------------------------------
222 if (MSVC)
223   set(LIBCXX_DEFAULT_ABI_LIBRARY "vcruntime")
224 elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
225   set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxrt")
226 else()
227   set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxabi")
228 endif()
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}.")
234 endif()
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)
259 endif()
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.")
278 endif()
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")
296 else()
297   set(LIBCXX_PSTL_CPU_BACKEND "serial" CACHE STRING "Which PSTL CPU backend to use")
298 endif()
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)
314 endif()
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)
319 if (WIN32)
320   set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT ON)
321 endif()
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.")
334 endif()
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.")
340   endif()
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.")
344   endif()
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.")
348   endif()
350 endif()
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.")
357   endif()
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.")
362   endif()
363 endif()
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.")
370   endif()
371 endif()
373 # Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
374 # is ON.
375 if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
376   message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
377 endif()
379 if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
380     if (APPLE)
381       message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
382     endif()
383     if (NOT LIBCXX_ENABLE_SHARED)
384       message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
385     endif()
386 endif()
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")
392 endif()
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.")
396 endif ()
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.")
401 endif()
403 #===============================================================================
404 # Configure System
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})
430   endif()
431 else()
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")
436   else()
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")
440   endif()
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.")
446 endif()
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)
479 endif()
481 # Configure compiler.
482 include(config-ix)
484 # Configure coverage options.
485 if (LIBCXX_GENERATE_COVERAGE)
486   include(CodeCoverage)
487   set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE)
488 endif()
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
507     CXX_STANDARD 20
508     CXX_STANDARD_REQUIRED YES
509     CXX_EXTENSIONS NO)
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.
514   if (ZOS)
515     target_add_compile_flags_if_supported(${target} PRIVATE -fno-aligned-allocation)
516   else()
517     target_add_compile_flags_if_supported(${target} PRIVATE -faligned-allocation)
518   endif()
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++
523   # headers
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)
537   endif()
539   # Let the library headers know they are currently being used to build the
540   # library.
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
545   # errors.
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)
551     endif()
552     if (LIBCXX_HAS_RT_LIB)
553       target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
554     endif()
555   endif()
556   target_compile_options(${target} PUBLIC "${LIBCXX_ADDITIONAL_COMPILE_FLAGS}")
557 endfunction()
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)
565   else()
566     target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
567     target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
568   endif()
569 endfunction()
571 # RTTI flags ==================================================================
572 function(cxx_add_rtti_flags target)
573   if (NOT LIBCXX_ENABLE_RTTI)
574     if (MSVC)
575       target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
576     else()
577       target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
578     endif()
579   endif()
580 endfunction()
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)
591   endif()
592 endfunction()
594 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
596 # Sanitizer flags =============================================================
598 function(get_sanitizer_flags OUT_VAR  USE_SANITIZER)
599   set(SANITIZER_FLAGS)
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")
610     endif()
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")
619       endif()
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)
629     else()
630       message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
631     endif()
632   elseif(USE_SANITIZER AND MSVC)
633     message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
634   endif()
635   set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
636 endfunction()
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++")
650   else()
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")
654   endif()
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")
661   endif()
663   if (LIBCXX_HAS_SYSTEM_LIB)
664     target_link_libraries(${target} PRIVATE System)
665   endif()
667   if (LIBCXX_HAS_PTHREAD_LIB)
668     target_link_libraries(${target} PRIVATE pthread)
669   endif()
671   if (LIBCXX_HAS_C_LIB)
672     target_link_libraries(${target} PRIVATE c)
673   endif()
675   if (LIBCXX_HAS_M_LIB)
676     target_link_libraries(${target} PRIVATE m)
677   endif()
679   if (LIBCXX_HAS_RT_LIB)
680     target_link_libraries(${target} PRIVATE rt)
681   endif()
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}")
687     endif()
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)
692   endif()
694   if (LIBCXX_HAS_ATOMIC_LIB)
695     target_link_libraries(${target} PRIVATE atomic)
696   endif()
698   if (MINGW)
699     target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
700   endif()
702   if (MSVC)
703     if ((NOT CMAKE_MSVC_RUNTIME_LIBRARY AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
704         OR (CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug"))
705       set(LIB_SUFFIX "d")
706     else()
707       set(LIB_SUFFIX "")
708     endif()
710     if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
711       set(CRT_LIB "msvcrt")
712       set(CXX_LIB "msvcprt")
713     else()
714       set(CRT_LIB "libcmt")
715       set(CXX_LIB "libcpmt")
716     endif()
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)
723   endif()
725   if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21)
726     target_link_libraries(${target} PUBLIC android_support)
727   endif()
728   target_link_libraries(${target} PUBLIC "${LIBCXX_ADDITIONAL_LIBRARIES}")
729 endfunction()
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
741                                  # level.
742                                  _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
743                                  # We are building the c++ runtime, don't pull in
744                                  # msvcprt.
745                                  _CRTBLD
746                                  # Don't warn on the use of "deprecated"
747                                  # "insecure" functions which are standards
748                                  # specified.
749                                  _CRT_SECURE_NO_WARNINGS
750                                  # Use the ISO conforming behaviour for conversion
751                                  # in printf, scanf.
752                                  _CRT_STDIO_ISO_WIDE_SPECIFIERS)
753   endif()
754 endfunction()
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)
765 endif()
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)
788 endif()
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")
793 endif()
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)
801 else()
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")
804 endif()
806 if (LIBCXX_ABI_DEFINES)
807   set(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")
811     endif()
812     list(APPEND abi_defines "#define ${abi_define}")
813   endforeach()
814   string(REPLACE ";" "\n" abi_defines "${abi_defines}")
815   config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
816 endif()
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}")
824   endforeach()
825   string(REPLACE ";" "\n" extra_site_defines "${extra_site_defines}")
826   config_define(${extra_site_defines} _LIBCPP_EXTRA_SITE_DEFINES)
827 endif()
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)
835 endif()
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)
841 endif()
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})
852 endfunction()
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)
862 endif()
864 set(LIBCXX_TEST_DEPS "cxx_experimental")
866 if (LIBCXX_ENABLE_CLANG_TIDY)
867   list(APPEND LIBCXX_TEST_DEPS cxx-tidy)
868 endif()
870 if (LIBCXX_ENABLE_STD_MODULES)
871   list(APPEND LIBCXX_TEST_DEPS generate-cxx-modules generate-test-module-std)
872 endif()
874 if (LIBCXX_INCLUDE_BENCHMARKS)
875   add_subdirectory(benchmarks)
876 endif()
878 if (LIBCXX_INCLUDE_TESTS)
879   add_subdirectory(test)
880   add_subdirectory(lib/abi)
881 endif()
883 if (LIBCXX_INCLUDE_DOCS)
884   add_subdirectory(docs)
885 endif()