brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.2 KiB · 3dabd87 Raw
507 lines · plain
1# See www/CMake.html for instructions on how to build libcxxabi with CMake.2 3#===============================================================================4# Setup Project5#===============================================================================6 7cmake_minimum_required(VERSION 3.20.0)8set(LLVM_SUBPROJECT_TITLE "libc++abi")9 10set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")11 12# Add path for custom modules13list(INSERT CMAKE_MODULE_PATH 014  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"15  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"16  "${CMAKE_CURRENT_SOURCE_DIR}/../runtimes/cmake/Modules"17  "${LLVM_COMMON_CMAKE_UTILS}"18  "${LLVM_COMMON_CMAKE_UTILS}/Modules"19  )20 21set(CMAKE_FOLDER "libc++")22 23set(LIBCXXABI_SOURCE_DIR  ${CMAKE_CURRENT_SOURCE_DIR})24set(LIBCXXABI_BINARY_DIR  ${CMAKE_CURRENT_BINARY_DIR})25set(LIBCXXABI_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH26        "Specify path to libc++ source.")27 28include(GNUInstallDirs)29 30# Require out of source build.31include(MacroEnsureOutOfSourceBuild)32MACRO_ENSURE_OUT_OF_SOURCE_BUILD(33 "${PROJECT_NAME} requires an out of source build. Please create a separate34 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."35 )36 37if (MSVC)38  message(FATAL_ERROR "Libc++abi can't be built for MSVC targets, and doing so is pointless anyway because such "39                      "targets must use the MS C++ ABI, and libc++abi provides the Itanium C++ ABI.")40endif()41 42#===============================================================================43# Setup CMake Options44#===============================================================================45include(CMakeDependentOption)46include(HandleCompilerRT)47 48# Define options.49option(LIBCXXABI_ENABLE_EXCEPTIONS50  "Provide support for exceptions in the runtime.51  When disabled, libc++abi does not support stack unwinding and other exceptions-related features." ON)52option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)53option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)54option(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)55option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." ON)56if (LIBCXXABI_USE_LLVM_UNWINDER AND NOT "libunwind" IN_LIST LLVM_ENABLE_RUNTIMES)57  message(FATAL_ERROR "LIBCXXABI_USE_LLVM_UNWINDER is set to ON, but libunwind is not specified in LLVM_ENABLE_RUNTIMES.")58endif()59option(LIBCXXABI_ENABLE_STATIC_UNWINDER "Statically link the LLVM unwinder." OFF)60option(LIBCXXABI_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)61option(LIBCXXABI_ENABLE_THREADS "Build with threads enabled" ON)62option(LIBCXXABI_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)63option(LIBCXXABI_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)64option(LIBCXXABI_HAS_EXTERNAL_THREAD_API65  "Build libc++abi with an externalized threading API.66  This option may only be set to ON when LIBCXXABI_ENABLE_THREADS=ON." OFF)67option(LIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST68"Make dynamic_cast more forgiving when type_info's mistakenly have hidden \69visibility, and thus multiple type_infos can exist for a single type. \70When the dynamic_cast would normally fail, this option will cause the \71library to try comparing the type_info names to see if they are equal \72instead." OFF)73 74option(LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS75  "Build libc++abi with definitions for operator new/delete. These are normally76   defined in libc++abi, but it is also possible to define them in libc++, in77   which case the definition in libc++abi should be turned off." ON)78option(LIBCXXABI_BUILD_32_BITS "Build 32 bit multilib libc++abi. This option is not supported anymore when building the runtimes. Please specify a full triple instead." ${LLVM_BUILD_32_BITS})79if (LIBCXXABI_BUILD_32_BITS)80  message(FATAL_ERROR "LIBCXXABI_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")81endif()82 83option(LIBCXXABI_INCLUDE_TESTS "Generate build targets for the libc++abi unit tests." ${LLVM_INCLUDE_TESTS})84set(LIBCXXABI_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING85    "Define suffix of library directory name (32/64)")86option(LIBCXXABI_INSTALL_HEADERS "Install the libc++abi headers." ON)87option(LIBCXXABI_INSTALL_LIBRARY "Install the libc++abi library." ON)88 89set(LIBCXXABI_SHARED_OUTPUT_NAME "c++abi" CACHE STRING "Output name for the shared libc++abi runtime library.")90set(LIBCXXABI_STATIC_OUTPUT_NAME "c++abi" CACHE STRING "Output name for the static libc++abi runtime library.")91 92set(LIBCXXABI_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE STRING "Path to install the libc++abi headers at.")93 94if(LLVM_LIBRARY_OUTPUT_INTDIR)95  set(LIBCXXABI_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")96else()97  set(LIBCXXABI_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")98endif()99 100set(LIBCXXABI_LIBCXX_LIBRARY_PATH "" CACHE PATH "The path to libc++ library.")101set(LIBCXXABI_LIBRARY_VERSION "1.0" CACHE STRING102"Version of libc++abi. This will be reflected in the name of the shared \103library produced. For example, -DLIBCXXABI_LIBRARY_VERSION=x.y will \104result in the library being named libc++abi.x.y.dylib, along with the \105usual symlinks pointing to that.")106 107# Default to building a shared library so that the default options still test108# the libc++abi that is being built. The problem with testing a static libc++abi109# is that libc++ will prefer a dynamic libc++abi from the system over a static110# libc++abi from the output directory.111option(LIBCXXABI_ENABLE_SHARED "Build libc++abi as a shared library." ON)112option(LIBCXXABI_ENABLE_STATIC "Build libc++abi as a static library." ON)113 114cmake_dependent_option(LIBCXXABI_INSTALL_STATIC_LIBRARY115  "Install the static libc++abi library." ON116  "LIBCXXABI_ENABLE_STATIC;LIBCXXABI_INSTALL_LIBRARY" OFF)117cmake_dependent_option(LIBCXXABI_INSTALL_SHARED_LIBRARY118  "Install the shared libc++abi library." ON119  "LIBCXXABI_ENABLE_SHARED;LIBCXXABI_INSTALL_LIBRARY" OFF)120 121cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY122  "Statically link the LLVM unwinder to static library" ON123  "LIBCXXABI_ENABLE_STATIC_UNWINDER" OFF)124cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY125  "Statically link the LLVM unwinder to shared library" ON126  "LIBCXXABI_ENABLE_STATIC_UNWINDER" OFF)127 128option(LIBCXXABI_BAREMETAL "Build libc++abi for baremetal targets." OFF)129# The default terminate handler attempts to demangle uncaught exceptions, which130# causes extra I/O and demangling code to be pulled in.131option(LIBCXXABI_SILENT_TERMINATE "Set this to make the terminate handler default to a silent alternative" OFF)132option(LIBCXXABI_NON_DEMANGLING_TERMINATE "Set this to make the terminate handler133avoid demangling" OFF)134 135if (NOT LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_STATIC)136  message(FATAL_ERROR "libc++abi must be built as either a shared or static library.")137endif()138 139set(LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT OFF)140if (WIN32)141  set(LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT ON)142endif()143option(LIBCXXABI_HERMETIC_STATIC_LIBRARY144  "Do not export any symbols from the static library." ${LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT})145 146if(MINGW)147  set(LIBCXXABI_DEFAULT_TEST_CONFIG "llvm-libc++abi-mingw.cfg.in")148elseif(WIN32) # clang-cl149  if (LIBCXXABI_ENABLE_SHARED)150    set(LIBCXXABI_DEFAULT_TEST_CONFIG "llvm-libc++abi-shared-clangcl.cfg.in")151  else()152    set(LIBCXXABI_DEFAULT_TEST_CONFIG "llvm-libc++abi-static-clangcl.cfg.in")153  endif()154else()155  if (LIBCXXABI_ENABLE_SHARED)156    set(LIBCXXABI_DEFAULT_TEST_CONFIG "llvm-libc++abi-shared.cfg.in")157  else()158    set(LIBCXXABI_DEFAULT_TEST_CONFIG "llvm-libc++abi-static.cfg.in")159  endif()160endif()161set(LIBCXXABI_TEST_CONFIG "${LIBCXXABI_DEFAULT_TEST_CONFIG}" CACHE STRING162  "The path to the Lit testing configuration to use when running the tests.163   If a relative path is provided, it is assumed to be relative to '<monorepo>/libcxxabi/test/configs'.")164if (NOT IS_ABSOLUTE "${LIBCXXABI_TEST_CONFIG}")165  set(LIBCXXABI_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/${LIBCXXABI_TEST_CONFIG}")166endif()167message(STATUS "Using libc++abi testing configuration: ${LIBCXXABI_TEST_CONFIG}")168set(LIBCXXABI_TEST_PARAMS "" CACHE STRING169    "A list of parameters to run the Lit test suite with.")170 171#===============================================================================172# Configure System173#===============================================================================174 175# Add path for custom modules176set(CMAKE_MODULE_PATH177  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"178  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"179  ${CMAKE_MODULE_PATH}180  )181 182set(LIBCXXABI_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING183    "Path where built libc++abi runtime libraries should be installed.")184 185if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)186  set(LIBCXXABI_TARGET_SUBDIR ${LLVM_DEFAULT_TARGET_TRIPLE})187  if(LIBCXXABI_LIBDIR_SUBDIR)188    string(APPEND LIBCXXABI_TARGET_SUBDIR /${LIBCXXABI_LIBDIR_SUBDIR})189  endif()190  cmake_path(NORMAL_PATH LIBCXXABI_TARGET_SUBDIR)191  set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR})192  set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LIBCXXABI_TARGET_SUBDIR})193  set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBCXXABI_TARGET_SUBDIR} CACHE STRING194      "Path where built libc++abi libraries should be installed.")195  set(LIBCXXABI_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LIBCXXABI_TARGET_SUBDIR}/c++/v1" CACHE STRING196      "Path where target-specific libc++abi headers should be installed.")197  unset(LIBCXXABI_TARGET_SUBDIR)198else()199  if(LLVM_LIBRARY_OUTPUT_INTDIR)200    set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR})201    set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})202  else()203    set(LIBCXXABI_HEADER_DIR ${CMAKE_BINARY_DIR})204    set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})205  endif()206  set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LIBCXXABI_LIBDIR_SUFFIX} CACHE STRING207      "Path where built libc++abi libraries should be installed.")208  set(LIBCXXABI_INSTALL_INCLUDE_TARGET_DIR "${LIBCXXABI_INSTALL_INCLUDE_DIR}" CACHE STRING209      "Path where target-specific libc++abi headers should be installed.")210endif()211 212set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})213set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})214set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})215 216# By default, libcxx and libcxxabi share a library directory.217if (NOT LIBCXXABI_LIBCXX_LIBRARY_PATH)218  set(LIBCXXABI_LIBCXX_LIBRARY_PATH "${LIBCXXABI_LIBRARY_DIR}" CACHE PATH219      "The path to libc++ library." FORCE)220endif()221 222# Declare libc++abi configuration variables.223# They are intended for use as follows:224# LIBCXXABI_C_FLAGS: General flags for both the c++ compiler and linker.225# LIBCXXABI_CXX_FLAGS: General flags for both the c++ compiler and linker.226# LIBCXXABI_COMPILE_FLAGS: Compile only flags.227# LIBCXXABI_LINK_FLAGS: Linker only flags.228# LIBCXXABI_LIBRARIES: libraries libc++abi is linked to.229 230set(LIBCXXABI_C_FLAGS "")231set(LIBCXXABI_CXX_FLAGS "")232set(LIBCXXABI_COMPILE_FLAGS "")233set(LIBCXXABI_LINK_FLAGS "")234set(LIBCXXABI_LIBRARIES "")235set(LIBCXXABI_ADDITIONAL_COMPILE_FLAGS "" CACHE STRING "See documentation LIBCXX_ADDITIONAL_COMPILE_FLAGS")236set(LIBCXXABI_ADDITIONAL_LIBRARIES "" CACHE STRING237    "Additional libraries libc++abi is linked to which can be provided in cache")238 239# Include macros for adding and removing libc++abi flags.240include(HandleLibcxxabiFlags)241 242#===============================================================================243# Setup Compiler Flags244#===============================================================================245 246# Configure target flags247if ("${CMAKE_SYSTEM_NAME}" MATCHES "AIX")248  add_flags_if_supported("-mdefault-visibility-export-mapping=explicit")249  set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF)250endif()251add_library_flags("${LIBCXXABI_ADDITIONAL_LIBRARIES}")252 253# Configure compiler. Must happen after setting the target flags.254include(config-ix)255 256include(HandleLibC) # Setup the C library flags257 258if (CXX_SUPPORTS_NOSTDINCXX_FLAG)259  list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)260  # cmake 3.14 and above remove system include paths that are explicitly261  # passed on the command line.  We build with -nostdinc++ and explicitly add262  # just the libcxx system include paths with -I on the command line.263  # Setting CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES effectively prevents cmake264  # from removing these.265  # See: https://gitlab.kitware.com/cmake/cmake/issues/19227266  set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "")267  # Remove -stdlib flags to prevent them from causing an unused flag warning.268  string(REPLACE "--stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")269  string(REPLACE "--stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")270  string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")271  string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")272endif()273 274function(get_sanitizer_flags OUT_VAR  USE_SANITIZER)275  set(SANITIZER_FLAGS)276  set(USE_SANITIZER "${USE_SANITIZER}")277  # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.278  # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.279  if (USE_SANITIZER AND NOT MSVC)280    append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")281    append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")282 283    if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND284            NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")285      append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")286    endif()287    if (USE_SANITIZER STREQUAL "Address")288      append_flags(SANITIZER_FLAGS "-fsanitize=address")289    elseif (USE_SANITIZER STREQUAL "HWAddress")290      append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")291    elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")292      append_flags(SANITIZER_FLAGS -fsanitize=memory)293      if (USE_SANITIZER STREQUAL "MemoryWithOrigins")294        append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")295      endif()296    elseif (USE_SANITIZER STREQUAL "Undefined")297      append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")298    elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR299            USE_SANITIZER STREQUAL "Undefined;Address")300      append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")301    elseif (USE_SANITIZER STREQUAL "Thread")302      append_flags(SANITIZER_FLAGS -fsanitize=thread)303    elseif (USE_SANITIZER STREQUAL "DataFlow")304      append_flags(SANITIZER_FLAGS -fsanitize=dataflow)305    else()306      message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")307    endif()308  elseif(USE_SANITIZER AND MSVC)309    message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")310  endif()311  set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)312endfunction()313 314get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")315list(APPEND LIBCXXABI_COMPILE_FLAGS ${SANITIZER_FLAGS})316 317# Let the library headers know they are currently being used to build the318# library.319add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)320 321# libcxxabi needs to, for various reasons, include the libcpp headers as if322# it is being built as part of libcxx.323add_definitions(-D_LIBCPP_BUILDING_LIBRARY)324 325# Get feature flags.326add_compile_flags_if_supported(-fstrict-aliasing)327 328# Exceptions329if (LIBCXXABI_ENABLE_EXCEPTIONS)330  # Catches C++ exceptions only and tells the compiler to assume that extern C331  # functions never throw a C++ exception.332  add_compile_flags_if_supported(-EHsc)333  # Do we really need to be run through the C compiler ?334  add_c_compile_flags_if_supported(-funwind-tables)335else()336  add_compile_flags_if_supported(-fno-exceptions)337  add_compile_flags_if_supported(-EHs-)338  add_compile_flags_if_supported(-EHa-)339endif()340 341# Assert342string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)343if (LIBCXXABI_ENABLE_ASSERTIONS)344  # MSVC doesn't like _DEBUG on release builds. See PR 4379.345  if (NOT MSVC)346    list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)347  endif()348  # On Release builds cmake automatically defines NDEBUG, so we349  # explicitly undefine it:350  if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")351    list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)352  endif()353else()354  if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")355    list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)356  endif()357endif()358 359# Threading360if (NOT LIBCXXABI_ENABLE_THREADS)361  if (LIBCXXABI_HAS_PTHREAD_API)362    message(FATAL_ERROR "LIBCXXABI_HAS_PTHREAD_API can only"363                        " be set to ON when LIBCXXABI_ENABLE_THREADS"364                        " is also set to ON.")365  endif()366  if (LIBCXXABI_HAS_WIN32_THREAD_API)367    message(FATAL_ERROR "LIBCXXABI_HAS_WIN32_THREAD_API can only"368                        " be set to ON when LIBCXXABI_ENABLE_THREADS"369                        " is also set to ON.")370  endif()371  if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)372    message(FATAL_ERROR "LIBCXXABI_HAS_EXTERNAL_THREAD_API can only"373                        " be set to ON when LIBCXXABI_ENABLE_THREADS"374                        " is also set to ON.")375  endif()376  add_definitions(-D_LIBCXXABI_HAS_NO_THREADS)377endif()378 379if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)380  if (LIBCXXABI_HAS_PTHREAD_API)381    message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"382                        " and LIBCXXABI_HAS_PTHREAD_API cannot be both"383                        " set to ON at the same time.")384  endif()385  if (LIBCXXABI_HAS_WIN32_THREAD_API)386    message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"387                        " and LIBCXXABI_HAS_WIN32_THREAD_API cannot be both"388                        " set to ON at the same time.")389  endif()390endif()391 392if (LIBCXXABI_HAS_PTHREAD_API)393  if (LIBCXXABI_HAS_WIN32_THREAD_API)394    message(FATAL_ERROR "The options LIBCXXABI_HAS_PTHREAD_API"395            "and LIBCXXABI_HAS_WIN32_THREAD_API cannot be both"396            "set to ON at the same time.")397  endif()398endif()399 400if (LLVM_ENABLE_MODULES)401  # Ignore that the rest of the modules flags are now unused.402  add_compile_flags_if_supported(-Wno-unused-command-line-argument)403  add_compile_flags(-fno-modules)404endif()405 406set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS OFF)407if ((NOT LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) OR MINGW)408  set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS ON)409endif()410 411if (LIBCXXABI_HAS_UNDEFINED_SYMBOLS)412  # Need to allow unresolved symbols if this is to work with shared library builds413  if (APPLE)414    list(APPEND LIBCXXABI_LINK_FLAGS "-undefined dynamic_lookup")415  else()416    # Relax this restriction from HandleLLVMOptions417    string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")418  endif()419endif()420 421if (LIBCXXABI_HAS_PTHREAD_API)422  add_definitions(-D_LIBCPP_HAS_THREAD_API_PTHREAD)423endif()424 425if (LIBCXXABI_HAS_WIN32_THREAD_API)426  add_definitions(-D_LIBCPP_HAS_THREAD_API_WIN32)427endif()428 429if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)430  add_definitions(-D_LIBCPP_HAS_THREAD_API_EXTERNAL)431endif()432 433if (MSVC)434  add_definitions(-D_CRT_SECURE_NO_WARNINGS)435endif()436 437if (LIBCXXABI_SILENT_TERMINATE)438  add_definitions(-DLIBCXXABI_SILENT_TERMINATE)439endif()440 441if (LIBCXXABI_NON_DEMANGLING_TERMINATE)442  add_definitions(-DLIBCXXABI_NON_DEMANGLING_TERMINATE)443endif()444 445if (LIBCXXABI_BAREMETAL)446    add_definitions(-DLIBCXXABI_BAREMETAL)447endif()448 449if (C_SUPPORTS_COMMENT_LIB_PRAGMA)450  if (LIBCXXABI_HAS_PTHREAD_LIB)451    add_definitions(-D_LIBCXXABI_LINK_PTHREAD_LIB)452  endif()453endif()454 455string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")456set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")457set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")458 459# On AIX, avoid picking up VMX extensions(i.e. vec_malloc) which would change460# the default alignment of the allocators here.461if (UNIX AND "${CMAKE_SYSTEM_NAME}" MATCHES "AIX")462  add_definitions("-D_XOPEN_SOURCE=700")463endif()464 465#===============================================================================466# Setup Source Code467#===============================================================================468 469set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH470    "Specify path to libunwind includes." FORCE)471set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH472    "Specify path to libunwind source." FORCE)473 474if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)475  find_path(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL libunwind.h476    PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}477          ${LIBCXXABI_LIBUNWIND_PATH}/include478          ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES}479          ${LLVM_MAIN_SRC_DIR}/projects/libunwind/include480          ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/include481          ${LLVM_MAIN_SRC_DIR}/../libunwind/include482    NO_DEFAULT_PATH483    NO_CMAKE_FIND_ROOT_PATH484  )485 486  if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")487    set(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL "")488  endif()489endif()490 491if (NOT "${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}" STREQUAL "")492  include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}")493endif()494 495add_custom_target(cxxabi-test-depends496  COMMENT "Build dependencies required to run the libc++abi test suite.")497 498# Add source code. This also contains all of the logic for deciding linker flags499# soname, etc...500add_subdirectory(include)501add_subdirectory(src)502 503if (LIBCXXABI_INCLUDE_TESTS)504  add_subdirectory(test)505  add_subdirectory(fuzz)506endif()507