blob: 77df59e4cd7554b248684fac27491f6682ac1ecc [file] [log] [blame]
Eric Fiselierd6fb02b2020-03-24 21:33:42 -04001# See https://libcxx.llvm.org/docs/BuildingLibcxx.html for instructions on how
2# to build libcxx with CMake.
Eric Fiselier7d6b2ad2017-05-04 06:28:34 +00003
Louis Dionne19aec8c2020-03-12 18:01:20 -04004if (NOT IS_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../libcxxabi")
5 message(FATAL_ERROR "libc++ now requires being built in a monorepo layout with libcxxabi available")
6endif()
7
Michael J. Spencerf5799be2010-12-10 19:47:54 +00008#===============================================================================
9# Setup Project
10#===============================================================================
Louis Dionneafa1afd2020-04-22 11:15:05 -040011cmake_minimum_required(VERSION 3.13.4)
Michael J. Spencerf5799be2010-12-10 19:47:54 +000012
John Ericson949bbd02022-01-01 07:03:31 +000013set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
14
Michael J. Spencerf5799be2010-12-10 19:47:54 +000015# Add path for custom modules
John Ericson949bbd02022-01-01 07:03:31 +000016list(INSERT CMAKE_MODULE_PATH 0
Michael J. Spencerf5799be2010-12-10 19:47:54 +000017 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
18 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
John Ericson949bbd02022-01-01 07:03:31 +000019 "${LLVM_COMMON_CMAKE_UTILS}"
20 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
Michael J. Spencerf5799be2010-12-10 19:47:54 +000021 )
22
Marek Kurdej5e7a93a2021-01-25 09:50:03 +010023set(CMAKE_FOLDER "libc++")
24
Dominik Montada8c03fdf2020-08-24 11:01:05 +020025set(LIBCXX_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
26set(LIBCXX_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
27set(LIBCXX_BINARY_INCLUDE_DIR "${LIBCXX_BINARY_DIR}/include/c++build")
28
Jonas Hahnfeld66c60d92019-02-17 12:16:20 +000029if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBCXX_STANDALONE_BUILD)
Saleem Abdulrasool163333f2016-02-08 03:50:18 +000030 project(libcxx CXX C)
31
32 set(PACKAGE_NAME libcxx)
Tom Stellard08c766a2021-07-27 21:51:07 -070033 set(PACKAGE_VERSION 14.0.0git)
Saleem Abdulrasool163333f2016-02-08 03:50:18 +000034 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
35 set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org")
Eric Fiselier28349f92016-11-14 02:43:12 +000036
Dominik Montada8c03fdf2020-08-24 11:01:05 +020037 # In a standalone build, we don't have llvm to automatically generate the
38 # llvm-lit script for us. So we need to provide an explicit directory that
39 # the configurator should write the script into.
John Ericsondf31ff12022-01-19 06:45:07 +000040 set(LIBCXX_STANDALONE_BUILD TRUE)
Dominik Montada8c03fdf2020-08-24 11:01:05 +020041 set(LLVM_LIT_OUTPUT_DIR "${LIBCXX_BINARY_DIR}/bin")
Eugene Zelenko772d1142016-08-08 18:01:50 +000042endif()
Saleem Abdulrasool163333f2016-02-08 03:50:18 +000043
John Ericsondf31ff12022-01-19 06:45:07 +000044# Must go below project(..)
45include(GNUInstallDirs)
46
Petr Hosekdaf3a692017-01-16 00:33:07 +000047if (LIBCXX_STANDALONE_BUILD)
John Ericsondf31ff12022-01-19 06:45:07 +000048 # Find the LLVM sources and simulate LLVM CMake options.
49 include(HandleOutOfTreeLLVM)
50
Raul Tambre86bd8f82020-09-05 17:52:23 +030051 find_package(Python3 COMPONENTS Interpreter)
52 if(NOT Python3_Interpreter_FOUND)
Alfsonso Gregoryf46f93b2021-11-12 13:53:50 -050053 message(SEND_ERROR "Python3 not found. Python3 is required")
Petr Hosekdaf3a692017-01-16 00:33:07 +000054 endif()
55endif()
56
Saleem Abdulrasool163333f2016-02-08 03:50:18 +000057# Require out of source build.
58include(MacroEnsureOutOfSourceBuild)
59MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
60 "${PROJECT_NAME} requires an out of source build. Please create a separate
61 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
62 )
Eric Fiselier5e0b8fc2018-10-01 01:31:23 +000063if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
64 message(STATUS "Configuring for clang-cl")
65 set(LIBCXX_TARGETING_CLANG_CL ON)
66endif()
Saleem Abdulrasool163333f2016-02-08 03:50:18 +000067
Eric Fiseliercc1f65c2017-01-14 06:06:47 +000068if (MSVC)
69 set(LIBCXX_TARGETING_MSVC ON)
Eric Fiselier11edd932018-10-01 01:00:11 +000070 message(STATUS "Configuring for MSVC")
Eric Fiseliercc1f65c2017-01-14 06:06:47 +000071else()
72 set(LIBCXX_TARGETING_MSVC OFF)
73endif()
74
Michael J. Spencerf5799be2010-12-10 19:47:54 +000075#===============================================================================
76# Setup CMake Options
77#===============================================================================
Eric Fiselier309a50a2016-09-07 01:15:10 +000078include(CMakeDependentOption)
Eric Fiselier2aeac462017-03-11 03:24:18 +000079include(HandleCompilerRT)
Michael J. Spencerf5799be2010-12-10 19:47:54 +000080
Eric Fiselier10ed6c32015-07-30 22:30:34 +000081# Basic options ---------------------------------------------------------------
Eric Fiseliere49cdfb2017-02-04 23:22:28 +000082option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." OFF)
Eric Fiselier10ed6c32015-07-30 22:30:34 +000083option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
Petr Hosek9e49a332016-08-08 22:57:25 +000084option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
Eric Fiselier27cb2f12016-05-03 21:30:18 +000085option(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON)
Eric Fiselierf1d87f82019-03-21 00:04:31 +000086set(ENABLE_FILESYSTEM_DEFAULT ON)
Martin Storsjö99fc4a62020-11-05 00:13:22 +020087if (WIN32 AND NOT MINGW)
88 # Filesystem is buildable for windows, but it requires __int128 helper
89 # functions, that currently are provided by libgcc or compiler_rt builtins.
90 # These are available in MinGW environments, but not currently in MSVC
91 # environments.
Eric Fiselierf1d87f82019-03-21 00:04:31 +000092 set(ENABLE_FILESYSTEM_DEFAULT OFF)
93endif()
94option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of the main libc++ library"
95 ${ENABLE_FILESYSTEM_DEFAULT})
Eric Fiselier10ed6c32015-07-30 22:30:34 +000096option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
Louis Dionne0a06eb92019-08-05 18:29:14 +000097option(LIBCXX_ENABLE_PARALLEL_ALGORITHMS "Enable the parallel algorithms library. This requires the PSTL to be available." OFF)
Louis Dionne87766722020-10-09 14:40:47 -040098option(LIBCXX_ENABLE_DEBUG_MODE_SUPPORT
Louis Dionnece1365f2020-10-06 16:46:58 -040099 "Whether to include support for libc++'s debugging mode in the library.
100 By default, this is turned on. If you turn it off and try to enable the
101 debug mode when compiling a program against libc++, it will fail to link
102 since the required support isn't provided in the library." ON)
Louis Dionnee0d01292020-10-15 10:32:09 -0400103option(LIBCXX_ENABLE_RANDOM_DEVICE
104 "Whether to include support for std::random_device in the library. Disabling
105 this can be useful when building the library for platforms that don't have
106 a source of randomness, such as some embedded platforms. When this is not
107 supported, most of <random> will still be available, but std::random_device
108 will not." ON)
Louis Dionne88ffc722020-10-09 15:31:05 -0400109option(LIBCXX_ENABLE_LOCALIZATION
110 "Whether to include support for localization in the library. Disabling
111 localization can be useful when porting to platforms that don't support
112 the C locale API (e.g. embedded). When localization is not supported,
113 several parts of the library will be disabled: <iostream>, <regex>, <locale>
114 will be completely unusable, and other parts may be only partly available." ON)
Mark de Weverdf2af992021-05-25 20:11:08 +0200115option(LIBCXX_ENABLE_UNICODE
116 "Whether to include support for Unicode in the library. Disabling Unicode can
Louis Dionnecf765b12021-09-09 11:14:33 -0400117 be useful when porting to platforms that don't support UTF-8 encoding (e.g.
118 embedded)." ON)
Louis Dionnef4c12582021-08-23 15:32:36 -0400119option(LIBCXX_ENABLE_WIDE_CHARACTERS
120 "Whether to include support for wide characters in the library. Disabling
121 wide character support can be useful when porting to platforms that don't
122 support the C functionality for wide characters. When wide characters are
123 not supported, several parts of the library will be disabled, notably the
124 wide character specializations of std::basic_string." ON)
Louis Dionne2eadbc82020-11-04 15:01:25 -0500125option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS
126 "Whether to turn on vendor availability annotations on declarations that depend
127 on definitions in a shared library. By default, we assume that we're not building
128 libc++ for any specific vendor, and we disable those annotations. Vendors wishing
129 to provide compile-time errors when using features unavailable on some version of
130 the shared library they shipped should turn this on and see `include/__availability`
131 for more details." OFF)
Mark de Wever71909de2021-07-25 09:18:53 +0200132option(LIBCXX_ENABLE_INCOMPLETE_FEATURES
133 "Whether to enable support for incomplete library features. Incomplete features
134 are new library features under development. These features don't guarantee
135 ABI stability nor the quality of completed library features. Vendors
136 shipping the library may want to disable this option." ON)
Louis Dionne54a8a0d2021-09-29 15:26:05 -0400137set(LIBCXX_TEST_CONFIG "legacy.cfg.in" CACHE STRING
138 "The path to the Lit testing configuration to use when running the tests.
139 If a relative path is provided, it is assumed to be relative to '<monorepo>/libcxx/test/configs'.")
140if (NOT IS_ABSOLUTE "${LIBCXX_TEST_CONFIG}")
141 set(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/${LIBCXX_TEST_CONFIG}")
142endif()
Louis Dionne6f693182020-07-09 11:54:09 -0400143set(LIBCXX_TEST_PARAMS "" CACHE STRING
144 "A list of parameters to run the Lit test suite with.")
Eric Fiselier3aa54782016-10-30 22:53:00 +0000145
Eric Fiselier3aa54782016-10-30 22:53:00 +0000146# Benchmark options -----------------------------------------------------------
Louis Dionne95530082018-09-22 21:30:12 +0000147option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
Eric Fiselier336a1a62018-11-14 20:38:46 +0000148
149set(LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT --benchmark_min_time=0.01)
150set(LIBCXX_BENCHMARK_TEST_ARGS "${LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT}" CACHE STRING
151 "Arguments to pass when running the benchmarks using check-cxx-benchmarks")
152
Eric Fiselier3aa54782016-10-30 22:53:00 +0000153set(LIBCXX_BENCHMARK_NATIVE_STDLIB "" CACHE STRING
154 "Build the benchmarks against the specified native STL.
155 The value must be one of libc++/libstdc++")
156set(LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN "" CACHE STRING
157 "Use alternate GCC toolchain when building the native benchmarks")
158
159if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
160 if (NOT (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++"
161 OR LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++"))
162 message(FATAL_ERROR "Invalid value for LIBCXX_BENCHMARK_NATIVE_STDLIB: "
163 "'${LIBCXX_BENCHMARK_NATIVE_STDLIB}'")
164 endif()
165endif()
166
Eric Fiselierb17bb062015-08-22 19:40:49 +0000167option(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS})
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000168set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
169 "Define suffix of library directory name (32/64)")
170option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON)
Eric Fiselierd77135f2015-08-26 20:18:21 +0000171option(LIBCXX_INSTALL_LIBRARY "Install the libc++ library." ON)
Petr Hosek4a1e14e2018-07-24 23:27:51 +0000172cmake_dependent_option(LIBCXX_INSTALL_STATIC_LIBRARY
173 "Install the static libc++ library." ON
174 "LIBCXX_ENABLE_STATIC;LIBCXX_INSTALL_LIBRARY" OFF)
175cmake_dependent_option(LIBCXX_INSTALL_SHARED_LIBRARY
176 "Install the shared libc++ library." ON
177 "LIBCXX_ENABLE_SHARED;LIBCXX_INSTALL_LIBRARY" OFF)
Eric Fiselier309a50a2016-09-07 01:15:10 +0000178cmake_dependent_option(LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY
179 "Install libc++experimental.a" ON
180 "LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY;LIBCXX_INSTALL_LIBRARY" OFF)
Eric Fiselier998a5c82018-07-27 03:07:09 +0000181
Louis Dionnef9a52902018-09-26 08:24:51 +0000182set(LIBCXX_ABI_VERSION "1" CACHE STRING "ABI version of libc++. Can be either 1 or 2, where 2 is currently not stable. Defaults to 1.")
Eric Fiselierfe13c132018-10-30 21:44:53 +0000183set(LIBCXX_ABI_NAMESPACE "" CACHE STRING "The inline ABI namespace used by libc++. It defaults to __n where `n` is the current ABI version.")
Evgeniy Stepanova66a7b32015-10-13 23:48:28 +0000184option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF)
Shoaib Meenaia4a3d402017-10-05 02:18:08 +0000185option(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the Itanium ABI.")
186option(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of the Microsoft ABI.")
Eric Fiselier2405bd62019-05-29 02:21:37 +0000187
Louis Dionnebe00e882020-11-16 18:13:43 -0500188set(LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION "default" CACHE STRING
189 "Override the implementation to use for comparing typeinfos. By default, this
190 is detected automatically by the library, but this option allows overriding
191 which implementation is used unconditionally.
Eric Fiselier2405bd62019-05-29 02:21:37 +0000192
Louis Dionnebe00e882020-11-16 18:13:43 -0500193 See the documentation in <libcxx/include/typeinfo> for details on what each
194 value means.")
195set(TYPEINFO_COMPARISON_VALUES "default;1;2;3")
196if (NOT ("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" IN_LIST TYPEINFO_COMPARISON_VALUES))
Louis Dionned0fcdcd2020-05-15 15:58:19 -0400197 message(FATAL_ERROR "Value '${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}' is not a valid value for
Louis Dionnebe00e882020-11-16 18:13:43 -0500198 LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION")
Eric Fiselier2405bd62019-05-29 02:21:37 +0000199endif()
200
Louis Dionne61cd6872018-08-16 12:44:28 +0000201option(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT "Enable per TU ABI insulation by default. To be used by vendors." OFF)
Shoaib Meenai89937532017-10-04 23:51:57 +0000202set(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI macros to define in the site config header.")
Martin Storsjöf68e8902021-12-21 01:19:34 +0200203option(LIBCXX_EXTRA_SITE_DEFINES "Extra defines to add into __config_site")
Saleem Abdulrasoole81fcb82016-08-24 04:22:52 +0000204option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
Louis Dionne2d0b4d62019-03-20 18:16:24 +0000205set(LIBCXX_LIBCPPABI_VERSION "2" CACHE STRING "Version of libc++abi's ABI to re-export from libc++ when re-exporting is enabled.
206 Note that this is not related to the version of libc++'s ABI itself!")
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000207
208# ABI Library options ---------------------------------------------------------
Louis Dionne61e89732020-04-02 02:09:23 -0400209set(LIBCXX_CXX_ABI "default" CACHE STRING "Specify C++ ABI library to use.")
Eric Fiselier1cd196e2017-01-16 20:47:35 +0000210set(CXXABIS none default libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000211set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
212
Eric Fiselierbb906852015-10-22 20:54:27 +0000213# Setup the default options if LIBCXX_CXX_ABI is not specified.
Eric Fiselier1285e4d2017-01-03 01:18:48 +0000214if (LIBCXX_CXX_ABI STREQUAL "default")
Shoaib Meenai8048b442017-04-20 23:33:49 +0000215 if (LIBCXX_TARGETING_MSVC)
216 # FIXME: Figure out how to configure the ABI library on Windows.
217 set(LIBCXX_CXX_ABI_LIBNAME "vcruntime")
Dimitry Andric35479ff2018-02-11 22:31:05 +0000218 elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
219 set(LIBCXX_CXX_ABI_LIBNAME "libcxxrt")
Louis Dionne61e89732020-04-02 02:09:23 -0400220 elseif (NOT LIBCXX_STANDALONE_BUILD OR HAVE_LIBCXXABI)
221 set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
Eugene Zelenko772d1142016-08-08 18:01:50 +0000222 else()
Shoaib Meenai8048b442017-04-20 23:33:49 +0000223 set(LIBCXX_CXX_ABI_LIBNAME "default")
Eugene Zelenko772d1142016-08-08 18:01:50 +0000224 endif()
225else()
Eric Fiselierbb906852015-10-22 20:54:27 +0000226 set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
Eugene Zelenko772d1142016-08-08 18:01:50 +0000227endif()
Eric Fiselierbb906852015-10-22 20:54:27 +0000228
Louis Dionne0c962cb2019-03-18 18:18:01 +0000229option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY
230 "Use a static copy of the ABI library when linking libc++.
231 This option cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT." OFF)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000232
Petr Hosek058c04c2018-07-24 07:06:17 +0000233cmake_dependent_option(LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY
234 "Statically link the ABI library to static library" ON
235 "LIBCXX_ENABLE_STATIC_ABI_LIBRARY;LIBCXX_ENABLE_STATIC" OFF)
236
237cmake_dependent_option(LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
238 "Statically link the ABI library to shared library" ON
Martin Storsjo3d2e54322018-08-14 17:33:10 +0000239 "LIBCXX_ENABLE_STATIC_ABI_LIBRARY;LIBCXX_ENABLE_SHARED" OFF)
Petr Hosek058c04c2018-07-24 07:06:17 +0000240
Eric Fiselier82414052015-10-14 19:54:03 +0000241# Generate and install a linker script inplace of libc++.so. The linker script
Eric Fiselier1ab69fc2015-10-15 22:41:51 +0000242# will link libc++ to the correct ABI library. This option is on by default
Shoaib Meenai84904fb2017-03-25 03:22:35 +0000243# on UNIX platforms other than Apple unless 'LIBCXX_ENABLE_STATIC_ABI_LIBRARY'
Eric Fiselier571367e2015-10-22 20:50:07 +0000244# is on. This option is also disabled when the ABI library is not specified
245# or is specified to be "none".
Eric Fiselier1ab69fc2015-10-15 22:41:51 +0000246set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
Petr Hosek4b59ed42018-07-26 05:10:24 +0000247if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
Eric Fiselierbb906852015-10-22 20:54:27 +0000248 AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"
Eric Fiselier1285e4d2017-01-03 01:18:48 +0000249 AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "default"
Saleem Abdulrasool216833b2020-04-29 01:37:28 +0000250 AND Python3_EXECUTABLE
Asiri Rathnayake28383a42016-05-14 23:58:11 +0000251 AND LIBCXX_ENABLE_SHARED)
Eric Fiselier1ab69fc2015-10-15 22:41:51 +0000252 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
253endif()
254
Eric Fiselier82414052015-10-14 19:54:03 +0000255option(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
Eric Fiselier1ab69fc2015-10-15 22:41:51 +0000256 "Use and install a linker script for the given ABI library"
Eric Fiseliera15785b2015-10-15 23:04:54 +0000257 ${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
Eric Fiselier82414052015-10-14 19:54:03 +0000258
Eric Fiselier34992632017-03-02 19:35:33 +0000259option(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
Louis Dionne9b40ee82019-10-01 09:34:58 -0400260 "Build libc++ with definitions for operator new/delete. These are normally
261 defined in libc++abi, but this option can be used to define them in libc++
262 instead. If you define them in libc++, make sure they are NOT defined in
263 libc++abi. Doing otherwise is an ODR violation." OFF)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000264# Build libc++abi with libunwind. We need this option to determine whether to
265# link with libunwind or libgcc_s while running the test cases.
266option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
267
268# Target options --------------------------------------------------------------
Louis Dionnefa1c0772021-11-23 16:34:09 -0500269option(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})
270if (LIBCXX_BUILD_32_BITS)
Louis Dionnedc1244d2021-12-01 12:57:30 -0500271 message(FATAL_ERROR "LIBCXX_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")
Louis Dionnefa1c0772021-11-23 16:34:09 -0500272endif()
Louis Dionne72117f22021-10-12 15:59:08 -0400273
274if(CMAKE_CXX_COMPILER_TARGET)
275 set(LIBCXX_DEFAULT_TARGET_TRIPLE "${CMAKE_CXX_COMPILER_TARGET}")
276else()
277 set(LIBCXX_DEFAULT_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
278endif()
279set(LIBCXX_TARGET_TRIPLE "${LIBCXX_DEFAULT_TARGET_TRIPLE}" CACHE STRING "Use alternate target triple.")
280set(LIBCXX_SYSROOT "${CMAKE_SYSROOT}" CACHE STRING "Use alternate sysroot.")
281set(LIBCXX_GCC_TOOLCHAIN "${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}" CACHE STRING "Use alternate GCC toolchain.")
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000282
283# Feature options -------------------------------------------------------------
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000284option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
285option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
Eric Fiselierb9f99732014-12-06 21:02:58 +0000286option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
287option(LIBCXX_ENABLE_MONOTONIC_CLOCK
288 "Build libc++ with support for a monotonic clock.
Jonathan Roelofs91b3a5e2015-08-24 21:20:07 +0000289 This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
Vasileios Kalintiris8c58e922015-11-09 10:21:04 +0000290option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
Ben Craigb9599b12016-05-25 17:40:09 +0000291option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
Martin Storsjobf02a092018-01-05 20:48:29 +0000292option(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
Asiri Rathnayake8c2bf452016-09-11 21:46:40 +0000293option(LIBCXX_HAS_EXTERNAL_THREAD_API
294 "Build libc++ with an externalized threading API.
295 This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
Eric Fiselier00f6bea2017-01-06 20:05:40 +0000296option(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY
297 "Build libc++ with an externalized threading library.
298 This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON" OFF)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000299
300# Misc options ----------------------------------------------------------------
Eric Fiselier6fb770a2015-10-10 03:34:52 +0000301# FIXME: Turn -pedantic back ON. It is currently off because it warns
302# about #include_next which is used everywhere.
303option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000304option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
Saleem Abdulrasool6fe30732016-07-12 14:39:13 +0000305option(LIBCXX_DISABLE_MACRO_CONFLICT_WARNINGS "Disable #warnings about conflicting macros." OFF)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000306
Eric Fiselier78fdf2d2015-03-31 04:15:45 +0000307option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
308set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000309 "The Profile-rt library used to build with code coverage")
310
Eric Fiselier6627c702015-12-16 23:41:05 +0000311set(LIBCXX_CONFIGURE_IDE_DEFAULT OFF)
312if (XCODE OR MSVC_IDE)
313 set(LIBCXX_CONFIGURE_IDE_DEFAULT ON)
314endif()
315option(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE"
316 ${LIBCXX_CONFIGURE_IDE_DEFAULT})
317
Petr Hoseka2685cd2019-01-06 06:14:31 +0000318option(LIBCXX_HERMETIC_STATIC_LIBRARY
319 "Do not export any symbols from the static library." OFF)
320
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000321#===============================================================================
322# Check option configurations
323#===============================================================================
324
325# Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when
326# LIBCXX_ENABLE_THREADS is on.
327if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
328 message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF"
329 " when LIBCXX_ENABLE_THREADS is also set to OFF.")
Eric Fiselier0058c802014-08-18 05:03:46 +0000330endif()
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000331
Asiri Rathnayake205d7d32017-01-03 12:59:50 +0000332if(NOT LIBCXX_ENABLE_THREADS)
333 if(LIBCXX_HAS_PTHREAD_API)
334 message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
335 " when LIBCXX_ENABLE_THREADS is also set to ON.")
336 endif()
337 if(LIBCXX_HAS_EXTERNAL_THREAD_API)
338 message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
339 " when LIBCXX_ENABLE_THREADS is also set to ON.")
340 endif()
Eric Fiselier00f6bea2017-01-06 20:05:40 +0000341 if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
342 message(FATAL_ERROR "LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY can only be set "
343 "to ON when LIBCXX_ENABLE_THREADS is also set to ON.")
344 endif()
Martin Storsjobf02a092018-01-05 20:48:29 +0000345 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()
Eric Fiselier00f6bea2017-01-06 20:05:40 +0000349
350endif()
351
Asiri Rathnayakeb71c8992017-01-09 10:38:56 +0000352if (LIBCXX_HAS_EXTERNAL_THREAD_API)
353 if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
354 message(FATAL_ERROR "The options LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY and "
355 "LIBCXX_HAS_EXTERNAL_THREAD_API cannot both be ON at "
356 "the same time")
357 endif()
358 if (LIBCXX_HAS_PTHREAD_API)
359 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
360 "and LIBCXX_HAS_PTHREAD_API cannot be both"
361 "set to ON at the same time.")
362 endif()
Martin Storsjobf02a092018-01-05 20:48:29 +0000363 if (LIBCXX_HAS_WIN32_THREAD_API)
364 message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
365 "and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
366 "set to ON at the same time.")
367 endif()
368endif()
369
370if (LIBCXX_HAS_PTHREAD_API)
371 if (LIBCXX_HAS_WIN32_THREAD_API)
372 message(FATAL_ERROR "The options LIBCXX_HAS_PTHREAD_API"
373 "and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
374 "set to ON at the same time.")
375 endif()
Asiri Rathnayake8c2bf452016-09-11 21:46:40 +0000376endif()
377
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000378# Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
379# is ON.
380if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
381 message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
382endif()
383
Louis Dionne97607372019-03-25 14:56:29 +0000384# Warn users that LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option.
Eric Fiselier03571712015-03-03 15:59:51 +0000385if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
Louis Dionne97607372019-03-25 14:56:29 +0000386 message(WARNING "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option")
Saleem Abdulrasool216833b2020-04-29 01:37:28 +0000387 if (LIBCXX_ENABLE_STATIC AND NOT Python3_EXECUTABLE)
Eric Fiselierbf58c8e2016-11-18 19:53:45 +0000388 message(FATAL_ERROR "LIBCXX_ENABLE_STATIC_ABI_LIBRARY requires python but it was not found.")
389 endif()
Eric Fiselier03571712015-03-03 15:59:51 +0000390endif()
391
Eric Fiselier82414052015-10-14 19:54:03 +0000392if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
393 if (APPLE)
394 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
395 endif()
Asiri Rathnayake28383a42016-05-14 23:58:11 +0000396 if (NOT LIBCXX_ENABLE_SHARED)
397 message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
398 endif()
Eric Fiselier82414052015-10-14 19:54:03 +0000399endif()
400
Petr Hosek4b59ed42018-07-26 05:10:24 +0000401if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
Eric Fiselier82414052015-10-14 19:54:03 +0000402 message(FATAL_ERROR "Conflicting options given.
403 LIBCXX_ENABLE_STATIC_ABI_LIBRARY cannot be specified with
404 LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
405endif()
406
Shoaib Meenaia4a3d402017-10-05 02:18:08 +0000407if (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.")
Shoaib Meenaid4563852017-10-04 23:44:38 +0000409endif ()
410
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000411#===============================================================================
412# Configure System
413#===============================================================================
414
Louis Dionnec06a8f92020-06-26 12:08:59 -0400415# TODO: Projects that depend on libc++ should use LIBCXX_GENERATED_INCLUDE_DIR
416# instead of hard-coding include/c++/v1.
John Ericson0a8d15a2022-01-11 03:03:21 +0000417
John Ericsonf16a4a02022-01-16 06:00:29 +0000418set(LIBCXX_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE PATH
John Ericson0a8d15a2022-01-11 03:03:21 +0000419 "Path where target-agnostic libc++ headers should be installed.")
John Ericsonf16a4a02022-01-16 06:00:29 +0000420set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
John Ericson0a8d15a2022-01-11 03:03:21 +0000421 "Path where built libc++ runtime libraries should be installed.")
422
Petr Hosek887f26d2018-06-28 03:11:52 +0000423if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
Petr Hosekf7495502021-04-16 21:33:18 -0700424 set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
Louis Dionnec06a8f92020-06-26 12:08:59 -0400425 set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
Petr Hosekea12d772020-07-15 14:10:56 -0700426 set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
John Ericson1e03c372021-04-28 22:36:47 +0000427 set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
428 "Path where built libc++ libraries should be installed.")
John Ericsonf16a4a02022-01-16 06:00:29 +0000429 set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE PATH
John Ericson1e03c372021-04-28 22:36:47 +0000430 "Path where target-specific libc++ headers should be installed.")
Petr Hosek81f433b2019-05-22 21:08:33 +0000431 if(LIBCXX_LIBDIR_SUBDIR)
432 string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
433 string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
434 endif()
Jonas Hahnfeld98a7f272017-05-04 06:02:50 +0000435else()
John Ericson0a8d15a2022-01-11 03:03:21 +0000436 if(LLVM_LIBRARY_OUTPUT_INTDIR)
437 set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
438 set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/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 endif()
Petr Hosekea12d772020-07-15 14:10:56 -0700443 set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
John Ericson1e03c372021-04-28 22:36:47 +0000444 set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE PATH
445 "Path where built libc++ libraries should be installed.")
John Ericson1e03c372021-04-28 22:36:47 +0000446 set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE PATH
447 "Path where target-specific libc++ headers should be installed.")
Jonas Hahnfeld98a7f272017-05-04 06:02:50 +0000448endif()
Petr Hosek887f26d2018-06-28 03:11:52 +0000449
Eric Fiselier1cd196e2017-01-16 20:47:35 +0000450file(MAKE_DIRECTORY "${LIBCXX_BINARY_INCLUDE_DIR}")
Eric Fiseliera78a2672014-12-20 03:16:55 +0000451
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000452set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
453set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
Shoaib Meenai61707652017-04-13 16:27:38 +0000454set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000455
Eric Fiselier5aedca92014-11-15 06:26:30 +0000456# Declare libc++ configuration variables.
457# They are intended for use as follows:
458# LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
459# LIBCXX_COMPILE_FLAGS: Compile only flags.
460# LIBCXX_LINK_FLAGS: Linker only flags.
Eric Fiselier054fc4c2016-10-09 21:34:03 +0000461# LIBCXX_LIBRARIES: libraries libc++ is linked to.
Eric Fiselier5aedca92014-11-15 06:26:30 +0000462set(LIBCXX_COMPILE_FLAGS "")
463set(LIBCXX_LINK_FLAGS "")
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000464set(LIBCXX_LIBRARIES "")
Eric Fiselier5aedca92014-11-15 06:26:30 +0000465
Eric Fiseliera4f24602016-06-02 01:10:08 +0000466# Include macros for adding and removing libc++ flags.
467include(HandleLibcxxFlags)
468
469# Target flags ================================================================
470# These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that
471# 'config-ix' use them during feature checks. It also adds them to both
472# 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS'
Muiez Ahmeda1da7392022-01-14 11:35:53 -0500473if(ZOS)
474 add_target_flags_if_supported("-fzos-le-char-mode=ebcdic")
475endif()
Petr Hosek6fd4e7f2019-02-04 20:02:26 +0000476if(LIBCXX_TARGET_TRIPLE)
Louis Dionnea59165b2021-07-15 13:02:43 -0400477 add_target_flags_if_supported("--target=${LIBCXX_TARGET_TRIPLE}")
Petr Hosek6fd4e7f2019-02-04 20:02:26 +0000478endif()
479if(LIBCXX_SYSROOT)
Louis Dionnea59165b2021-07-15 13:02:43 -0400480 add_target_flags_if_supported("--sysroot=${LIBCXX_SYSROOT}")
Petr Hosek6fd4e7f2019-02-04 20:02:26 +0000481endif()
482if(LIBCXX_GCC_TOOLCHAIN)
Louis Dionnea59165b2021-07-15 13:02:43 -0400483 add_target_flags_if_supported("--gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}")
Petr Hosek6fd4e7f2019-02-04 20:02:26 +0000484endif()
485
Eric Fiselier382338d2014-11-15 17:25:23 +0000486# Configure compiler.
487include(config-ix)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000488
Eric Fiselier78fdf2d2015-03-31 04:15:45 +0000489# Configure coverage options.
490if (LIBCXX_GENERATE_COVERAGE)
491 include(CodeCoverage)
492 set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE)
493endif()
Eric Fiselier382338d2014-11-15 17:25:23 +0000494
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000495string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
Eric Fiselier7e3ee092017-01-14 07:54:39 +0000496if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
497 set(LIBCXX_DEBUG_BUILD ON)
498else()
499 set(LIBCXX_DEBUG_BUILD OFF)
500endif()
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000501
Eric Fiselier382338d2014-11-15 17:25:23 +0000502#===============================================================================
503# Setup Compiler Flags
504#===============================================================================
505
JF Bastienfc45f322016-03-05 14:22:02 +0000506include(HandleLibCXXABI) # Setup the ABI library flags
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000507
Michal Gornyecc88642016-09-27 07:55:26 +0000508if (NOT LIBCXX_STANDALONE_BUILD)
509 # Remove flags that may have snuck in.
510 remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
Eric Fiselier6dede182017-01-17 23:27:56 +0000511 -lc++abi)
Michal Gornyecc88642016-09-27 07:55:26 +0000512endif()
Raphael Isemann6b7a49b2020-10-13 16:05:00 +0200513remove_flags(--stdlib=libc++ -stdlib=libc++ --stdlib=libstdc++ -stdlib=libstdc++)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000514
Eric Fiseliercc1f65c2017-01-14 06:06:47 +0000515# FIXME: Remove all debug flags and flags that change which Windows
516# default libraries are linked. Currently we only support linking the
517# non-debug DLLs
Eric Fiselier7e3ee092017-01-14 07:54:39 +0000518remove_flags("/D_DEBUG" "/MTd" "/MDd" "/MT" "/Md")
Eric Fiseliercc1f65c2017-01-14 06:06:47 +0000519
Shoaib Meenaif88923d2017-03-25 03:42:20 +0000520# FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
Eric Fiselierf2be7c22015-10-15 20:27:15 +0000521# Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
Shoaib Meenaif88923d2017-03-25 03:42:20 +0000522# so they don't get transformed into -Wno and -errors respectively.
Eric Fiselierf2be7c22015-10-15 20:27:15 +0000523remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
Eric Fiselierf4bfd7c2015-10-13 23:56:33 +0000524
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000525# Required flags ==============================================================
Louis Dionne925d9d22019-10-02 20:07:01 +0000526function(cxx_add_basic_build_flags target)
Eric Fiselier72b41e62019-12-11 20:26:30 -0500527
Marek Kurdej3b625062020-11-22 15:56:39 +0100528 # Require C++20 for all targets. C++17 is needed to use aligned allocation
529 # in the dylib. C++20 is needed to use char8_t.
Eric Fiselier72b41e62019-12-11 20:26:30 -0500530 set_target_properties(${target} PROPERTIES
Marek Kurdej3b625062020-11-22 15:56:39 +0100531 CXX_STANDARD 20
Mark de Weverf8817762021-09-23 12:15:02 -0400532 CXX_STANDARD_REQUIRED YES
Eric Fiselier72b41e62019-12-11 20:26:30 -0500533 CXX_EXTENSIONS NO)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000534
Louis Dionne918ba932020-07-23 11:05:47 -0400535 # When building the dylib, don't warn for unavailable aligned allocation
536 # functions based on the deployment target -- they are always available
Zbigniew Sarbinowskiaa8a5b82020-11-12 14:40:35 -0500537 # because they are provided by the dylib itself with the excepton of z/OS.
538 if (ZOS)
539 target_add_compile_flags_if_supported(${target} PRIVATE -fno-aligned-allocation)
540 else()
541 target_add_compile_flags_if_supported(${target} PRIVATE -faligned-allocation)
542 endif()
Louis Dionne918ba932020-07-23 11:05:47 -0400543
Louis Dionne925d9d22019-10-02 20:07:01 +0000544 # On all systems the system c++ standard library headers need to be excluded.
545 # MSVC only has -X, which disables all default includes; including the crt.
546 # Thus, we do nothing and hope we don't accidentally include any of the C++
547 # headers
548 target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++)
Eric Fiselierff16b9a2015-07-29 21:07:28 +0000549
Louis Dionne925d9d22019-10-02 20:07:01 +0000550 # Hide all inline function definitions which have not explicitly been marked
551 # visible. This prevents new definitions for inline functions from appearing in
552 # the dylib when get ODR used by another function.
553 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden)
Eric Fiselier10b12f02016-10-25 19:43:44 +0000554
Louis Dionne925d9d22019-10-02 20:07:01 +0000555 # Our visibility annotations are not quite right for non-Clang compilers,
556 # so we end up not exporting all the symbols we should. In the future, we
557 # can improve the situation by providing an explicit list of exported
558 # symbols on all compilers.
559 if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
560 target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden)
561 endif()
Eric Fiselier3ca91852017-05-25 04:36:24 +0000562
Louis Dionne925d9d22019-10-02 20:07:01 +0000563 if (LIBCXX_CONFIGURE_IDE)
564 # This simply allows IDE to process <experimental/coroutine>
565 target_add_compile_flags_if_supported(${target} PRIVATE -fcoroutines-ts)
566 endif()
Eric Fiselierf8f31c42016-09-16 00:00:48 +0000567
Louis Dionne925d9d22019-10-02 20:07:01 +0000568 # Let the library headers know they are currently being used to build the
569 # library.
570 target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY)
Eric Fiselier34992632017-03-02 19:35:33 +0000571
Louis Dionne925d9d22019-10-02 20:07:01 +0000572 if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS)
573 target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS)
574 endif()
575
576 if (LIBCXX_HAS_COMMENT_LIB_PRAGMA)
Michał Górnya9b5fff2019-12-02 11:49:20 +0100577 if (LIBCXX_HAS_PTHREAD_LIB)
578 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_PTHREAD_LIB)
579 endif()
580 if (LIBCXX_HAS_RT_LIB)
581 target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
582 endif()
Louis Dionne925d9d22019-10-02 20:07:01 +0000583 endif()
584endfunction()
Petr Hosek789b7f02019-05-30 04:40:21 +0000585
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000586# Warning flags ===============================================================
Louis Dionnec78c0e02019-10-02 19:31:30 +0000587function(cxx_add_warning_flags target)
588 target_compile_definitions(${target} PUBLIC -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Martin Storsjö15406462021-03-05 14:46:30 +0200589 if (MSVC)
590 # -W4 is the cl.exe/clang-cl equivalent of -Wall. (In cl.exe and clang-cl,
591 # -Wall is equivalent to -Weverything in GCC style compiler drivers.)
592 target_add_compile_flags_if_supported(${target} PRIVATE -W4)
593 else()
594 target_add_compile_flags_if_supported(${target} PRIVATE -Wall)
595 endif()
596 target_add_compile_flags_if_supported(${target} PRIVATE -Wextra -W -Wwrite-strings
Louis Dionnec78c0e02019-10-02 19:31:30 +0000597 -Wno-unused-parameter -Wno-long-long
Louis Dionnea4ba7802021-10-29 12:36:57 -0400598 -Werror=return-type -Wextra-semi -Wundef
599 -Wformat-nonliteral)
Louis Dionnec78c0e02019-10-02 19:31:30 +0000600 if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
601 target_add_compile_flags_if_supported(${target} PRIVATE
602 -Wno-user-defined-literals
603 -Wno-covered-switch-default
Logan Smith77e0e9e2020-07-22 17:44:52 -0700604 -Wno-suggest-override
Louis Dionnec78c0e02019-10-02 19:31:30 +0000605 )
Eric Fiselier0c8011f2018-10-01 01:15:50 +0000606 if (LIBCXX_TARGETING_CLANG_CL)
Louis Dionnec78c0e02019-10-02 19:31:30 +0000607 target_add_compile_flags_if_supported(${target} PRIVATE
Eric Fiselier0c8011f2018-10-01 01:15:50 +0000608 -Wno-c++98-compat
Eric Fiselier5e0b8fc2018-10-01 01:31:23 +0000609 -Wno-c++98-compat-pedantic
Eric Fiselier0c8011f2018-10-01 01:15:50 +0000610 -Wno-c++11-compat
611 -Wno-undef
Eric Fiselier5e0b8fc2018-10-01 01:31:23 +0000612 -Wno-reserved-id-macro
613 -Wno-gnu-include-next
614 -Wno-gcc-compat # For ignoring "'diagnose_if' is a clang extension" warnings
Eric Fiseliere60359e2018-10-01 01:47:23 +0000615 -Wno-zero-as-null-pointer-constant # FIXME: Remove this and fix all occurrences.
616 -Wno-deprecated-dynamic-exception-spec # For auto_ptr
617 -Wno-sign-conversion
618 -Wno-old-style-cast
619 -Wno-deprecated # FIXME: Remove this and fix all occurrences.
Eric Fiselier0b485f32018-10-01 01:59:37 +0000620 -Wno-shift-sign-overflow # FIXME: Why do we need this with clang-cl but not clang?
Eric Fiselier1f44fda2018-10-01 03:59:05 +0000621 -Wno-double-promotion # FIXME: remove me
Eric Fiselier0c8011f2018-10-01 01:15:50 +0000622 )
623 endif()
Louis Dionnec78c0e02019-10-02 19:31:30 +0000624 elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
625 target_add_compile_flags_if_supported(${target} PRIVATE
626 -Wno-literal-suffix
627 -Wno-c++14-compat
Logan Smith77e0e9e2020-07-22 17:44:52 -0700628 -Wno-noexcept-type
629 -Wno-suggest-override)
Louis Dionnec78c0e02019-10-02 19:31:30 +0000630 endif()
631 if (LIBCXX_ENABLE_WERROR)
632 target_add_compile_flags_if_supported(${target} PRIVATE -Werror)
633 target_add_compile_flags_if_supported(${target} PRIVATE -WX)
634 else()
635 # TODO(EricWF) Remove this. We shouldn't be suppressing errors when -Werror is
636 # added elsewhere.
637 target_add_compile_flags_if_supported(${target} PRIVATE -Wno-error)
638 endif()
639 if (LIBCXX_ENABLE_PEDANTIC)
640 target_add_compile_flags_if_supported(${target} PRIVATE -pedantic)
641 endif()
642 if (LIBCXX_DISABLE_MACRO_CONFLICT_WARNINGS)
643 target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS)
644 endif()
645endfunction()
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000646
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000647# Exception flags =============================================================
Louis Dionne432ae752019-10-04 18:03:17 +0000648function(cxx_add_exception_flags target)
649 if (LIBCXX_ENABLE_EXCEPTIONS)
650 # Catches C++ exceptions only and tells the compiler to assume that extern C
651 # functions never throw a C++ exception.
652 target_add_compile_flags_if_supported(${target} PUBLIC -EHsc)
653 else()
Louis Dionne432ae752019-10-04 18:03:17 +0000654 target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
655 target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
656 endif()
657endfunction()
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000658
659# RTTI flags ==================================================================
Louis Dionne432ae752019-10-04 18:03:17 +0000660function(cxx_add_rtti_flags target)
661 if (NOT LIBCXX_ENABLE_RTTI)
Louis Dionne432ae752019-10-04 18:03:17 +0000662 target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
663 target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
664 endif()
665endfunction()
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000666
Asiri Rathnayake8c2bf452016-09-11 21:46:40 +0000667# Threading flags =============================================================
Asiri Rathnayakeb71c8992017-01-09 10:38:56 +0000668if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXX_ENABLE_SHARED)
Asiri Rathnayake8c2bf452016-09-11 21:46:40 +0000669 # Need to allow unresolved symbols if this is to work with shared library builds
670 if (APPLE)
671 add_link_flags("-undefined dynamic_lookup")
672 else()
673 # Relax this restriction from HandleLLVMOptions
674 string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
675 endif()
676endif()
677
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000678# Assertion flags =============================================================
679define_if(LIBCXX_ENABLE_ASSERTIONS -UNDEBUG)
680define_if_not(LIBCXX_ENABLE_ASSERTIONS -DNDEBUG)
Eric Fiseliere49cdfb2017-02-04 23:22:28 +0000681define_if(LIBCXX_ENABLE_ASSERTIONS -D_LIBCPP_DEBUG=0)
Eric Fiselier7e3ee092017-01-14 07:54:39 +0000682define_if(LIBCXX_DEBUG_BUILD -D_DEBUG)
683if (LIBCXX_ENABLE_ASSERTIONS AND NOT LIBCXX_DEBUG_BUILD)
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000684 # MSVC doesn't like _DEBUG on release builds. See PR 4379.
Eric Fiseliercc1f65c2017-01-14 06:06:47 +0000685 define_if_not(LIBCXX_TARGETING_MSVC -D_DEBUG)
Howard Hinnanta9f69802013-02-25 15:50:36 +0000686endif()
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000687
Eric Fiselier194e0272016-10-14 12:56:52 +0000688# Modules flags ===============================================================
689# FIXME The libc++ sources are fundamentally non-modular. They need special
690# versions of the headers in order to provide C++03 and legacy ABI definitions.
691# NOTE: The public headers can be used with modules in all other contexts.
Louis Dionne432ae752019-10-04 18:03:17 +0000692function(cxx_add_module_flags target)
693 if (LLVM_ENABLE_MODULES)
694 # Ignore that the rest of the modules flags are now unused.
Louis Dionne13c42542019-10-04 19:10:56 +0000695 target_add_compile_flags_if_supported(${target} PUBLIC -Wno-unused-command-line-argument)
696 target_compile_options(${target} PUBLIC -fno-modules)
Louis Dionne432ae752019-10-04 18:03:17 +0000697 endif()
698endfunction()
Eric Fiselier194e0272016-10-14 12:56:52 +0000699
Jonathan Roelofs91b3a5e2015-08-24 21:20:07 +0000700# Sanitizer flags =============================================================
Eric Fiselierb98aa432015-07-29 23:46:55 +0000701
Eric Fiselier02f8e7c352018-11-13 23:08:31 +0000702function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
703 set(SANITIZER_FLAGS)
704 set(USE_SANITIZER "${USE_SANITIZER}")
705 # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
706 # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
707 if (USE_SANITIZER AND NOT MSVC)
708 append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
709 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
710
711 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
712 NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
713 append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
714 endif()
715 if (USE_SANITIZER STREQUAL "Address")
716 append_flags(SANITIZER_FLAGS "-fsanitize=address")
717 elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
718 append_flags(SANITIZER_FLAGS -fsanitize=memory)
719 if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
720 append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
721 endif()
722 elseif (USE_SANITIZER STREQUAL "Undefined")
723 append_flags(SANITIZER_FLAGS "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
Brian Gesiak54176d12020-04-04 13:01:32 -0400724 elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
725 USE_SANITIZER STREQUAL "Undefined;Address")
726 append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
Eric Fiselier02f8e7c352018-11-13 23:08:31 +0000727 elseif (USE_SANITIZER STREQUAL "Thread")
728 append_flags(SANITIZER_FLAGS -fsanitize=thread)
Zola Bridges0f124802020-04-17 10:15:58 -0700729 elseif (USE_SANITIZER STREQUAL "DataFlow")
730 append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
Eric Fiselier02f8e7c352018-11-13 23:08:31 +0000731 else()
732 message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
733 endif()
734 elseif(USE_SANITIZER AND MSVC)
735 message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
736 endif()
737 set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
738endfunction()
739
Chris Bieneman12b134b2016-08-18 21:31:51 +0000740# Configure for sanitizers. If LIBCXX_STANDALONE_BUILD then we have to do
Eric Fiselierb98aa432015-07-29 23:46:55 +0000741# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
Chris Bieneman12b134b2016-08-18 21:31:51 +0000742if (LIBCXX_STANDALONE_BUILD)
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000743 set(LLVM_USE_SANITIZER "" CACHE STRING
744 "Define the sanitizer used to build the library and tests")
Eric Fiselier02f8e7c352018-11-13 23:08:31 +0000745endif()
746get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
747if (LIBCXX_STANDALONE_BUILD AND SANITIZER_FLAGS)
748 add_flags(${SANITIZER_FLAGS})
Eric Fiselierb98aa432015-07-29 23:46:55 +0000749endif()
Eric Fiselierf9f796e2015-10-13 22:12:02 +0000750
Louis Dionne32300872019-10-08 16:26:24 +0000751# Link system libraries =======================================================
752function(cxx_link_system_libraries target)
Zbigniew Sarbinowski5f9be2c2021-02-16 18:02:22 +0000753
754# In order to remove just libc++ from the link step
755# we need to use -nostdlib++ whenever it is supported.
756# Unfortunately this cannot be used universally because for example g++ supports
757# only -nodefaultlibs in which case all libraries will be removed and
758# all libraries but c++ have to be added in manually.
759 if (LIBCXX_SUPPORTS_NOSTDLIBXX_FLAG)
760 target_add_link_flags_if_supported(${target} PRIVATE "-nostdlib++")
761 else()
762 target_add_link_flags_if_supported(${target} PRIVATE "-nodefaultlibs")
763 target_add_compile_flags_if_supported(${target} PRIVATE "/Zl")
764 target_add_link_flags_if_supported(${target} PRIVATE "/nodefaultlib")
765 endif()
Louis Dionne32300872019-10-08 16:26:24 +0000766
Martin Storsjö529a7932021-10-24 01:11:20 +0300767 if (LIBCXX_SUPPORTS_UNWINDLIB_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER)
768 # If we're linking directly against the libunwind that we're building
769 # in the same invocation, don't try to link in the toolchain's
770 # default libunwind (which may be missing still).
771 target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
772 endif()
773
Louis Dionne32300872019-10-08 16:26:24 +0000774 if (LIBCXX_HAS_SYSTEM_LIB)
775 target_link_libraries(${target} PRIVATE System)
776 endif()
777
778 if (LIBCXX_HAS_PTHREAD_LIB)
779 target_link_libraries(${target} PRIVATE pthread)
780 endif()
781
782 if (LIBCXX_HAS_C_LIB)
783 target_link_libraries(${target} PRIVATE c)
784 endif()
785
786 if (LIBCXX_HAS_M_LIB)
787 target_link_libraries(${target} PRIVATE m)
788 endif()
789
790 if (LIBCXX_HAS_RT_LIB)
791 target_link_libraries(${target} PRIVATE rt)
792 endif()
793
794 if (LIBCXX_USE_COMPILER_RT)
795 find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
796 if (LIBCXX_BUILTINS_LIBRARY)
797 target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}")
798 endif()
Shoaib Meenaicc259632020-04-23 21:19:11 -0700799 elseif (LIBCXX_HAS_GCC_LIB)
800 target_link_libraries(${target} PRIVATE gcc)
Louis Dionne32300872019-10-08 16:26:24 +0000801 elseif (LIBCXX_HAS_GCC_S_LIB)
802 target_link_libraries(${target} PRIVATE gcc_s)
803 endif()
804
Louis Dionnee0184352020-06-04 14:54:38 -0400805 if (LIBCXX_HAS_ATOMIC_LIB)
Louis Dionne32300872019-10-08 16:26:24 +0000806 target_link_libraries(${target} PRIVATE atomic)
807 endif()
808
809 if (MINGW)
810 target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
811 endif()
812
813 if (LIBCXX_TARGETING_MSVC)
814 if (LIBCXX_DEBUG_BUILD)
815 set(LIB_SUFFIX "d")
816 else()
817 set(LIB_SUFFIX "")
818 endif()
819
820 target_link_libraries(${target} PRIVATE ucrt${LIB_SUFFIX}) # Universal C runtime
821 target_link_libraries(${target} PRIVATE vcruntime${LIB_SUFFIX}) # C++ runtime
822 target_link_libraries(${target} PRIVATE msvcrt${LIB_SUFFIX}) # C runtime startup files
823 target_link_libraries(${target} PRIVATE msvcprt${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals.
824 # Required for standards-complaint wide character formatting functions
825 # (e.g. `printfw`/`scanfw`)
826 target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers)
827 endif()
Shoaib Meenai076da522020-01-27 17:29:41 -0800828
829 if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21)
830 target_link_libraries(${target} PUBLIC android_support)
831 endif()
Louis Dionne32300872019-10-08 16:26:24 +0000832endfunction()
833
Louis Dionne925d9d22019-10-02 20:07:01 +0000834# Windows-related flags =======================================================
835function(cxx_add_windows_flags target)
836 if(WIN32 AND NOT MINGW)
837 target_compile_definitions(${target} PRIVATE
838 # Ignore the -MSC_VER mismatch, as we may build
839 # with a different compatibility version.
840 _ALLOW_MSC_VER_MISMATCH
841 # Don't check the msvcprt iterator debug levels
842 # as we will define the iterator types; libc++
843 # uses a different macro to identify the debug
844 # level.
845 _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
846 # We are building the c++ runtime, don't pull in
847 # msvcprt.
848 _CRTBLD
849 # Don't warn on the use of "deprecated"
850 # "insecure" functions which are standards
851 # specified.
852 _CRT_SECURE_NO_WARNINGS
853 # Use the ISO conforming behaviour for conversion
854 # in printf, scanf.
855 _CRT_STDIO_ISO_WIDE_SPECIFIERS)
856 endif()
857endfunction()
858
Eric Fiselierf9f796e2015-10-13 22:12:02 +0000859# Configuration file flags =====================================================
Louis Dionnef9a52902018-09-26 08:24:51 +0000860if (NOT LIBCXX_ABI_VERSION EQUAL 1)
Evgeniy Stepanova66a7b32015-10-13 23:48:28 +0000861 config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
862endif()
Eric Fiselierfe13c132018-10-30 21:44:53 +0000863if (NOT LIBCXX_ABI_NAMESPACE STREQUAL "")
864 if (NOT LIBCXX_ABI_NAMESPACE MATCHES "__.*")
Louis Dionne3c9063f2019-10-24 14:16:37 -0700865 message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE must be a reserved identifier.")
Eric Fiselierfe13c132018-10-30 21:44:53 +0000866 endif()
867 if (LIBCXX_ABI_NAMESPACE MATCHES "__[0-9]+$")
868 message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE '${LIBCXX_ABI_NAMESPACE}' is reserved for use by libc++.")
869 endif()
870 config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
871endif()
Evgeniy Stepanova66a7b32015-10-13 23:48:28 +0000872config_define_if(LIBCXX_ABI_UNSTABLE _LIBCPP_ABI_UNSTABLE)
Shoaib Meenaia4a3d402017-10-05 02:18:08 +0000873config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
874config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
Louis Dionne61cd6872018-08-16 12:44:28 +0000875config_define_if(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT)
Eric Fiselierf9f796e2015-10-13 22:12:02 +0000876config_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
877config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
Louis Dionnebe00e882020-11-16 18:13:43 -0500878if (NOT LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION STREQUAL "default")
Louis Dionned0fcdcd2020-05-15 15:58:19 -0400879 config_define("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION)
Eric Fiselier2405bd62019-05-29 02:21:37 +0000880endif()
Ben Craigb9599b12016-05-25 17:40:09 +0000881config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD)
Asiri Rathnayake8c2bf452016-09-11 21:46:40 +0000882config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL)
Martin Storsjobf02a092018-01-05 20:48:29 +0000883config_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32)
Eric Fiselier00f6bea2017-01-06 20:05:40 +0000884config_define_if(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
Vasileios Kalintiris8c58e922015-11-09 10:21:04 +0000885config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
Shoaib Meenai492d7132017-10-09 19:25:17 +0000886config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
Louis Dionne0a06eb92019-08-05 18:29:14 +0000887config_define_if(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_PARALLEL_ALGORITHMS)
Louis Dionne933518f2021-01-18 12:18:18 -0500888config_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
Louis Dionnee0d01292020-10-15 10:32:09 -0400889config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
Louis Dionne88ffc722020-10-09 15:31:05 -0400890config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
Mark de Weverdf2af992021-05-25 20:11:08 +0200891config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE)
Louis Dionnef4c12582021-08-23 15:32:36 -0400892config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS)
Louis Dionne2eadbc82020-11-04 15:01:25 -0500893config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
Mark de Wever71909de2021-07-25 09:18:53 +0200894# Incomplete features get their own specific disabling flags. This makes it
895# easier to grep for target specific flags once the feature is complete.
896config_define_if_not(LIBCXX_ENABLE_INCOMPLETE_FEATURES _LIBCPP_HAS_NO_INCOMPLETE_FORMAT)
897config_define_if_not(LIBCXX_ENABLE_INCOMPLETE_FEATURES _LIBCPP_HAS_NO_INCOMPLETE_RANGES)
Vasileios Kalintiris8c58e922015-11-09 10:21:04 +0000898
Shoaib Meenai8e628122017-10-04 23:17:12 +0000899if (LIBCXX_ABI_DEFINES)
900 set(abi_defines)
901 foreach (abi_define ${LIBCXX_ABI_DEFINES})
902 if (NOT abi_define MATCHES "^_LIBCPP_ABI_")
903 message(SEND_ERROR "Invalid ABI macro ${abi_define} in LIBCXX_ABI_DEFINES")
904 endif()
905 list(APPEND abi_defines "#define ${abi_define}")
906 endforeach()
907 string(REPLACE ";" "\n" abi_defines "${abi_defines}")
908 config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
909endif()
910
Martin Storsjöf68e8902021-12-21 01:19:34 +0200911if (LIBCXX_EXTRA_SITE_DEFINES)
912 set(extra_site_defines)
913 foreach (extra_site_define ${LIBCXX_EXTRA_SITE_DEFINES})
914 # Allow defines such as DEFINE=VAL, transformed into "#define DEFINE VAL".
915 string(REPLACE "=" " " extra_site_define "${extra_site_define}")
916 list(APPEND extra_site_defines "#define ${extra_site_define}")
917 endforeach()
918 string(REPLACE ";" "\n" extra_site_defines "${extra_site_defines}")
919 config_define(${extra_site_defines} _LIBCPP_EXTRA_SITE_DEFINES)
920endif()
921
Eric Fiselier54644212016-09-26 22:19:41 +0000922# By default libc++ on Windows expects to use a shared library, which requires
923# the headers to use DLL import/export semantics. However when building a
924# static library only we modify the headers to disable DLL import/export.
925if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
926 message(STATUS "Generating custom __config for non-DLL Windows build")
Shoaib Meenaifc6100c2016-12-05 19:40:12 +0000927 config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
Eric Fiselier54644212016-09-26 22:19:41 +0000928endif()
929
Martin Storsjö8a73aa82020-10-23 10:54:02 +0300930if (WIN32 AND LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
931 # If linking libcxxabi statically into libcxx, skip the dllimport attributes
932 # on symbols we refer to from libcxxabi.
933 add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
934endif()
935
Louis Dionnefadc84a2019-10-04 22:50:23 +0000936# Setup all common build flags =================================================
937function(cxx_add_common_build_flags target)
938 cxx_add_basic_build_flags(${target})
939 cxx_add_warning_flags(${target})
940 cxx_add_windows_flags(${target})
Louis Dionnefadc84a2019-10-04 22:50:23 +0000941 cxx_add_exception_flags(${target})
942 cxx_add_rtti_flags(${target})
943 cxx_add_module_flags(${target})
Louis Dionne32300872019-10-08 16:26:24 +0000944 cxx_link_system_libraries(${target})
Louis Dionnefadc84a2019-10-04 22:50:23 +0000945endfunction()
946
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000947#===============================================================================
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000948# Setup Source Code And Tests
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000949#===============================================================================
Howard Hinnant6a0d6ce2013-11-15 17:18:57 +0000950add_subdirectory(include)
Petr Hosekf80c4b62019-05-01 06:40:36 +0000951add_subdirectory(src)
Louis Dionne1f8e2862021-07-15 10:19:39 -0400952add_subdirectory(utils)
Eric Fiselierb17bb062015-08-22 19:40:49 +0000953
Eric Fiselier336a1a62018-11-14 20:38:46 +0000954set(LIBCXX_TEST_DEPS "")
955
956if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
957 list(APPEND LIBCXX_TEST_DEPS cxx_experimental)
958endif()
Eric Fiselier336a1a62018-11-14 20:38:46 +0000959
960if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
961 list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)
962endif()
Eric Fiselier28349f92016-11-14 02:43:12 +0000963
Eric Fiselierb08d8b12016-07-19 23:07:03 +0000964if (LIBCXX_INCLUDE_BENCHMARKS)
965 add_subdirectory(benchmarks)
966endif()
Eric Fiselierd94189d2017-03-01 21:53:30 +0000967
Eric Fiselier10ed6c32015-07-30 22:30:34 +0000968if (LIBCXX_INCLUDE_TESTS)
Louis Dionneeb68a0a2020-06-29 11:51:15 -0400969 add_subdirectory(test)
Eric Fiselier28349f92016-11-14 02:43:12 +0000970 add_subdirectory(lib/abi)
Louis Dionneeb68a0a2020-06-29 11:51:15 -0400971 if (LIBCXX_STANDALONE_BUILD)
972 include(AddLLVM) # for get_llvm_lit_path
973 # Make sure the llvm-lit script is generated into the bin directory, and
974 # do it after adding all tests, since the generated script will only work
975 # correctly discovered tests against test locations from the source tree
976 # that have already been discovered.
977 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit
978 ${CMAKE_CURRENT_BINARY_DIR}/llvm-lit)
979 endif()
Zachary Turner50105d22017-09-19 17:19:10 +0000980endif()
981
Eric Fiselierb17bb062015-08-22 19:40:49 +0000982if (LIBCXX_INCLUDE_DOCS)
983 add_subdirectory(docs)
984endif()