15fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 25fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Setup Project 35fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 45fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 55fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertcmake_minimum_required(VERSION 2.8.8) 65fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 70a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertif(POLICY CMP0042) 80a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert cmake_policy(SET CMP0042 NEW) # Set MACOSX_RPATH=YES by default 90a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertendif() 100a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 115fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) 125fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert project(libcxxabi) 135fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 145fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # Rely on llvm-config. 155fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(CONFIG_OUTPUT) 165fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert find_program(LLVM_CONFIG "llvm-config") 175fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if(DEFINED LLVM_PATH) 185fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include") 195fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree") 205fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_MAIN_SRC_DIR ${LLVM_PATH}) 215fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules") 225fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert elseif(LLVM_CONFIG) 235fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}") 245fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(CONFIG_COMMAND ${LLVM_CONFIG} 255fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "--includedir" 265fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "--prefix" 275fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "--src-root") 285fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert execute_process( 295fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert COMMAND ${CONFIG_COMMAND} 305fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert RESULT_VARIABLE HAD_ERROR 315fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert OUTPUT_VARIABLE CONFIG_OUTPUT 325fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert ) 335fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if(NOT HAD_ERROR) 345fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert string(REGEX REPLACE 355fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "[ \t]*[\r\n]+[ \t]*" ";" 365fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert CONFIG_OUTPUT ${CONFIG_OUTPUT}) 375fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert else() 385fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}") 395fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert message(STATUS "${CONFIG_COMMAND_STR}") 405fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}") 415fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 425fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 435fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert list(GET CONFIG_OUTPUT 0 INCLUDE_DIR) 445fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert list(GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT) 455fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert list(GET CONFIG_OUTPUT 2 MAIN_SRC_DIR) 465fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 475fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include") 485fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree") 495fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree") 505fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/share/llvm/cmake") 515fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_LIT_PATH "${LLVM_PATH}/utils/lit/lit.py") 525fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert else() 535fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert message(FATAL_ERROR "llvm-config not found and LLVM_MAIN_SRC_DIR not defined. " 545fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "Reconfigure with -DLLVM_CONFIG=path/to/llvm-config " 555fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "or -DLLVM_PATH=path/to/llvm-source-root.") 565fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 575fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 585fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if(EXISTS ${LLVM_CMAKE_PATH}) 595fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}") 605fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert include("${LLVM_CMAKE_PATH}/AddLLVM.cmake") 615fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert include("${LLVM_CMAKE_PATH}/HandleLLVMOptions.cmake") 625fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert else() 635fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert message(FATAL_ERROR "Not found: ${LLVM_CMAKE_PATH}") 645fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 655fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 665fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(PACKAGE_NAME libcxxabi) 670a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert set(PACKAGE_VERSION 3.7.0svn) 685fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") 695fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu") 705fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 715fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) 725fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) 735fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert else() 745fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # Seek installed Lit. 755fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert find_program(LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR}/utils/lit 765fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert DOC "Path to lit.py") 775fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 785fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 795fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if(LLVM_LIT) 805fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # Define the default arguments to use with 'lit', and an option for the user 815fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # to override. 825fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LIT_ARGS_DEFAULT "-sv") 835fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if (MSVC OR XCODE) 845fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") 855fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 865fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit") 875fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 885fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools. 895fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if( WIN32 AND NOT CYGWIN ) 905fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools") 915fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 925fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert else() 935fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_INCLUDE_TESTS OFF) 945fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 955fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 96e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert set(LIBCXXABI_LIBDIR_SUFFIX "" CACHE STRING 97e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert "Define suffix of library directory name (32/64)") 98e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert 99e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX}) 100e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX}) 1015fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1025fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LIBCXXABI_BUILT_STANDALONE 1) 1035fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertelse() 1040a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert set(LLVM_MAIN_SRC_DIR "${CMAKE_SOURCE_DIR}" CACHE PATH "Path to LLVM source tree") 1055fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert set(LLVM_LIT "${CMAKE_SOURCE_DIR}/utils/lit/lit.py") 106e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert set(LIBCXXABI_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX}) 1075fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 1085fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1095fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 1105fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Setup CMake Options 1115fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 1125fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1135fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Define options. 1145fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertoption(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON) 1155fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertoption(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) 1165fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertoption(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) 1175fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertoption(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF) 118e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertoption(LIBCXXABI_ENABLE_THREADS "Build with threads enabled" ON) 11922a1ed69523f719ee47eff40ad85690776f2e16eDan Albertset(LIBCXXABI_GCC_TOOLCHAIN "" CACHE STRING "GCC toolchain for cross compiling.") 12022a1ed69523f719ee47eff40ad85690776f2e16eDan Albertset(LIBCXXABI_SYSROOT "" CACHE STRING "Sysroot for cross compiling.") 1215fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1225fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Default to building a shared library so that the default options still test 1235fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# the libc++abi that is being built. There are two problems with testing a 1245fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# static libc++abi. In the case of a standalone build, the tests will link the 1255fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# system's libc++, which might not have been built against our libc++abi. In the 1265fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# case of an in tree build, libc++ will prefer a dynamic libc++abi from the 1275fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# system over a static libc++abi from the output directory. 1285fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertoption(LIBCXXABI_ENABLE_SHARED "Build libc++abi as a shared library." ON) 1290a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertoption(LIBCXXABI_ENABLE_STATIC "Build libc++abi as a static library." ON) 1300a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 1310a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertif (NOT LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_STATIC) 1320a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert message(FATAL_ERROR "libc++abi must be built as either a shared or static library.") 1330a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertendif() 1345fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1355fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertfind_path( 1365fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert LIBCXXABI_LIBCXX_INCLUDES 1375fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert vector 1385fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert PATHS ${LIBCXXABI_LIBCXX_INCLUDES} 1390a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert ${LIBCXXABI_LIBCXX_PATH}/include 1405fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES} 1415fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert ${LLVM_MAIN_SRC_DIR}/projects/libcxx/include 1425fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert ${LLVM_INCLUDE_DIR}/c++/v1 1435fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert ) 1445fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1450a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertset(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_INCLUDES}" CACHE PATH 1465fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "Specify path to libc++ includes." FORCE) 1475fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1480a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertfind_path( 1490a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert LIBCXXABI_LIBCXX_PATH 1500a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert test/libcxx/__init__.py 1510a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert PATHS ${LIBCXXABI_LIBCXX_PATH} 1520a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert ${LIBCXXABI_LIBCXX_INCLUDES}/../ 1530a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert ${LLVM_MAIN_SRC_DIR}/projects/libcxx/ 1540a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert NO_DEFAULT_PATH 1550a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert ) 1560a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 1570a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertif (LIBCXXABI_LIBCXX_PATH STREQUAL "LIBCXXABI_LIBCXX_PATH-NOTFOUND") 1580a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert message(WARNING "LIBCXXABI_LIBCXX_PATH was not specified and couldn't be infered.") 1590a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert set(LIBCXXABI_LIBCXX_PATH "") 1600a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertendif() 1610a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 1620a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertset(LIBCXXABI_LIBCXX_PATH "${LIBCXXABI_LIBCXX_PATH}" CACHE PATH 1630a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert "Specify path to libc++ source." FORCE) 1640a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 1655fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 1665fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Configure System 1675fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 1685fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1695fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Add path for custom modules 1705fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertset(CMAKE_MODULE_PATH 1715fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "${CMAKE_CURRENT_SOURCE_DIR}/cmake" 1725fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" 1735fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert ${CMAKE_MODULE_PATH} 1745fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert ) 1755fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1765fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Configure compiler. 1775fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertinclude(config-ix) 1785fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 179e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(LIBCXXABI_COMPILER ${CMAKE_CXX_COMPILER}) 180e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(LIBCXXABI_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 181e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(LIBCXXABI_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) 182e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX}) 183e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert 1845fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 1855fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Setup Compiler Flags 1865fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 1875fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1885fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Get required flags. 1895fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertmacro(append_if list condition var) 1905fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if (${condition}) 1915fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert list(APPEND ${list} ${var}) 1925fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 1935fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendmacro() 1945fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 1950a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertset(LIBCXXABI_C_FLAGS "") 196e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(LIBCXXABI_CXX_FLAGS "") 197e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(LIBCXXABI_COMPILE_FLAGS "") 198e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(LIBCXXABI_LINK_FLAGS "") 199e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert 200e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert 2015fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (LIBCXXABI_HAS_NOSTDINCXX_FLAG) 202e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++) 203e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert # Remove -stdlib flags to prevent them from causing an unused flag warning. 204e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 205e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 2065fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 2075fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 208e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert 209e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror=return-type) 2105fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 2115fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Get warning flags 212e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_W_FLAG -W) 213e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WALL_FLAG -Wall) 214e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCHAR_SUBSCRIPTS_FLAG -Wchar-subscripts) 215e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WCONVERSION_FLAG -Wconversion) 216e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISMATCHED_TAGS_FLAG -Wmismatched-tags) 217e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WMISSING_BRACES_FLAG -Wmissing-braces) 218e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNEWLINE_EOF_FLAG -Wnewline-eof) 219e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_UNUSED_FUNCTION_FLAG -Wno-unused-function) 220e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHADOW_FLAG -Wshadow) 221e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSHORTEN_64_TO_32_FLAG -Wshorten-64-to-32) 222e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_COMPARE_FLAG -Wsign-compare) 223e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSIGN_CONVERSION_FLAG -Wsign-conversion) 224e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_ALIASING_FLAG -Wstrict-aliasing=2) 225e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WSTRICT_OVERFLOW_FLAG -Wstrict-overflow=4) 226e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_PARAMETER_FLAG -Wunused-parameter) 227e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNUSED_VARIABLE_FLAG -Wunused-variable) 228e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings) 2290a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WUNDEF_FLAG -Wundef) 2305fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 2315fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (LIBCXXABI_ENABLE_WERROR) 232e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror) 233e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WX_FLAG -WX) 2345fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertelse() 235e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_WNO_ERROR_FLAG -Wno-error) 236e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_NO_WX_FLAG -WX-) 2375fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 2385fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (LIBCXXABI_ENABLE_PEDANTIC) 239e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_PEDANTIC_FLAG -pedantic) 2405fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 2415fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 2425fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Get feature flags. 2435fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Exceptions 2445fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Catches C++ exceptions only and tells the compiler to assume that extern C 2455fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# functions never throw a C++ exception. 246e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_FSTRICT_ALIASING_FLAG -fstrict-aliasing) 247e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertappend_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc) 2485fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 2490a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertappend_if(LIBCXXABI_C_FLAGS LIBCXXABI_HAS_FUNWIND_TABLES -funwind-tables) 2500a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 2515fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Assert 2525fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertstring(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) 2535fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (LIBCXXABI_ENABLE_ASSERTIONS) 2545fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # MSVC doesn't like _DEBUG on release builds. See PR 4379. 2555fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if (NOT MSVC) 256e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG) 2575fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 2585fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # On Release builds cmake automatically defines NDEBUG, so we 2595fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # explicitly undefine it: 2605fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE") 261e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG) 2625fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 2635fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertelse() 2645fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE") 265e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG) 2665fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert endif() 2675fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 2685fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Static library 2695fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (NOT LIBCXXABI_ENABLE_SHARED) 270e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert list(APPEND LIBCXXABI_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC) 271e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertendif() 272e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert 273e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertif (NOT LIBCXXABI_ENABLE_THREADS) 274e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albert add_definitions(-DLIBCXXABI_HAS_NO_THREADS=1) 2755fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 2765fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 2775fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# This is the _ONLY_ place where add_definitions is called. 2785fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (MSVC) 2795fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert add_definitions(-D_CRT_SECURE_NO_WARNINGS) 2805fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 2815fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 2820a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert# Define LIBCXXABI_USE_LLVM_UNWINDER for conditional compilation. 2830a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertif (LIBCXXABI_USE_LLVM_UNWINDER) 2840a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert add_definitions(-DLIBCXXABI_USE_LLVM_UNWINDER=1) 2850a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertendif() 2860a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 287a2a5c988788a38636d8b755a88fc3b2657096e60Dan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_TARGET_TRIPLE 288a2a5c988788a38636d8b755a88fc3b2657096e60Dan Albert "-target ${LIBCXXABI_TARGET_TRIPLE}") 28922a1ed69523f719ee47eff40ad85690776f2e16eDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_GCC_TOOLCHAIN 29022a1ed69523f719ee47eff40ad85690776f2e16eDan Albert "-gcc-toolchain ${LIBCXXABI_GCC_TOOLCHAIN}") 29122a1ed69523f719ee47eff40ad85690776f2e16eDan Albertappend_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_SYSROOT 29222a1ed69523f719ee47eff40ad85690776f2e16eDan Albert "--sysroot ${LIBCXXABI_SYSROOT}") 293e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertstring(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}") 294e571c0cb34dbc3799349cf2166fb422ff9d2c08dDan Albertset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}") 2950a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}") 2965fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 2975fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 2985fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Setup Source Code 2995fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert#=============================================================================== 3005fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 3015fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertinclude_directories(include) 3025fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 3035fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# Add source code. This also contains all of the logic for deciding linker flags 3045fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert# soname, etc... 3055fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertadd_subdirectory(src) 3065fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 3075fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif (LIBCXXABI_USE_LLVM_UNWINDER) 3085fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert add_subdirectory(src/Unwind) 3095fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 3105fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert 3115fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertif(NOT LIBCXXABI_ENABLE_SHARED) 3125fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # TODO: Fix the libc++ cmake files so that libc++abi can be statically linked. 3135fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # As it is now, libc++ will prefer linking against a dynamic libc++abi in the 3145fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # system library paths over a static libc++abi in the out directory. This 3155fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # would test the system library rather than the one we just built, which isn't 3165fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert # very helpful. 3175fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert message(WARNING "The libc++abi tests are currently only valid when " 3185fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "LIBCXXABI_ENABLE_SHARED is on, no check target will be " 3195fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert "available!") 3205fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertelse() 3215fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albert add_subdirectory(test) 3225fcb7c5bdd98aab09c6a462ca69e61d8e9f42104Dan Albertendif() 3230a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert 3240a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albertinstall(DIRECTORY include/ 3250a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert DESTINATION include 3260a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert FILES_MATCHING 3270a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert PATTERN "*.h" 3280a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert PATTERN ".svn" EXCLUDE 3290a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert) 330