1# See www/CMake.html for instructions on how to build libcxx with CMake. 2 3#=============================================================================== 4# Setup Project 5#=============================================================================== 6cmake_minimum_required(VERSION 2.8) 7 8if(POLICY CMP0042) 9 cmake_policy(SET CMP0042 NEW) # Set MACOSX_RPATH=YES by default 10endif() 11if(POLICY CMP0022) 12 cmake_policy(SET CMP0022 NEW) # Required when interacting with LLVM and Clang 13endif() 14 15project(libcxx CXX C) 16 17set(PACKAGE_NAME libcxx) 18set(PACKAGE_VERSION trunk-svn) 19set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") 20set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org") 21 22# Add path for custom modules 23set(CMAKE_MODULE_PATH 24 "${CMAKE_CURRENT_SOURCE_DIR}/cmake" 25 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" 26 ${CMAKE_MODULE_PATH} 27 ) 28 29# Require out of source build. 30include(MacroEnsureOutOfSourceBuild) 31MACRO_ENSURE_OUT_OF_SOURCE_BUILD( 32 "${PROJECT_NAME} requires an out of source build. Please create a separate 33 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there." 34 ) 35 36# Find the LLVM sources and simulate LLVM CMake options. 37include(HandleOutOfTreeLLVM) 38if (LIBCXX_BUILT_STANDALONE AND NOT LLVM_FOUND) 39 message(WARNING "UNSUPPORTED LIBCXX CONFIGURATION DETECTED: " 40 "llvm-config not found and LLVM_PATH not defined.\n" 41 "Reconfigure with -DLLVM_CONFIG=path/to/llvm-config " 42 "or -DLLVM_PATH=path/to/llvm-source-root.") 43endif() 44 45 46#=============================================================================== 47# Setup CMake Options 48#=============================================================================== 49 50# Basic options --------------------------------------------------------------- 51option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON) 52option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON) 53 54option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS}) 55set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING 56 "Define suffix of library directory name (32/64)") 57option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON) 58option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++ support headers." ON) 59 60# ABI Library options --------------------------------------------------------- 61set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING 62 "Specify C++ ABI library to use." FORCE) 63set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++) 64set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS}) 65 66option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "Statically link the ABI library" OFF) 67 68# Build libc++abi with libunwind. We need this option to determine whether to 69# link with libunwind or libgcc_s while running the test cases. 70option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF) 71 72# Target options -------------------------------------------------------------- 73option(LIBCXX_BUILD_32_BITS "Build 32 bit libc++." ${LLVM_BUILD_32_BITS}) 74set(LIBCXX_SYSROOT "" CACHE STRING "Use alternate sysroot.") 75set(LIBCXX_GCC_TOOLCHAIN "" CACHE STRING "Use alternate GCC toolchain.") 76 77# Feature options ------------------------------------------------------------- 78option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON) 79option(LIBCXX_ENABLE_RTTI "Use run time type information." ON) 80option(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE "Build libc++ with support for the global filesystem namespace." ON) 81option(LIBCXX_ENABLE_STDIN "Build libc++ with support for stdin/std::cin." ON) 82option(LIBCXX_ENABLE_STDOUT "Build libc++ with support for stdout/std::cout." ON) 83option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON) 84option(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS "Build libc++ with support for thread-unsafe C functions" ON) 85option(LIBCXX_ENABLE_MONOTONIC_CLOCK 86 "Build libc++ with support for a monotonic clock. 87 This option may only be used when LIBCXX_ENABLE_THREADS=OFF." ON) 88 89# Misc options ---------------------------------------------------------------- 90option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) 91option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) 92 93option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF) 94set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING 95 "The Profile-rt library used to build with code coverage") 96 97#=============================================================================== 98# Check option configurations 99#=============================================================================== 100 101# Ensure LIBCXX_ENABLE_MONOTONIC_CLOCK is set to ON only when 102# LIBCXX_ENABLE_THREADS is on. 103if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK) 104 message(FATAL_ERROR "LIBCXX_ENABLE_MONOTONIC_CLOCK can only be set to OFF" 105 " when LIBCXX_ENABLE_THREADS is also set to OFF.") 106endif() 107 108# Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE 109# is ON. 110if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE) 111 message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE") 112endif() 113 114# Set LIBCXX_BUILD_32_BITS to (LIBCXX_BUILD_32_BITS OR LLVM_BUILD_32_BITS) 115# and check that we can build with 32 bits if requested. 116if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32) 117 if (LIBCXX_BUILD_32_BITS AND NOT LLVM_BUILD_32_BITS) # Don't duplicate the output from LLVM 118 message(STATUS "Building 32 bits executables and libraries.") 119 endif() 120elseif(LIBCXX_BUILD_32_BITS) 121 message(FATAL_ERROR "LIBCXX_BUILD_32_BITS=ON is not supported on this platform.") 122endif() 123 124# Check that this option is not enabled on Apple and emit a usage warning. 125if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY) 126 if (APPLE) 127 message(FATAL_ERROR "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is not supported on OS X") 128 else() 129 message(WARNING "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option") 130 endif() 131endif() 132 133#=============================================================================== 134# Configure System 135#=============================================================================== 136 137set(LIBCXX_COMPILER ${CMAKE_CXX_COMPILER}) 138set(LIBCXX_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 139set(LIBCXX_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) 140set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX}) 141 142set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR}) 143set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR}) 144 145# Declare libc++ configuration variables. 146# They are intended for use as follows: 147# LIBCXX_CXX_FLAGS: General flags for both the compiler and linker. 148# LIBCXX_COMPILE_FLAGS: Compile only flags. 149# LIBCXX_LINK_FLAGS: Linker only flags. 150set(LIBCXX_COMPILE_FLAGS "") 151set(LIBCXX_LINK_FLAGS "") 152set(LIBCXX_LIBRARIES "") 153 154# Configure compiler. 155include(config-ix) 156 157# Configure coverage options. 158if (LIBCXX_GENERATE_COVERAGE) 159 include(CodeCoverage) 160 set(CMAKE_BUILD_TYPE "COVERAGE" CACHE STRING "" FORCE) 161endif() 162 163string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) 164 165#=============================================================================== 166# Setup Compiler Flags 167#=============================================================================== 168 169include(HandleLibCXXABI) # Steup the ABI library flags 170 171# Include macros for adding and removing libc++ flags. 172include(HandleLibcxxFlags) 173 174# Remove flags that may have snuck in. 175remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG 176 -stdlib=libc++ -stdlib=libstdc++ -lc++abi -m32) 177 178# Required flags ============================================================== 179add_compile_flags_if_supported(-std=c++11) 180if (NOT MSVC AND NOT LIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG) 181 message(FATAL_ERROR "C++11 is required but the compiler does not support -std=c++11") 182endif() 183 184# On all systems the system c++ standard library headers need to be excluded. 185# MSVC only has -X, which disables all default includes; including the crt. 186# Thus, we do nothing and hope we don't accidentally include any of the C++ 187# headers 188add_compile_flags_if_supported(-nostdinc++) 189 190# Target flags ================================================================ 191add_flags_if(LIBCXX_BUILD_32_BITS -m32) 192add_flags_if(LIBCXX_TARGET_TRIPLE "-target ${LIBCXX_TARGET_TRIPLE}") 193add_flags_if(LIBCXX_SYSROOT "--sysroot ${LIBCXX_SYSROOT}") 194add_flags_if(LIBCXX_GCC_TOOLCHAIN "-gcc-toolchain ${LIBCXX_GCC_TOOLCHAIN}") 195 196# Warning flags =============================================================== 197add_definitions(-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 198add_compile_flags_if_supported( 199 -Wall -W -Wwrite-strings 200 -Wno-unused-parameter -Wno-long-long 201 -Werror=return-type) 202if (LIBCXX_ENABLE_WERROR) 203 add_compile_flags_if_supported(-Werror) 204 add_compile_flags_if_supported(-WX) 205else() 206 # TODO(EricWF) Remove this. We shouldn't be suppressing errors when -Werror is 207 # added elsewhere. 208 add_compile_flags_if_supported(-Wno-error) 209endif() 210if (LIBCXX_ENABLE_PEDANTIC) 211 add_compile_flags_if_supported(-pedantic) 212endif() 213 214# Exception flags ============================================================= 215if (LIBCXX_ENABLE_EXCEPTIONS) 216 # Catches C++ exceptions only and tells the compiler to assume that extern C 217 # functions never throw a C++ exception. 218 add_compile_flags_if_supported(-EHsc) 219else() 220 add_definitions(-D_LIBCPP_NO_EXCEPTIONS) 221 add_compile_flags_if_supported(-EHs- -EHa-) 222 add_compile_flags_if_supported(-fno-exceptions) 223endif() 224 225# RTTI flags ================================================================== 226if (NOT LIBCXX_ENABLE_RTTI) 227 add_definitions(-D_LIBCPP_NO_RTTI) 228 add_compile_flags_if_supported(-GR-) 229 add_compile_flags_if_supported(-fno-rtti) 230endif() 231 232# Assertion flags ============================================================= 233define_if(LIBCXX_ENABLE_ASSERTIONS -UNDEBUG) 234define_if_not(LIBCXX_ENABLE_ASSERTIONS -DNDEBUG) 235if (LIBCXX_ENABLE_ASSERTIONS) 236 # MSVC doesn't like _DEBUG on release builds. See PR 4379. 237 define_if_not(MSVC -D_DEBUG) 238endif() 239 240# Feature flags =============================================================== 241define_if(MSVC -D_CRT_SECURE_NO_WARNINGS) 242define_if_not(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE -D_LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE) 243define_if_not(LIBCXX_ENABLE_STDIN -D_LIBCPP_HAS_NO_STDIN) 244define_if_not(LIBCXX_ENABLE_STDOUT -D_LIBCPP_HAS_NO_STDOUT) 245define_if_not(LIBCXX_ENABLE_THREADS -D_LIBCPP_HAS_NO_THREADS) 246define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK -D_LIBCPP_HAS_NO_MONOTONIC_CLOCK) 247define_if_not(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS -D_LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS) 248 249 250# Sanitizer flags 251 252# Configure for sanitizers. If LIBCXX_BUILT_STANDALONE then we have to do 253# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it. 254if (LIBCXX_BUILT_STANDALONE) 255 set(LLVM_USE_SANITIZER "" CACHE STRING 256 "Define the sanitizer used to build the library and tests") 257 # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC. 258 # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do. 259 if (LLVM_USE_SANITIZER AND NOT MSVC) 260 add_flags_if_supported("-fno-omit-frame-pointer") 261 add_flags_if_supported("-gline-tables-only") 262 263 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND 264 NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO") 265 add_flags_if_supported("-gline-tables-only") 266 endif() 267 if (LLVM_USE_SANITIZER STREQUAL "Address") 268 add_flags("-fsanitize=address") 269 elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?") 270 add_flags(-fsanitize=memory) 271 if (LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins") 272 add_flags("-fsanitize-memory-track-origins") 273 endif() 274 elseif (LLVM_USE_SANITIZER STREQUAL "Undefined") 275 add_flags("-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all") 276 elseif (LLVM_USE_SANITIZER STREQUAL "Thread") 277 add_flags(-fsanitize=thread) 278 else() 279 message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}") 280 endif() 281 elseif(LLVM_USE_SANITIZER AND MSVC) 282 message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.") 283 endif() 284endif() 285#=============================================================================== 286# Setup Source Code And Tests 287#=============================================================================== 288include_directories(include) 289add_subdirectory(include) 290add_subdirectory(lib) 291if (LIBCXX_INCLUDE_TESTS) 292 add_subdirectory(test) 293endif() 294