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