xref: /llvm-project/libcxxabi/CMakeLists.txt (revision 576b53801fc3d721602ae0d8377af9950f356000)
1# See www/CMake.html for instructions on how to build libcxxabi with CMake.
2
3#===============================================================================
4# Setup Project
5#===============================================================================
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 modules
13list(INSERT CMAKE_MODULE_PATH 0
14  "${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 PATH
26        "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 separate
34 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 Options
44#===============================================================================
45include(CMakeDependentOption)
46include(HandleCompilerRT)
47
48# Define options.
49option(LIBCXXABI_ENABLE_EXCEPTIONS
50  "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_API
65  "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_CAST
68"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_DEFINITIONS
75  "Build libc++abi with definitions for operator new/delete. These are normally
76   defined in libc++abi, but it is also possible to define them in libc++, in
77   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 STRING
85    "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 STRING
102"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 test
108# the libc++abi that is being built. The problem with testing a static libc++abi
109# is that libc++ will prefer a dynamic libc++abi from the system over a static
110# 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_LIBRARY
115  "Install the static libc++abi library." ON
116  "LIBCXXABI_ENABLE_STATIC;LIBCXXABI_INSTALL_LIBRARY" OFF)
117cmake_dependent_option(LIBCXXABI_INSTALL_SHARED_LIBRARY
118  "Install the shared libc++abi library." ON
119  "LIBCXXABI_ENABLE_SHARED;LIBCXXABI_INSTALL_LIBRARY" OFF)
120
121cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY
122  "Statically link the LLVM unwinder to static library" ON
123  "LIBCXXABI_ENABLE_STATIC_UNWINDER" OFF)
124cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY
125  "Statically link the LLVM unwinder to shared library" ON
126  "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, which
130# 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 handler
133avoid 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_LIBRARY
144  "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-cl
149  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 STRING
162  "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 STRING
169    "A list of parameters to run the Lit test suite with.")
170
171#===============================================================================
172# Configure System
173#===============================================================================
174
175# Add path for custom modules
176set(CMAKE_MODULE_PATH
177  "${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 STRING
183    "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  set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR})
191  set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LIBCXXABI_TARGET_SUBDIR})
192  set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBCXXABI_TARGET_SUBDIR} CACHE STRING
193      "Path where built libc++abi libraries should be installed.")
194  unset(LIBCXXABI_TARGET_SUBDIR)
195else()
196  if(LLVM_LIBRARY_OUTPUT_INTDIR)
197    set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR})
198    set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
199  else()
200    set(LIBCXXABI_HEADER_DIR ${CMAKE_BINARY_DIR})
201    set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
202  endif()
203  set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LIBCXXABI_LIBDIR_SUFFIX} CACHE STRING
204      "Path where built libc++abi libraries should be installed.")
205endif()
206
207set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
208set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
209set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
210
211# By default, libcxx and libcxxabi share a library directory.
212if (NOT LIBCXXABI_LIBCXX_LIBRARY_PATH)
213  set(LIBCXXABI_LIBCXX_LIBRARY_PATH "${LIBCXXABI_LIBRARY_DIR}" CACHE PATH
214      "The path to libc++ library." FORCE)
215endif()
216
217# Declare libc++abi configuration variables.
218# They are intended for use as follows:
219# LIBCXXABI_C_FLAGS: General flags for both the c++ compiler and linker.
220# LIBCXXABI_CXX_FLAGS: General flags for both the c++ compiler and linker.
221# LIBCXXABI_COMPILE_FLAGS: Compile only flags.
222# LIBCXXABI_LINK_FLAGS: Linker only flags.
223# LIBCXXABI_LIBRARIES: libraries libc++abi is linked to.
224
225set(LIBCXXABI_C_FLAGS "")
226set(LIBCXXABI_CXX_FLAGS "")
227set(LIBCXXABI_COMPILE_FLAGS "")
228set(LIBCXXABI_LINK_FLAGS "")
229set(LIBCXXABI_LIBRARIES "")
230set(LIBCXXABI_ADDITIONAL_COMPILE_FLAGS "" CACHE STRING "See documentation LIBCXX_ADDITIONAL_COMPILE_FLAGS")
231set(LIBCXXABI_ADDITIONAL_LIBRARIES "" CACHE STRING
232    "Additional libraries libc++abi is linked to which can be provided in cache")
233
234# Include macros for adding and removing libc++abi flags.
235include(HandleLibcxxabiFlags)
236
237#===============================================================================
238# Setup Compiler Flags
239#===============================================================================
240
241# Configure target flags
242if (${CMAKE_SYSTEM_NAME} MATCHES "AIX")
243  add_flags_if_supported("-mdefault-visibility-export-mapping=explicit")
244  set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF)
245endif()
246add_library_flags("${LIBCXXABI_ADDITIONAL_LIBRARIES}")
247
248# Configure compiler. Must happen after setting the target flags.
249include(config-ix)
250
251if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
252  list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
253  # cmake 3.14 and above remove system include paths that are explicitly
254  # passed on the command line.  We build with -nostdinc++ and explicitly add
255  # just the libcxx system include paths with -I on the command line.
256  # Setting CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES effectively prevents cmake
257  # from removing these.
258  # See: https://gitlab.kitware.com/cmake/cmake/issues/19227
259  set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "")
260  # Remove -stdlib flags to prevent them from causing an unused flag warning.
261  string(REPLACE "--stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
262  string(REPLACE "--stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
263  string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
264  string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
265endif()
266
267function(get_sanitizer_flags OUT_VAR  USE_SANITIZER)
268  set(SANITIZER_FLAGS)
269  set(USE_SANITIZER "${USE_SANITIZER}")
270  # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
271  # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
272  if (USE_SANITIZER AND NOT MSVC)
273    append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
274    append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
275
276    if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
277            NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
278      append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
279    endif()
280    if (USE_SANITIZER STREQUAL "Address")
281      append_flags(SANITIZER_FLAGS "-fsanitize=address")
282    elseif (USE_SANITIZER STREQUAL "HWAddress")
283      append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
284    elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
285      append_flags(SANITIZER_FLAGS -fsanitize=memory)
286      if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
287        append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
288      endif()
289    elseif (USE_SANITIZER STREQUAL "Undefined")
290      append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
291    elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
292            USE_SANITIZER STREQUAL "Undefined;Address")
293      append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
294    elseif (USE_SANITIZER STREQUAL "Thread")
295      append_flags(SANITIZER_FLAGS -fsanitize=thread)
296    elseif (USE_SANITIZER STREQUAL "DataFlow")
297      append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
298    else()
299      message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
300    endif()
301  elseif(USE_SANITIZER AND MSVC)
302    message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
303  endif()
304  set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
305endfunction()
306
307get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
308list(APPEND LIBCXXABI_COMPILE_FLAGS ${SANITIZER_FLAGS})
309
310# Let the library headers know they are currently being used to build the
311# library.
312add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)
313
314# libcxxabi needs to, for various reasons, include the libcpp headers as if
315# it is being built as part of libcxx.
316add_definitions(-D_LIBCPP_BUILDING_LIBRARY)
317
318# Get feature flags.
319add_compile_flags_if_supported(-fstrict-aliasing)
320
321# Exceptions
322if (LIBCXXABI_ENABLE_EXCEPTIONS)
323  # Catches C++ exceptions only and tells the compiler to assume that extern C
324  # functions never throw a C++ exception.
325  add_compile_flags_if_supported(-EHsc)
326  # Do we really need to be run through the C compiler ?
327  add_c_compile_flags_if_supported(-funwind-tables)
328else()
329  add_compile_flags_if_supported(-fno-exceptions)
330  add_compile_flags_if_supported(-EHs-)
331  add_compile_flags_if_supported(-EHa-)
332endif()
333
334# Assert
335string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
336if (LIBCXXABI_ENABLE_ASSERTIONS)
337  # MSVC doesn't like _DEBUG on release builds. See PR 4379.
338  if (NOT MSVC)
339    list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)
340  endif()
341  # On Release builds cmake automatically defines NDEBUG, so we
342  # explicitly undefine it:
343  if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
344    list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)
345  endif()
346else()
347  if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
348    list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)
349  endif()
350endif()
351
352# Threading
353if (NOT LIBCXXABI_ENABLE_THREADS)
354  if (LIBCXXABI_HAS_PTHREAD_API)
355    message(FATAL_ERROR "LIBCXXABI_HAS_PTHREAD_API can only"
356                        " be set to ON when LIBCXXABI_ENABLE_THREADS"
357                        " is also set to ON.")
358  endif()
359  if (LIBCXXABI_HAS_WIN32_THREAD_API)
360    message(FATAL_ERROR "LIBCXXABI_HAS_WIN32_THREAD_API can only"
361                        " be set to ON when LIBCXXABI_ENABLE_THREADS"
362                        " is also set to ON.")
363  endif()
364  if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
365    message(FATAL_ERROR "LIBCXXABI_HAS_EXTERNAL_THREAD_API can only"
366                        " be set to ON when LIBCXXABI_ENABLE_THREADS"
367                        " is also set to ON.")
368  endif()
369  add_definitions(-D_LIBCXXABI_HAS_NO_THREADS)
370endif()
371
372if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
373  if (LIBCXXABI_HAS_PTHREAD_API)
374    message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"
375                        " and LIBCXXABI_HAS_PTHREAD_API cannot be both"
376                        " set to ON at the same time.")
377  endif()
378  if (LIBCXXABI_HAS_WIN32_THREAD_API)
379    message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"
380                        " and LIBCXXABI_HAS_WIN32_THREAD_API cannot be both"
381                        " set to ON at the same time.")
382  endif()
383endif()
384
385if (LIBCXXABI_HAS_PTHREAD_API)
386  if (LIBCXXABI_HAS_WIN32_THREAD_API)
387    message(FATAL_ERROR "The options LIBCXXABI_HAS_PTHREAD_API"
388            "and LIBCXXABI_HAS_WIN32_THREAD_API cannot be both"
389            "set to ON at the same time.")
390  endif()
391endif()
392
393if (LLVM_ENABLE_MODULES)
394  # Ignore that the rest of the modules flags are now unused.
395  add_compile_flags_if_supported(-Wno-unused-command-line-argument)
396  add_compile_flags(-fno-modules)
397endif()
398
399set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS OFF)
400if ((NOT LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) OR MINGW)
401  set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS ON)
402endif()
403
404if (LIBCXXABI_HAS_UNDEFINED_SYMBOLS)
405  # Need to allow unresolved symbols if this is to work with shared library builds
406  if (APPLE)
407    list(APPEND LIBCXXABI_LINK_FLAGS "-undefined dynamic_lookup")
408  else()
409    # Relax this restriction from HandleLLVMOptions
410    string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
411  endif()
412endif()
413
414if (LIBCXXABI_HAS_PTHREAD_API)
415  add_definitions(-D_LIBCPP_HAS_THREAD_API_PTHREAD)
416endif()
417
418if (LIBCXXABI_HAS_WIN32_THREAD_API)
419  add_definitions(-D_LIBCPP_HAS_THREAD_API_WIN32)
420endif()
421
422if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
423  add_definitions(-D_LIBCPP_HAS_THREAD_API_EXTERNAL)
424endif()
425
426if (MSVC)
427  add_definitions(-D_CRT_SECURE_NO_WARNINGS)
428endif()
429
430if (LIBCXXABI_SILENT_TERMINATE)
431  add_definitions(-DLIBCXXABI_SILENT_TERMINATE)
432endif()
433
434if (LIBCXXABI_NON_DEMANGLING_TERMINATE)
435  add_definitions(-DLIBCXXABI_NON_DEMANGLING_TERMINATE)
436endif()
437
438if (LIBCXXABI_BAREMETAL)
439    add_definitions(-DLIBCXXABI_BAREMETAL)
440endif()
441
442if (C_SUPPORTS_COMMENT_LIB_PRAGMA)
443  if (LIBCXXABI_HAS_PTHREAD_LIB)
444    add_definitions(-D_LIBCXXABI_LINK_PTHREAD_LIB)
445  endif()
446endif()
447
448string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")
449set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")
450set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")
451
452# On AIX, avoid picking up VMX extensions(i.e. vec_malloc) which would change
453# the default alignment of the allocators here.
454if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
455  add_definitions("-D_XOPEN_SOURCE=700")
456endif()
457
458#===============================================================================
459# Setup Source Code
460#===============================================================================
461
462set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
463    "Specify path to libunwind includes." FORCE)
464set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
465    "Specify path to libunwind source." FORCE)
466
467if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
468  find_path(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL libunwind.h
469    PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}
470          ${LIBCXXABI_LIBUNWIND_PATH}/include
471          ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES}
472          ${LLVM_MAIN_SRC_DIR}/projects/libunwind/include
473          ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/include
474          ${LLVM_MAIN_SRC_DIR}/../libunwind/include
475    NO_DEFAULT_PATH
476    NO_CMAKE_FIND_ROOT_PATH
477  )
478
479  if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")
480    set(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL "")
481  endif()
482endif()
483
484if (NOT "${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}" STREQUAL "")
485  include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}")
486endif()
487
488add_custom_target(cxxabi-test-depends
489  COMMENT "Build dependencies required to run the libc++abi test suite.")
490
491# Add source code. This also contains all of the logic for deciding linker flags
492# soname, etc...
493add_subdirectory(include)
494add_subdirectory(src)
495
496if (LIBCXXABI_INCLUDE_TESTS)
497  add_subdirectory(test)
498  add_subdirectory(fuzz)
499endif()
500