Revert "[ARM][TypePromotion] Enable by default"
[lldb.git] / libcxx / CMakeLists.txt
1 # See www/CMake.html for instructions on how to build libcxx with CMake.
2
3 #===============================================================================
4 # Setup Project
5 #===============================================================================
6 cmake_minimum_required(VERSION 3.4.3)
7
8 if(POLICY CMP0042)
9   cmake_policy(SET CMP0042 NEW) # Set MACOSX_RPATH=YES by default
10 endif()
11 if(POLICY CMP0022)
12   cmake_policy(SET CMP0022 NEW) # Required when interacting with LLVM and Clang
13 endif()
14 if(POLICY CMP0068)
15   cmake_policy(SET CMP0068 NEW)
16   set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
17 endif()
18
19 # Add path for custom modules
20 set(CMAKE_MODULE_PATH
21   "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
22   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
23   ${CMAKE_MODULE_PATH}
24   )
25
26 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBCXX_STANDALONE_BUILD)
27   project(libcxx CXX C)
28
29   set(PACKAGE_NAME libcxx)
30   set(PACKAGE_VERSION 10.0.0git)
31   set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
32   set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org")
33
34   # Find the LLVM sources and simulate LLVM CMake options.
35   include(HandleOutOfTreeLLVM)
36 endif()
37
38 if (LIBCXX_STANDALONE_BUILD)
39   include(FindPythonInterp)
40   if( NOT PYTHONINTERP_FOUND )
41     message(WARNING "Failed to find python interpreter. "
42                     "The libc++ test suite will be disabled.")
43     set(LLVM_INCLUDE_TESTS OFF)
44   endif()
45 endif()
46
47 # Require out of source build.
48 include(MacroEnsureOutOfSourceBuild)
49 MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
50  "${PROJECT_NAME} requires an out of source build. Please create a separate
51  build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
52  )
53 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
54   message(STATUS "Configuring for clang-cl")
55   set(LIBCXX_TARGETING_CLANG_CL ON)
56 endif()
57
58 if (MSVC)
59   set(LIBCXX_TARGETING_MSVC ON)
60   message(STATUS "Configuring for MSVC")
61 else()
62   set(LIBCXX_TARGETING_MSVC OFF)
63 endif()
64
65 #===============================================================================
66 # Setup CMake Options
67 #===============================================================================
68 include(CMakeDependentOption)
69 include(HandleCompilerRT)
70
71 # Basic options ---------------------------------------------------------------
72 option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." OFF)
73 option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
74 option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
75 option(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON)
76 set(ENABLE_FILESYSTEM_DEFAULT ON)
77 if (WIN32)
78   set(ENABLE_FILESYSTEM_DEFAULT OFF)
79 endif()
80 option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of the main libc++ library"
81     ${ENABLE_FILESYSTEM_DEFAULT})
82 option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
83 option(LIBCXX_ENABLE_PARALLEL_ALGORITHMS "Enable the parallel algorithms library. This requires the PSTL to be available." OFF)
84 option(LIBCXX_TEST_GDB_PRETTY_PRINTERS "Test gdb pretty printers." OFF)
85
86 # Benchmark options -----------------------------------------------------------
87 option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
88
89 set(LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT --benchmark_min_time=0.01)
90 set(LIBCXX_BENCHMARK_TEST_ARGS "${LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT}" CACHE STRING
91     "Arguments to pass when running the benchmarks using check-cxx-benchmarks")
92
93 set(LIBCXX_BENCHMARK_NATIVE_STDLIB "" CACHE STRING
94         "Build the benchmarks against the specified native STL.
95          The value must be one of libc++/libstdc++")
96 set(LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN "" CACHE STRING
97     "Use alternate GCC toolchain when building the native benchmarks")
98
99 if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
100   if (NOT (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++"
101         OR LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++"))
102     message(FATAL_ERROR "Invalid value for LIBCXX_BENCHMARK_NATIVE_STDLIB: "
103             "'${LIBCXX_BENCHMARK_NATIVE_STDLIB}'")
104   endif()
105 endif()
106
107 option(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS})
108 set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
109     "Define suffix of library directory name (32/64)")
110 option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON)
111 option(LIBCXX_INSTALL_LIBRARY "Install the libc++ library." ON)
112 cmake_dependent_option(LIBCXX_INSTALL_STATIC_LIBRARY
113   "Install the static libc++ library." ON
114   "LIBCXX_ENABLE_STATIC;LIBCXX_INSTALL_LIBRARY" OFF)
115 cmake_dependent_option(LIBCXX_INSTALL_SHARED_LIBRARY
116   "Install the shared libc++ library." ON
117   "LIBCXX_ENABLE_SHARED;LIBCXX_INSTALL_LIBRARY" OFF)
118 option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++ support headers." ON)
119 cmake_dependent_option(LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY
120         "Install libc++experimental.a" ON
121         "LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY;LIBCXX_INSTALL_LIBRARY" OFF)
122
123 set(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.")
124 set(LIBCXX_ABI_NAMESPACE "" CACHE STRING "The inline ABI namespace used by libc++. It defaults to __n where `n` is the current ABI version.")
125 option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF)
126 option(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the Itanium ABI.")
127 option(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of the Microsoft ABI.")
128
129
130 set(LIBCXX_HAS_MERGED_TYPEINFO_NAMES_DEFAULT  "" CACHE STRING
131   "Whether typeinfo names are expected to be unique. Defining this option overrides the default configuration in the library.")
132 set(MERGED_TYPEINFO_VALUES ";ON;OFF")
133 set_property(CACHE LIBCXX_HAS_MERGED_TYPEINFO_NAMES_DEFAULT PROPERTY STRINGS ${MERGED_TYPEINFO_DEFAULTS})
134 list(FIND MERGED_TYPEINFO_VALUES "${LIBCXX_HAS_MERGED_TYPEINFO_NAMES_DEFAULT}" IS_VALID_DEFAULT)
135 if (${IS_VALID_DEFAULT} EQUAL -1)
136   message(FATAL_ERROR "Value '${LIBCXX_HAS_MERGED_TYPEINFO_NAMES_DEFAULT}' is not a valid value for
137           LIBCXX_HAS_MERGED_TYPEINFO_NAMES_DEFAULT")
138 endif()
139
140 option(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT "Enable per TU ABI insulation by default. To be used by vendors." OFF)
141 set(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI macros to define in the site config header.")
142 option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
143 set(LIBCXX_LIBCPPABI_VERSION "2" CACHE STRING "Version of libc++abi's ABI to re-export from libc++ when re-exporting is enabled.
144                                                Note that this is not related to the version of libc++'s ABI itself!")
145
146 # ABI Library options ---------------------------------------------------------
147 set(LIBCXX_CXX_ABI "default" CACHE STRING
148     "Specify C++ ABI library to use.")
149 set(CXXABIS none default libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
150 set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
151
152 # FIXME: This is a temporary hack to get the buildbots working while D63883 is in flight.
153 # Without this all the bots fail while building libc++
154 if (DEFINED ENV{USER})
155   if (("$ENV{USER}" STREQUAL "buildbot") OR (("$ENV{USER}" STREQUAL "llvmbb") OR ("$ENV{USER}" STREQUAL "buildslave")))
156     if (LIBCXX_CXX_ABI STREQUAL "libcxxabi" AND NOT DEFINED LIBCXX_CXX_ABI_INCLUDE_PATHS)
157       message(WARNING "OVERRIDING BUILDBOT CONFIG")
158       set(LIBCXX_CXX_ABI "default" CACHE STRING "FIXME" FORCE)
159     endif()
160   endif()
161 endif()
162 # Setup the default options if LIBCXX_CXX_ABI is not specified.
163 if (LIBCXX_CXX_ABI STREQUAL "default")
164   find_path(
165     LIBCXX_LIBCXXABI_INCLUDES_INTERNAL cxxabi.h
166     PATHS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi/include
167           ${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi/include
168           ${LLVM_MAIN_SRC_DIR}/../libcxxabi/include
169     NO_DEFAULT_PATH
170     NO_CMAKE_FIND_ROOT_PATH
171   )
172   if (LIBCXX_TARGETING_MSVC)
173     # FIXME: Figure out how to configure the ABI library on Windows.
174     set(LIBCXX_CXX_ABI_LIBNAME "vcruntime")
175   elseif ((NOT LIBCXX_STANDALONE_BUILD OR HAVE_LIBCXXABI) AND
176           IS_DIRECTORY "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}")
177     set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
178     set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}")
179     set(LIBCXX_CXX_ABI_INTREE 1)
180   elseif (APPLE)
181     set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
182     set(LIBCXX_CXX_ABI_SYSTEM 1)
183   elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
184     set(LIBCXX_CXX_ABI_LIBNAME "libcxxrt")
185     set(LIBCXX_CXX_ABI_INCLUDE_PATHS "/usr/include/c++/v1")
186   else()
187     set(LIBCXX_CXX_ABI_LIBNAME "default")
188   endif()
189 else()
190   set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
191 endif()
192
193 option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY
194   "Use a static copy of the ABI library when linking libc++.
195    This option cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT." OFF)
196
197 cmake_dependent_option(LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY
198   "Statically link the ABI library to static library" ON
199   "LIBCXX_ENABLE_STATIC_ABI_LIBRARY;LIBCXX_ENABLE_STATIC" OFF)
200
201 cmake_dependent_option(LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
202   "Statically link the ABI library to shared library" ON
203   "LIBCXX_ENABLE_STATIC_ABI_LIBRARY;LIBCXX_ENABLE_SHARED" OFF)
204
205 # Generate and install a linker script inplace of libc++.so. The linker script
206 # will link libc++ to the correct ABI library. This option is on by default
207 # on UNIX platforms other than Apple unless 'LIBCXX_ENABLE_STATIC_ABI_LIBRARY'
208 # is on. This option is also disabled when the ABI library is not specified
209 # or is specified to be "none".
210 set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
211 if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
212       AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"
213       AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "default"
214       AND PYTHONINTERP_FOUND
215       AND LIBCXX_ENABLE_SHARED)
216     set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
217 endif()
218
219 option(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
220       "Use and install a linker script for the given ABI library"
221       ${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
222
223 option(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
224     "Build libc++ with definitions for operator new/delete. This option can
225      be used to disable the definitions when libc++abi is expected to provide
226      them" ON)
227
228 # Build libc++abi with libunwind. We need this option to determine whether to
229 # link with libunwind or libgcc_s while running the test cases.
230 option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
231 option(LIBCXXABI_ENABLE_STATIC_UNWINDER "Statically link the LLVM unwinder." OFF)
232
233 # Target options --------------------------------------------------------------
234 option(LIBCXX_BUILD_32_BITS "Build 32 bit libc++." ${LLVM_BUILD_32_BITS})
235 set(LIBCXX_TARGET_TRIPLE "" CACHE STRING "Use alternate target triple.")
236 set(LIBCXX_SYSROOT "" CACHE STRING "Use alternate sysroot.")
237 set(LIBCXX_GCC_TOOLCHAIN "" CACHE STRING "Use alternate GCC toolchain.")
238
239 # Feature options -------------------------------------------------------------
240 option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
241 option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
242 option(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE "Build libc++ with support for the global filesystem namespace." ON)
243 option(LIBCXX_ENABLE_STDIN "Build libc++ with support for stdin/std::cin." ON)
244 option(LIBCXX_ENABLE_STDOUT "Build libc++ with support for stdout/std::cout." ON)
245 option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
246 option(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS "Build libc++ with support for thread-unsafe C functions" ON)
247 option(LIBCXX_ENABLE_MONOTONIC_CLOCK
248   "Build libc++ with support for a monotonic clock.
249    This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
250 option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
251 option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
252 option(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
253 option(LIBCXX_HAS_EXTERNAL_THREAD_API
254   "Build libc++ with an externalized threading API.
255    This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
256 option(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY
257     "Build libc++ with an externalized threading library.
258      This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON" OFF)
259
260 # Misc options ----------------------------------------------------------------
261 # FIXME: Turn -pedantic back ON. It is currently off because it warns
262 # about #include_next which is used everywhere.
263 option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
264 option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
265 option(LIBCXX_DISABLE_MACRO_CONFLICT_WARNINGS "Disable #warnings about conflicting macros." OFF)
266
267 option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
268 set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
269     "The Profile-rt library used to build with code coverage")
270
271 # Don't allow a user to accidentally overwrite the system libc++ installation on Darwin.
272 # If the user specifies -DCMAKE_INSTALL_PREFIX=/usr the install rules for libc++
273 # will not be generated and a warning will be issued.
274 option(LIBCXX_OVERRIDE_DARWIN_INSTALL "Enable overwriting darwins libc++ installation." OFF)
275 mark_as_advanced(LIBCXX_OVERRIDE_DARWIN_INSTALL) # Don't show this option by default.
276
277 if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT LIBCXX_OVERRIDE_DARWIN_INSTALL)
278   if ("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
279     message(WARNING "Disabling libc++ install rules because installation would "
280                     "overwrite the systems installation. Configure with "
281                     "-DLIBCXX_OVERRIDE_DARWIN_INSTALL=ON to suppress this behaviour.")
282     mark_as_advanced(CLEAR LIBCXX_OVERRIDE_DARWIN_INSTALL) # Show the override option.
283     set(LIBCXX_INSTALL_HEADERS OFF)
284     set(LIBCXX_INSTALL_LIBRARY OFF)
285   endif()
286 endif()
287
288 set(LIBCXX_CONFIGURE_IDE_DEFAULT OFF)
289 if (XCODE OR MSVC_IDE)
290   set(LIBCXX_CONFIGURE_IDE_DEFAULT ON)
291 endif()
292 option(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE"
293       ${LIBCXX_CONFIGURE_IDE_DEFAULT})
294
295 option(LIBCXX_HERMETIC_STATIC_LIBRARY
296   "Do not export any symbols from the static library." OFF)
297
298 #===============================================================================
299 # Check option configurations
300 #===============================================================================
301
302 # Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when
303 # LIBCXX_ENABLE_THREADS is on.
304 if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
305   message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF"
306                       " when LIBCXX_ENABLE_THREADS is also set to OFF.")
307 endif()
308
309 if(NOT LIBCXX_ENABLE_THREADS)
310   if(LIBCXX_HAS_PTHREAD_API)
311     message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
312                         " when LIBCXX_ENABLE_THREADS is also set to ON.")
313   endif()
314   if(LIBCXX_HAS_EXTERNAL_THREAD_API)
315     message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
316                         " when LIBCXX_ENABLE_THREADS is also set to ON.")
317   endif()
318   if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
319     message(FATAL_ERROR "LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY can only be set "
320                         "to ON when LIBCXX_ENABLE_THREADS is also set to ON.")
321   endif()
322   if (LIBCXX_HAS_WIN32_THREAD_API)
323     message(FATAL_ERROR "LIBCXX_HAS_WIN32_THREAD_API can only be set to ON"
324                         " when LIBCXX_ENABLE_THREADS is also set to ON.")
325   endif()
326
327 endif()
328
329 if (LIBCXX_HAS_EXTERNAL_THREAD_API)
330   if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
331     message(FATAL_ERROR "The options LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY and "
332                         "LIBCXX_HAS_EXTERNAL_THREAD_API cannot both be ON at "
333                         "the same time")
334   endif()
335   if (LIBCXX_HAS_PTHREAD_API)
336     message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
337                         "and LIBCXX_HAS_PTHREAD_API cannot be both"
338                         "set to ON at the same time.")
339   endif()
340   if (LIBCXX_HAS_WIN32_THREAD_API)
341     message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
342                         "and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
343                         "set to ON at the same time.")
344   endif()
345 endif()
346
347 if (LIBCXX_HAS_PTHREAD_API)
348   if (LIBCXX_HAS_WIN32_THREAD_API)
349     message(FATAL_ERROR "The options LIBCXX_HAS_PTHREAD_API"
350                         "and LIBCXX_HAS_WIN32_THREAD_API cannot be both"
351                         "set to ON at the same time.")
352   endif()
353 endif()
354
355 # Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
356 # is ON.
357 if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
358   message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
359 endif()
360
361 # Set LIBCXX_BUILD_32_BITS to (LIBCXX_BUILD_32_BITS OR LLVM_BUILD_32_BITS)
362 # and check that we can build with 32 bits if requested.
363 if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32)
364   if (LIBCXX_BUILD_32_BITS AND NOT LLVM_BUILD_32_BITS) # Don't duplicate the output from LLVM
365     message(STATUS "Building 32 bits executables and libraries.")
366   endif()
367 elseif(LIBCXX_BUILD_32_BITS)
368   message(FATAL_ERROR "LIBCXX_BUILD_32_BITS=ON is not supported on this platform.")
369 endif()
370
371 # Warn users that LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option.
372 if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
373   message(WARNING "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option")
374   if (LIBCXX_ENABLE_STATIC AND NOT PYTHONINTERP_FOUND)
375     message(FATAL_ERROR "LIBCXX_ENABLE_STATIC_ABI_LIBRARY requires python but it was not found.")
376   endif()
377 endif()
378
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()
387
388 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
389     message(FATAL_ERROR "Conflicting options given.
390         LIBCXX_ENABLE_STATIC_ABI_LIBRARY cannot be specified with
391         LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
392 endif()
393
394 if (LIBCXX_HAS_MUSL_LIBC AND NOT LIBCXX_INSTALL_SUPPORT_HEADERS)
395   message(FATAL_ERROR "LIBCXX_INSTALL_SUPPORT_HEADERS can not be turned off"
396                       "when building for Musl with LIBCXX_HAS_MUSL_LIBC.")
397 endif()
398
399 if (LIBCXX_ABI_FORCE_ITANIUM AND LIBCXX_ABI_FORCE_MICROSOFT)
400   message(FATAL_ERROR "Only one of LIBCXX_ABI_FORCE_ITANIUM and LIBCXX_ABI_FORCE_MICROSOFT can be specified.")
401 endif ()
402
403 #===============================================================================
404 # Configure System
405 #===============================================================================
406
407 set(LIBCXX_COMPILER    ${CMAKE_CXX_COMPILER})
408 set(LIBCXX_SOURCE_DIR  ${CMAKE_CURRENT_SOURCE_DIR})
409 set(LIBCXX_BINARY_DIR  ${CMAKE_CURRENT_BINARY_DIR})
410 set(LIBCXX_BINARY_INCLUDE_DIR "${LIBCXX_BINARY_DIR}/include/c++build")
411
412 string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION
413        ${PACKAGE_VERSION})
414
415 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
416   set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++)
417   set(LIBCXX_HEADER_DIR ${LLVM_BINARY_DIR})
418   set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++)
419   if(LIBCXX_LIBDIR_SUBDIR)
420     string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
421     string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
422   endif()
423 elseif(LLVM_LIBRARY_OUTPUT_INTDIR)
424   set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
425   set(LIBCXX_HEADER_DIR  ${LLVM_BINARY_DIR})
426   set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX})
427 else()
428   set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
429   set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX})
430 endif()
431
432 file(MAKE_DIRECTORY "${LIBCXX_BINARY_INCLUDE_DIR}")
433
434 set(LIBCXX_INSTALL_PREFIX "" CACHE STRING "Define libc++ destination prefix.")
435 set(LIBCXX_INSTALL_HEADER_PREFIX "" CACHE STRING "Define libc++ header destination prefix.")
436
437 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
438 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
439 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
440
441 # Declare libc++ configuration variables.
442 # They are intended for use as follows:
443 # LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
444 # LIBCXX_COMPILE_FLAGS: Compile only flags.
445 # LIBCXX_LINK_FLAGS: Linker only flags.
446 # LIBCXX_LIBRARIES: libraries libc++ is linked to.
447 set(LIBCXX_COMPILE_FLAGS "")
448 set(LIBCXX_LINK_FLAGS "")
449 set(LIBCXX_LIBRARIES "")
450
451 # Include macros for adding and removing libc++ flags.
452 include(HandleLibcxxFlags)
453
454 # Target flags ================================================================
455 # These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that
456 # 'config-ix' use them during feature checks. It also adds them to both
457 # 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS'
458 add_target_flags_if(LIBCXX_BUILD_32_BITS "-m32")
459
460 if(LIBCXX_TARGET_TRIPLE)
461   add_target_flags("--target=${LIBCXX_TARGET_TRIPLE}")
462 elseif(CMAKE_CXX_COMPILER_TARGET)
463   set(LIBCXX_TARGET_TRIPLE "${CMAKE_CXX_COMPILER_TARGET}")
464 endif()
465 if(LIBCXX_SYSROOT)
466   add_target_flags("--sysroot=${LIBCXX_SYSROOT}")
467 elseif(CMAKE_SYSROOT)
468   set(LIBCXX_SYSROOT "${CMAKE_SYSROOT}")
469 endif()
470 if(LIBCXX_GCC_TOOLCHAIN)
471   add_target_flags("--gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}")
472 elseif(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN)
473   set(LIBCXX_GCC_TOOLCHAIN "${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
474 endif()
475
476 if(LIBCXX_TARGET_TRIPLE)
477   set(TARGET_TRIPLE "${LIBCXX_TARGET_TRIPLE}")
478 endif()
479
480 # Configure compiler.
481 include(config-ix)
482
483 # Configure coverage options.
484 if (LIBCXX_GENERATE_COVERAGE)
485   include(CodeCoverage)
486   set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE)
487 endif()
488
489 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
490 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
491   set(LIBCXX_DEBUG_BUILD ON)
492 else()
493   set(LIBCXX_DEBUG_BUILD OFF)
494 endif()
495
496 #===============================================================================
497 # Setup Compiler Flags
498 #===============================================================================
499
500 include(HandleLibCXXABI) # Setup the ABI library flags
501
502 if (NOT LIBCXX_STANDALONE_BUILD)
503   # Remove flags that may have snuck in.
504   remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
505                -lc++abi)
506 endif()
507 remove_flags(-stdlib=libc++ -stdlib=libstdc++)
508
509 # FIXME: Remove all debug flags and flags that change which Windows
510 # default libraries are linked. Currently we only support linking the
511 # non-debug DLLs
512 remove_flags("/D_DEBUG" "/MTd" "/MDd" "/MT" "/Md")
513
514 # FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
515 # Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
516 # so they don't get transformed into -Wno and -errors respectively.
517 remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
518
519 # Required flags ==============================================================
520 function(cxx_add_basic_build_flags target)
521
522   # Require C++14 for all targets. C++14 is needed to ensure constant
523   # initialization for certain globals (ex global memory resources).
524   set_target_properties(${target} PROPERTIES
525     CXX_STANDARD 14
526     CXX_STANDARD_REQUIRED YES
527     CXX_EXTENSIONS NO)
528
529   # On all systems the system c++ standard library headers need to be excluded.
530   # MSVC only has -X, which disables all default includes; including the crt.
531   # Thus, we do nothing and hope we don't accidentally include any of the C++
532   # headers
533   target_add_compile_flags_if_supported(${target} PUBLIC -nostdinc++)
534
535   # Hide all inline function definitions which have not explicitly been marked
536   # visible. This prevents new definitions for inline functions from appearing in
537   # the dylib when get ODR used by another function.
538   target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility-inlines-hidden)
539
540   # Our visibility annotations are not quite right for non-Clang compilers,
541   # so we end up not exporting all the symbols we should. In the future, we
542   # can improve the situation by providing an explicit list of exported
543   # symbols on all compilers.
544   if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
545     target_add_compile_flags_if_supported(${target} PRIVATE -fvisibility=hidden)
546   endif()
547
548   if (LIBCXX_CONFIGURE_IDE)
549     # This simply allows IDE to process <experimental/coroutine>
550     target_add_compile_flags_if_supported(${target} PRIVATE -fcoroutines-ts)
551   endif()
552
553   # Let the library headers know they are currently being used to build the
554   # library.
555   target_compile_definitions(${target} PRIVATE -D_LIBCPP_BUILDING_LIBRARY)
556
557   if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS)
558     target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS)
559   endif()
560
561   if (LIBCXX_HAS_COMMENT_LIB_PRAGMA)
562     if (LIBCXX_HAS_PTHREAD_LIB)
563       target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_PTHREAD_LIB)
564     endif()
565     if (LIBCXX_HAS_RT_LIB)
566       target_compile_definitions(${target} PRIVATE -D_LIBCPP_LINK_RT_LIB)
567     endif()
568   endif()
569 endfunction()
570
571 # Warning flags ===============================================================
572 function(cxx_add_warning_flags target)
573   target_compile_definitions(${target} PUBLIC -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
574   target_add_compile_flags_if_supported(${target} PRIVATE -Wall -Wextra -W -Wwrite-strings
575                                                           -Wno-unused-parameter -Wno-long-long
576                                                           -Werror=return-type -Wextra-semi)
577   if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
578     target_add_compile_flags_if_supported(${target} PRIVATE
579       -Wno-user-defined-literals
580       -Wno-covered-switch-default
581       -Wno-ignored-attributes # FIXME: Caused by _LIBCPP_NODEBUG_TYPE not being supported on older clangs
582     )
583     if (LIBCXX_TARGETING_CLANG_CL)
584       target_add_compile_flags_if_supported(${target} PRIVATE
585         -Wno-c++98-compat
586         -Wno-c++98-compat-pedantic
587         -Wno-c++11-compat
588         -Wno-undef
589         -Wno-reserved-id-macro
590         -Wno-gnu-include-next
591         -Wno-gcc-compat # For ignoring "'diagnose_if' is a clang extension" warnings
592         -Wno-zero-as-null-pointer-constant # FIXME: Remove this and fix all occurrences.
593         -Wno-deprecated-dynamic-exception-spec # For auto_ptr
594         -Wno-sign-conversion
595         -Wno-old-style-cast
596         -Wno-deprecated # FIXME: Remove this and fix all occurrences.
597         -Wno-shift-sign-overflow # FIXME: Why do we need this with clang-cl but not clang?
598         -Wno-double-promotion # FIXME: remove me
599       )
600     endif()
601   elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
602     target_add_compile_flags_if_supported(${target} PRIVATE
603       -Wno-literal-suffix
604       -Wno-c++14-compat
605       -Wno-noexcept-type)
606   endif()
607   if (LIBCXX_ENABLE_WERROR)
608     target_add_compile_flags_if_supported(${target} PRIVATE -Werror)
609     target_add_compile_flags_if_supported(${target} PRIVATE -WX)
610   else()
611     # TODO(EricWF) Remove this. We shouldn't be suppressing errors when -Werror is
612     # added elsewhere.
613     target_add_compile_flags_if_supported(${target} PRIVATE -Wno-error)
614   endif()
615   if (LIBCXX_ENABLE_PEDANTIC)
616     target_add_compile_flags_if_supported(${target} PRIVATE -pedantic)
617   endif()
618   if (LIBCXX_DISABLE_MACRO_CONFLICT_WARNINGS)
619     target_compile_definitions(${target} PRIVATE -D_LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS)
620   endif()
621 endfunction()
622
623 # Exception flags =============================================================
624 function(cxx_add_exception_flags target)
625   if (LIBCXX_ENABLE_EXCEPTIONS)
626     # Catches C++ exceptions only and tells the compiler to assume that extern C
627     # functions never throw a C++ exception.
628     target_add_compile_flags_if_supported(${target} PUBLIC -EHsc)
629   else()
630     target_compile_definitions(${target} PUBLIC -D_LIBCPP_NO_EXCEPTIONS)
631     target_add_compile_flags_if_supported(${target} PUBLIC -EHs- -EHa-)
632     target_add_compile_flags_if_supported(${target} PUBLIC -fno-exceptions)
633   endif()
634 endfunction()
635
636 # RTTI flags ==================================================================
637 function(cxx_add_rtti_flags target)
638   if (NOT LIBCXX_ENABLE_RTTI)
639     target_compile_definitions(${target} PUBLIC -D_LIBCPP_NO_RTTI)
640     target_add_compile_flags_if_supported(${target} PUBLIC -GR-)
641     target_add_compile_flags_if_supported(${target} PUBLIC -fno-rtti)
642   endif()
643 endfunction()
644
645 # Threading flags =============================================================
646 if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXX_ENABLE_SHARED)
647   # Need to allow unresolved symbols if this is to work with shared library builds
648   if (APPLE)
649     add_link_flags("-undefined dynamic_lookup")
650   else()
651     # Relax this restriction from HandleLLVMOptions
652     string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
653   endif()
654 endif()
655
656 # Assertion flags =============================================================
657 define_if(LIBCXX_ENABLE_ASSERTIONS -UNDEBUG)
658 define_if_not(LIBCXX_ENABLE_ASSERTIONS -DNDEBUG)
659 define_if(LIBCXX_ENABLE_ASSERTIONS -D_LIBCPP_DEBUG=0)
660 define_if(LIBCXX_DEBUG_BUILD -D_DEBUG)
661 if (LIBCXX_ENABLE_ASSERTIONS AND NOT LIBCXX_DEBUG_BUILD)
662   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
663   define_if_not(LIBCXX_TARGETING_MSVC -D_DEBUG)
664 endif()
665
666 # Modules flags ===============================================================
667 # FIXME The libc++ sources are fundamentally non-modular. They need special
668 # versions of the headers in order to provide C++03 and legacy ABI definitions.
669 # NOTE: The public headers can be used with modules in all other contexts.
670 function(cxx_add_module_flags target)
671   if (LLVM_ENABLE_MODULES)
672     # Ignore that the rest of the modules flags are now unused.
673     target_add_compile_flags_if_supported(${target} PUBLIC -Wno-unused-command-line-argument)
674     target_compile_options(${target} PUBLIC -fno-modules)
675   endif()
676 endfunction()
677
678 # Sanitizer flags =============================================================
679
680 function(get_sanitizer_flags OUT_VAR  USE_SANITIZER)
681   set(SANITIZER_FLAGS)
682   set(USE_SANITIZER "${USE_SANITIZER}")
683   # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
684   # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
685   if (USE_SANITIZER AND NOT MSVC)
686     append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
687     append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
688
689     if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
690             NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
691       append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
692     endif()
693     if (USE_SANITIZER STREQUAL "Address")
694       append_flags(SANITIZER_FLAGS "-fsanitize=address")
695     elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
696       append_flags(SANITIZER_FLAGS -fsanitize=memory)
697       if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
698         append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
699       endif()
700     elseif (USE_SANITIZER STREQUAL "Undefined")
701       append_flags(SANITIZER_FLAGS "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
702     elseif (USE_SANITIZER STREQUAL "Thread")
703       append_flags(SANITIZER_FLAGS -fsanitize=thread)
704     else()
705       message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
706     endif()
707   elseif(USE_SANITIZER AND MSVC)
708     message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
709   endif()
710   set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
711 endfunction()
712
713 # Configure for sanitizers. If LIBCXX_STANDALONE_BUILD then we have to do
714 # the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
715 if (LIBCXX_STANDALONE_BUILD)
716   set(LLVM_USE_SANITIZER "" CACHE STRING
717       "Define the sanitizer used to build the library and tests")
718 endif()
719 get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
720 if (LIBCXX_STANDALONE_BUILD AND SANITIZER_FLAGS)
721   add_flags(${SANITIZER_FLAGS})
722 endif()
723
724 # Link system libraries =======================================================
725 function(cxx_link_system_libraries target)
726   target_add_link_flags_if_supported(${target} PRIVATE "-nodefaultlibs")
727   target_add_compile_flags_if_supported(${target} PRIVATE "/Zl")
728   target_add_link_flags_if_supported(${target} PRIVATE "/nodefaultlib")
729
730   if (LIBCXX_HAS_SYSTEM_LIB)
731     target_link_libraries(${target} PRIVATE System)
732   endif()
733
734   if (LIBCXX_HAS_PTHREAD_LIB)
735     target_link_libraries(${target} PRIVATE pthread)
736   endif()
737
738   if (LIBCXX_HAS_C_LIB)
739     target_link_libraries(${target} PRIVATE c)
740   endif()
741
742   if (LIBCXX_HAS_M_LIB)
743     target_link_libraries(${target} PRIVATE m)
744   endif()
745
746   if (LIBCXX_HAS_RT_LIB)
747     target_link_libraries(${target} PRIVATE rt)
748   endif()
749
750   if (LIBCXX_USE_COMPILER_RT)
751     find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
752     if (LIBCXX_BUILTINS_LIBRARY)
753       target_link_libraries(${target} PRIVATE "${LIBCXX_BUILTINS_LIBRARY}")
754     endif()
755   elseif (LIBCXX_HAS_GCC_S_LIB)
756     target_link_libraries(${target} PRIVATE gcc_s)
757   endif()
758
759   if (LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
760     target_link_libraries(${target} PRIVATE atomic)
761   endif()
762
763   if (MINGW)
764     target_link_libraries(${target} PRIVATE "${MINGW_LIBRARIES}")
765   endif()
766
767   if (LIBCXX_TARGETING_MSVC)
768     if (LIBCXX_DEBUG_BUILD)
769       set(LIB_SUFFIX "d")
770     else()
771       set(LIB_SUFFIX "")
772     endif()
773
774     target_link_libraries(${target} PRIVATE ucrt${LIB_SUFFIX}) # Universal C runtime
775     target_link_libraries(${target} PRIVATE vcruntime${LIB_SUFFIX}) # C++ runtime
776     target_link_libraries(${target} PRIVATE msvcrt${LIB_SUFFIX}) # C runtime startup files
777     target_link_libraries(${target} PRIVATE msvcprt${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals.
778     # Required for standards-complaint wide character formatting functions
779     # (e.g. `printfw`/`scanfw`)
780     target_link_libraries(${target} PRIVATE iso_stdio_wide_specifiers)
781   endif()
782 endfunction()
783
784 # Windows-related flags =======================================================
785 function(cxx_add_windows_flags target)
786   if(WIN32 AND NOT MINGW)
787     target_compile_definitions(${target} PRIVATE
788                                  # Ignore the -MSC_VER mismatch, as we may build
789                                  # with a different compatibility version.
790                                  _ALLOW_MSC_VER_MISMATCH
791                                  # Don't check the msvcprt iterator debug levels
792                                  # as we will define the iterator types; libc++
793                                  # uses a different macro to identify the debug
794                                  # level.
795                                  _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
796                                  # We are building the c++ runtime, don't pull in
797                                  # msvcprt.
798                                  _CRTBLD
799                                  # Don't warn on the use of "deprecated"
800                                  # "insecure" functions which are standards
801                                  # specified.
802                                  _CRT_SECURE_NO_WARNINGS
803                                  # Use the ISO conforming behaviour for conversion
804                                  # in printf, scanf.
805                                  _CRT_STDIO_ISO_WIDE_SPECIFIERS)
806   endif()
807 endfunction()
808
809 # Configuration file flags =====================================================
810 if (NOT LIBCXX_ABI_VERSION EQUAL 1)
811   config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
812 endif()
813 if (NOT LIBCXX_ABI_NAMESPACE STREQUAL "")
814   if (NOT LIBCXX_ABI_NAMESPACE MATCHES "__.*")
815     message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE must be a reserved identifier.")
816   endif()
817   if (LIBCXX_ABI_NAMESPACE MATCHES "__[0-9]+$")
818     message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE '${LIBCXX_ABI_NAMESPACE}' is reserved for use by libc++.")
819   endif()
820   config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
821 endif()
822 config_define_if(LIBCXX_ABI_UNSTABLE _LIBCPP_ABI_UNSTABLE)
823 config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
824 config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
825 config_define_if(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT)
826 config_define_if_not(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE)
827 config_define_if_not(LIBCXX_ENABLE_STDIN _LIBCPP_HAS_NO_STDIN)
828 config_define_if_not(LIBCXX_ENABLE_STDOUT _LIBCPP_HAS_NO_STDOUT)
829 config_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
830 config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
831 config_define_if_not(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS)
832 if (NOT LIBCXX_HAS_MERGED_TYPEINFO_NAMES_DEFAULT STREQUAL "")
833   config_define("${LIBCXX_HAS_MERGED_TYPEINFO_NAMES_DEFAULT}" _LIBCPP_HAS_MERGED_TYPEINFO_NAMES_DEFAULT)
834 endif()
835
836 config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD)
837 config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL)
838 config_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32)
839 config_define_if(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
840 config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
841 config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
842 config_define_if(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_PARALLEL_ALGORITHMS)
843
844 if (LIBCXX_ABI_DEFINES)
845   set(abi_defines)
846   foreach (abi_define ${LIBCXX_ABI_DEFINES})
847     if (NOT abi_define MATCHES "^_LIBCPP_ABI_")
848       message(SEND_ERROR "Invalid ABI macro ${abi_define} in LIBCXX_ABI_DEFINES")
849     endif()
850     list(APPEND abi_defines "#define ${abi_define}")
851   endforeach()
852   string(REPLACE ";" "\n" abi_defines "${abi_defines}")
853   config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
854 endif()
855
856 # By default libc++ on Windows expects to use a shared library, which requires
857 # the headers to use DLL import/export semantics. However when building a
858 # static library only we modify the headers to disable DLL import/export.
859 if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
860   message(STATUS "Generating custom __config for non-DLL Windows build")
861   config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
862 endif()
863
864 set(site_config_path "${LIBCXX_BINARY_DIR}/__config_site")
865 if (LIBCXX_NEEDS_SITE_CONFIG)
866   configure_file("include/__config_site.in"
867                  "${site_config_path}"
868                  @ONLY)
869 elseif(EXISTS "${site_config_path}")
870   message(STATUS "Removing stale site configuration ${site_config_path}")
871   file(REMOVE "${site_config_path}")
872 endif()
873
874 function(cxx_add_config_site target)
875   if (LIBCXX_NEEDS_SITE_CONFIG)
876     if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
877       target_compile_options(${target} PUBLIC "/FI\"${site_config_path}\"")
878     else()
879       target_compile_options(${target} PUBLIC -include "${site_config_path}")
880     endif()
881   endif()
882 endfunction()
883
884 # Setup all common build flags =================================================
885 function(cxx_add_common_build_flags target)
886   cxx_add_basic_build_flags(${target})
887   cxx_add_warning_flags(${target})
888   cxx_add_windows_flags(${target})
889   cxx_add_config_site(${target})
890   cxx_add_exception_flags(${target})
891   cxx_add_rtti_flags(${target})
892   cxx_add_module_flags(${target})
893   cxx_link_system_libraries(${target})
894 endfunction()
895
896 #===============================================================================
897 # Setup Source Code And Tests
898 #===============================================================================
899 include_directories(include)
900 add_subdirectory(include)
901 add_subdirectory(src)
902
903 set(LIBCXX_TEST_DEPS "")
904
905 if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
906   list(APPEND LIBCXX_TEST_DEPS cxx_experimental)
907 endif()
908
909 if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
910   list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)
911 endif()
912
913 if (LIBCXX_INCLUDE_BENCHMARKS)
914   add_subdirectory(benchmarks)
915 endif()
916
917 # Create the lit.site.cfg file even when LIBCXX_INCLUDE_TESTS is OFF or
918 # LLVM_FOUND is OFF. This allows users to run the tests manually using
919 # LIT without requiring a full LLVM checkout.
920 #
921 # However, since some submission systems strip test/ subdirectories, check for
922 # it before adding it.
923
924 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/test")
925   add_subdirectory(test)
926 endif()
927 if (LIBCXX_INCLUDE_TESTS)
928   add_subdirectory(lib/abi)
929 endif()
930
931 if (LIBCXX_STANDALONE_BUILD AND EXISTS "${LLVM_MAIN_SRC_DIR}/utils/llvm-lit")
932   include(AddLLVM) # for get_llvm_lit_path
933   # Make sure the llvm-lit script is generated into the bin directory, and do
934   # it after adding all tests, since the generated script will only work
935   # correctly discovered tests against test locations from the source tree that
936   # have already been discovered.
937   add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit
938                    ${CMAKE_CURRENT_BINARY_DIR}/llvm-lit)
939 endif()
940
941 if (LIBCXX_INCLUDE_DOCS)
942   add_subdirectory(docs)
943 endif()