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