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