blob: 76d54f8d32a7b201ea2c8ccb348e374ca19cc428 [file] [log] [blame]
Martell Malone062f8f02017-06-01 00:09:201# See www/CMake.html for instructions on how to build libcxxabi with CMake.
2
Dan Albert0ed2e2f2014-07-03 19:35:483#===============================================================================
4# Setup Project
5#===============================================================================
6
Louis Dionneafa1afd2020-04-22 15:15:057cmake_minimum_required(VERSION 3.13.4)
Dan Albert0ed2e2f2014-07-03 19:35:488
John Ericson949bbd02022-01-01 07:03:319set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
10
Petr Hosek5f3d5be2017-04-07 20:10:4111# Add path for custom modules
John Ericson949bbd02022-01-01 07:03:3112list(INSERT CMAKE_MODULE_PATH 0
Petr Hosek5f3d5be2017-04-07 20:10:4113 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
14 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
John Ericson949bbd02022-01-01 07:03:3115 "${LLVM_COMMON_CMAKE_UTILS}"
16 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
Petr Hosek5f3d5be2017-04-07 20:10:4117 )
18
Marek Kurdej5e7a93a2021-01-25 08:50:0319set(CMAKE_FOLDER "libc++")
20
Dominik Montada8c03fdf2020-08-24 09:01:0521set(LIBCXXABI_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
22set(LIBCXXABI_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
23set(LIBCXXABI_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH
24 "Specify path to libc++ source.")
25
John Ericsondf31ff12022-01-19 06:45:0726include(GNUInstallDirs)
27
Martell Malone062f8f02017-06-01 00:09:2028# Require out of source build.
29include(MacroEnsureOutOfSourceBuild)
30MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
31 "${PROJECT_NAME} requires an out of source build. Please create a separate
32 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
33 )
34
Dan Albert0ed2e2f2014-07-03 19:35:4835#===============================================================================
36# Setup CMake Options
37#===============================================================================
Martell Malone062f8f02017-06-01 00:09:2038include(CMakeDependentOption)
Petr Hosek5f3d5be2017-04-07 20:10:4139include(HandleCompilerRT)
Dan Albert0ed2e2f2014-07-03 19:35:4840
41# Define options.
Petr Hosek2e398f12019-07-12 19:10:5942option(LIBCXXABI_ENABLE_EXCEPTIONS
43 "Provide support for exceptions in the runtime.
44 When disabled, libc++abi does not support stack unwinding and other exceptions-related features." ON)
Dan Albert0ed2e2f2014-07-03 19:35:4845option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
46option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
47option(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
Saleem Abdulrasoole5f6e2b2015-04-28 02:09:5348option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
Petr Hosekef6f2312017-02-09 02:19:3049option(LIBCXXABI_ENABLE_STATIC_UNWINDER "Statically link the LLVM unwinder." OFF)
Saleem Abdulrasool6e2aa5e2016-07-15 00:49:4250option(LIBCXXABI_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
Eric Fiselier559f8672014-11-24 22:42:0351option(LIBCXXABI_ENABLE_THREADS "Build with threads enabled" ON)
Ben Craig24a98612016-05-25 17:37:3852option(LIBCXXABI_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
Markus Böck05b37162021-03-05 14:30:1353option(LIBCXXABI_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF)
Asiri Rathnayake97ba9fa2017-01-03 12:58:3454option(LIBCXXABI_HAS_EXTERNAL_THREAD_API
55 "Build libc++abi with an externalized threading API.
56 This option may only be set to ON when LIBCXXABI_ENABLE_THREADS=ON." OFF)
Asiri Rathnayakea573fe22017-01-09 11:57:2157option(LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY
58 "Build libc++abi with an externalized threading library.
59 This option may only be set to ON when LIBCXXABI_ENABLE_THREADS=ON" OFF)
Louis Dionnee5291c42020-04-22 20:17:5860option(LIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST
61"Make dynamic_cast more forgiving when type_info's mistakenly have hidden \
62visibility, and thus multiple type_infos can exist for a single type. \
63When the dynamic_cast would normally fail, this option will cause the \
64library to try comparing the type_info names to see if they are equal \
65instead." OFF)
Eric Fiselier38643b92017-03-02 21:55:1766
Eric Fiselier2ee1d902017-03-02 19:34:3567option(LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS
Louis Dionne9b40ee82019-10-01 13:34:5868 "Build libc++abi with definitions for operator new/delete. These are normally
69 defined in libc++abi, but it is also possible to define them in libc++, in
70 which case the definition in libc++abi should be turned off." ON)
Louis Dionnefa1c0772021-11-23 21:34:0971option(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})
72if (LIBCXXABI_BUILD_32_BITS)
Louis Dionnedc1244d2021-12-01 17:57:3073 message(FATAL_ERROR "LIBCXXABI_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")
Louis Dionnefa1c0772021-11-23 21:34:0974endif()
75
Bryant Wong66b54412017-01-07 22:14:0476option(LIBCXXABI_INCLUDE_TESTS "Generate build targets for the libc++abi unit tests." ${LLVM_INCLUDE_TESTS})
Ismail Donmezdea75902017-06-13 08:16:4477set(LIBCXXABI_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
78 "Define suffix of library directory name (32/64)")
Louis Dionne6dfdf792022-02-17 16:19:4579option(LIBCXXABI_INSTALL_HEADERS "Install the libc++abi headers." ON)
Petr Hosekaa96d2e2017-11-17 23:25:0980option(LIBCXXABI_INSTALL_LIBRARY "Install the libc++abi library." ON)
Petr Hosek6f5f8472022-05-14 02:23:5281
82set(LIBCXXABI_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE PATH "Path to install the libc++abi headers at.")
83
84if(LLVM_LIBRARY_OUTPUT_INTDIR)
85 set(LIBCXXABI_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
86else()
87 set(LIBCXXABI_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
88endif()
Louis Dionne72117f22021-10-12 19:59:0889
Louis Dionne3ee0cec2021-10-12 19:59:0890# TODO: Remove this after branching for LLVM 15
91if(LIBCXXABI_SYSROOT OR LIBCXXABI_TARGET_TRIPLE OR LIBCXXABI_GCC_TOOLCHAIN)
92 message(WARNING "LIBCXXABI_SYSROOT, LIBCXXABI_TARGET_TRIPLE and LIBCXXABI_GCC_TOOLCHAIN are not supported anymore, please use the native CMake equivalents instead")
Louis Dionne641a1412022-02-15 13:18:3893endif()
Louis Dionne2e3bb912022-02-16 16:59:3294
Ben Craig658310b2016-06-01 12:50:3095set(LIBCXXABI_LIBCXX_LIBRARY_PATH "" CACHE PATH "The path to libc++ library.")
Louis Dionnebe52ff92019-10-07 19:22:0496set(LIBCXXABI_LIBRARY_VERSION "1.0" CACHE STRING
97"Version of libc++abi. This will be reflected in the name of the shared \
98library produced. For example, -DLIBCXXABI_LIBRARY_VERSION=x.y will \
99result in the library being named libc++abi.x.y.dylib, along with the \
100usual symlinks pointing to that.")
Dan Alberta770f9d2014-07-10 02:20:11101
102# Default to building a shared library so that the default options still test
Louis Dionne0a22dfc2022-05-13 16:15:15103# the libc++abi that is being built. The problem with testing a static libc++abi
104# is that libc++ will prefer a dynamic libc++abi from the system over a static
105# libc++abi from the output directory.
Dan Alberta770f9d2014-07-10 02:20:11106option(LIBCXXABI_ENABLE_SHARED "Build libc++abi as a shared library." ON)
Eric Fiselier14dbeaa2015-03-03 15:59:09107option(LIBCXXABI_ENABLE_STATIC "Build libc++abi as a static library." ON)
108
Sam Clegg77c99ee2018-07-25 23:13:00109cmake_dependent_option(LIBCXXABI_INSTALL_STATIC_LIBRARY
110 "Install the static libc++abi library." ON
111 "LIBCXXABI_ENABLE_STATIC;LIBCXXABI_INSTALL_LIBRARY" OFF)
112cmake_dependent_option(LIBCXXABI_INSTALL_SHARED_LIBRARY
113 "Install the shared libc++abi library." ON
114 "LIBCXXABI_ENABLE_SHARED;LIBCXXABI_INSTALL_LIBRARY" OFF)
115
Petr Hosek058c04c2018-07-24 07:06:17116cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY
117 "Statically link the LLVM unwinder to static library" ON
Louis Dionnefa7ce8e2022-05-18 16:05:45118 "LIBCXXABI_ENABLE_STATIC_UNWINDER" OFF)
Petr Hosek058c04c2018-07-24 07:06:17119cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY
120 "Statically link the LLVM unwinder to shared library" ON
Louis Dionnefa7ce8e2022-05-18 16:05:45121 "LIBCXXABI_ENABLE_STATIC_UNWINDER" OFF)
Petr Hosek058c04c2018-07-24 07:06:17122
Ranjeet Singhef6e6722017-03-01 11:42:01123option(LIBCXXABI_BAREMETAL "Build libc++abi for baremetal targets." OFF)
124# The default terminate handler attempts to demangle uncaught exceptions, which
125# causes extra I/O and demangling code to be pulled in.
126option(LIBCXXABI_SILENT_TERMINATE "Set this to make the terminate handler default to a silent alternative" OFF)
Dan Albert866d4802021-01-21 21:27:14127option(LIBCXXABI_NON_DEMANGLING_TERMINATE "Set this to make the terminate handler
128avoid demangling" OFF)
Ranjeet Singhef6e6722017-03-01 11:42:01129
Eric Fiselier14dbeaa2015-03-03 15:59:09130if (NOT LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_STATIC)
131 message(FATAL_ERROR "libc++abi must be built as either a shared or static library.")
132endif()
Dan Alberta770f9d2014-07-10 02:20:11133
Louis Dionne0a22dfc2022-05-13 16:15:15134# TODO: Remove this, which shouldn't be necessary since we know we're being built
135# side-by-side with libc++.
Petr Hosek1687f2b2021-03-10 19:21:41136set(LIBCXXABI_LIBCXX_INCLUDES "" CACHE PATH
Louis Dionne48e4b0f2020-10-23 13:32:50137 "Specify path to libc++ includes.")
Louis Dionne529ac332020-10-22 23:11:33138
Martin Storsjöbedf6572022-04-09 20:40:07139set(LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT OFF)
140if (WIN32)
141 set(LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT ON)
142endif()
Petr Hosek8807db32019-01-24 03:18:29143option(LIBCXXABI_HERMETIC_STATIC_LIBRARY
Martin Storsjöbedf6572022-04-09 20:40:07144 "Do not export any symbols from the static library." ${LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT})
Petr Hosek8807db32019-01-24 03:18:29145
Louis Dionne33c9c102020-06-25 15:46:00146set(LIBCXXABI_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/lit.site.cfg.in" CACHE STRING
Louis Dionne54a8a0d2021-09-29 19:26:05147 "The path to the Lit testing configuration to use when running the tests.
Louis Dionned1e0f022021-10-12 21:45:45148 If a relative path is provided, it is assumed to be relative to '<monorepo>/libcxxabi/test/configs'.")
Louis Dionne54a8a0d2021-09-29 19:26:05149if (NOT IS_ABSOLUTE "${LIBCXXABI_TEST_CONFIG}")
Louis Dionned1e0f022021-10-12 21:45:45150 set(LIBCXXABI_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/${LIBCXXABI_TEST_CONFIG}")
Louis Dionne54a8a0d2021-09-29 19:26:05151endif()
Louis Dionnec631e332022-05-11 14:16:29152message(STATUS "Using libc++abi testing configuration: ${LIBCXXABI_TEST_CONFIG}")
Louis Dionne6f693182020-07-09 15:54:09153set(LIBCXXABI_TEST_PARAMS "" CACHE STRING
154 "A list of parameters to run the Lit test suite with.")
Louis Dionne33c9c102020-06-25 15:46:00155
Dan Albert0ed2e2f2014-07-03 19:35:48156#===============================================================================
157# Configure System
158#===============================================================================
159
160# Add path for custom modules
161set(CMAKE_MODULE_PATH
162 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
163 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
164 ${CMAKE_MODULE_PATH}
165 )
166
John Ericsonf16a4a02022-01-16 06:00:29167set(LIBCXXABI_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
John Ericson0a8d15a2022-01-11 03:03:21168 "Path where built libc++abi runtime libraries should be installed.")
169
Petr Hosek887f26d2018-06-28 03:11:52170if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
Petr Hosek1687f2b2021-03-10 19:21:41171 set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR})
Petr Hosekf7495502021-04-17 04:33:18172 set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
John Ericson1e03c372021-04-28 22:36:47173 set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
174 "Path where built libc++abi libraries should be installed.")
Petr Hosek81f433b2019-05-22 21:08:33175 if(LIBCXX_LIBDIR_SUBDIR)
176 string(APPEND LIBCXXABI_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR})
177 string(APPEND LIBCXXABI_INSTALL_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR})
178 endif()
Jonas Hahnfeld57aa0d42017-05-04 06:04:49179else()
John Ericson0a8d15a2022-01-11 03:03:21180 if(LLVM_LIBRARY_OUTPUT_INTDIR)
181 set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR})
182 set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
183 else()
184 set(LIBCXXABI_HEADER_DIR ${CMAKE_BINARY_DIR})
185 set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
186 endif()
John Ericson1e03c372021-04-28 22:36:47187 set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LIBCXXABI_LIBDIR_SUFFIX} CACHE PATH
188 "Path where built libc++abi libraries should be installed.")
Jonas Hahnfeld57aa0d42017-05-04 06:04:49189endif()
Chandler Carruth24a6b052014-12-29 12:22:04190
Ben Craigab56c402016-04-18 13:30:38191set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
192set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
Martell Malone062f8f02017-06-01 00:09:20193set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
Ben Craigab56c402016-04-18 13:30:38194
Louis Dionne0a22dfc2022-05-13 16:15:15195# By default, libcxx and libcxxabi share a library directory.
Ben Craig658310b2016-06-01 12:50:30196if (NOT LIBCXXABI_LIBCXX_LIBRARY_PATH)
197 set(LIBCXXABI_LIBCXX_LIBRARY_PATH "${LIBCXXABI_LIBRARY_DIR}" CACHE PATH
Sergej Jaskiewiczfb76c792019-12-26 09:28:39198 "The path to libc++ library." FORCE)
Eugene Zelenko9d092752016-08-08 17:59:02199endif()
Eric Fiselierffd18932016-06-02 02:18:31200
Martell Malone062f8f02017-06-01 00:09:20201# Declare libc++abi configuration variables.
202# They are intended for use as follows:
203# LIBCXXABI_C_FLAGS: General flags for both the c++ compiler and linker.
204# LIBCXXABI_CXX_FLAGS: General flags for both the c++ compiler and linker.
205# LIBCXXABI_COMPILE_FLAGS: Compile only flags.
206# LIBCXXABI_LINK_FLAGS: Linker only flags.
207# LIBCXXABI_LIBRARIES: libraries libc++abi is linked to.
Eric Fiselierffd18932016-06-02 02:18:31208
Logan Chiendbcd7a32015-01-22 13:39:08209set(LIBCXXABI_C_FLAGS "")
Eric Fiselier5cb50512014-11-18 20:37:53210set(LIBCXXABI_CXX_FLAGS "")
211set(LIBCXXABI_COMPILE_FLAGS "")
212set(LIBCXXABI_LINK_FLAGS "")
Martell Malone062f8f02017-06-01 00:09:20213set(LIBCXXABI_LIBRARIES "")
214
215# Include macros for adding and removing libc++abi flags.
216include(HandleLibcxxabiFlags)
217
218#===============================================================================
219# Setup Compiler Flags
220#===============================================================================
Eric Fiselier5cb50512014-11-18 20:37:53221
Eric Fiselierffd18932016-06-02 02:18:31222# Configure target flags
Muiez Ahmeda1da7392022-01-14 16:35:53223if(ZOS)
224 add_target_flags_if_supported("-fzos-le-char-mode=ebcdic")
225endif()
Eric Fiselierffd18932016-06-02 02:18:31226
227# Configure compiler. Must happen after setting the target flags.
228include(config-ix)
Eric Fiselier5cb50512014-11-18 20:37:53229
Petr Hosekb3df14b2022-03-10 09:47:09230if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
Eric Fiselier5cb50512014-11-18 20:37:53231 list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
Sam Clegg4230fa92019-11-07 22:51:25232 # cmake 3.14 and above remove system include paths that are explicitly
233 # passed on the command line. We build with -nostdinc++ and explicitly add
234 # just the libcxx system include paths with -I on the command line.
235 # Setting CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES effectively prevents cmake
236 # from removing these.
237 # See: https://gitlab.kitware.com/cmake/cmake/issues/19227
238 set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "")
Eric Fiselier5cb50512014-11-18 20:37:53239 # Remove -stdlib flags to prevent them from causing an unused flag warning.
Raphael Isemann6b7a49b2020-10-13 14:05:00240 string(REPLACE "--stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
241 string(REPLACE "--stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
Eric Fiselier5cb50512014-11-18 20:37:53242 string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
243 string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48244endif()
Dan Albert0ed2e2f2014-07-03 19:35:48245
Shoaib Meenai88c6acf2016-09-27 03:44:09246# Let the library headers know they are currently being used to build the
247# library.
248add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)
249
Martin Storsjö9c30baf2020-10-30 17:11:23250# libcxxabi needs to, for various reasons, include the libcpp headers as if
251# it is being built as part of libcxx.
252add_definitions(-D_LIBCPP_BUILDING_LIBRARY)
253
Martell Malone062f8f02017-06-01 00:09:20254add_compile_flags_if_supported(-Werror=return-type)
Dan Albert0ed2e2f2014-07-03 19:35:48255
256# Get warning flags
Martell Malone062f8f02017-06-01 00:09:20257add_compile_flags_if_supported(-W)
258add_compile_flags_if_supported(-Wall)
259add_compile_flags_if_supported(-Wchar-subscripts)
260add_compile_flags_if_supported(-Wconversion)
261add_compile_flags_if_supported(-Wmismatched-tags)
262add_compile_flags_if_supported(-Wmissing-braces)
263add_compile_flags_if_supported(-Wnewline-eof)
264add_compile_flags_if_supported(-Wunused-function)
265add_compile_flags_if_supported(-Wshadow)
266add_compile_flags_if_supported(-Wshorten-64-to-32)
267add_compile_flags_if_supported(-Wsign-compare)
268add_compile_flags_if_supported(-Wsign-conversion)
269add_compile_flags_if_supported(-Wstrict-aliasing=2)
270add_compile_flags_if_supported(-Wstrict-overflow=4)
271add_compile_flags_if_supported(-Wunused-parameter)
272add_compile_flags_if_supported(-Wunused-variable)
273add_compile_flags_if_supported(-Wwrite-strings)
274add_compile_flags_if_supported(-Wundef)
Dan Albert3c4780e2014-07-10 22:23:03275
Logan Smith77e0e9e2020-07-23 00:44:52276add_compile_flags_if_supported(-Wno-suggest-override)
277
Dan Albert0ed2e2f2014-07-03 19:35:48278if (LIBCXXABI_ENABLE_WERROR)
Martell Malone062f8f02017-06-01 00:09:20279 add_compile_flags_if_supported(-Werror)
280 add_compile_flags_if_supported(-WX)
Dan Albert0ed2e2f2014-07-03 19:35:48281else()
Martell Malone062f8f02017-06-01 00:09:20282 add_compile_flags_if_supported(-Wno-error)
283 add_compile_flags_if_supported(-WX-)
Dan Albert0ed2e2f2014-07-03 19:35:48284endif()
285if (LIBCXXABI_ENABLE_PEDANTIC)
Martell Malone062f8f02017-06-01 00:09:20286 add_compile_flags_if_supported(-pedantic)
Dan Albert0ed2e2f2014-07-03 19:35:48287endif()
288
289# Get feature flags.
Martell Malone062f8f02017-06-01 00:09:20290add_compile_flags_if_supported(-fstrict-aliasing)
Dan Albert0ed2e2f2014-07-03 19:35:48291
Asiri Rathnayake57e446d2016-05-31 12:01:32292# Exceptions
293if (LIBCXXABI_ENABLE_EXCEPTIONS)
294 # Catches C++ exceptions only and tells the compiler to assume that extern C
295 # functions never throw a C++ exception.
Martell Malone062f8f02017-06-01 00:09:20296 add_compile_flags_if_supported(-EHsc)
297 # Do we really need to be run through the C compiler ?
298 add_c_compile_flags_if_supported(-funwind-tables)
Asiri Rathnayake57e446d2016-05-31 12:01:32299else()
Martell Malone062f8f02017-06-01 00:09:20300 add_compile_flags_if_supported(-fno-exceptions)
301 add_compile_flags_if_supported(-EHs-)
302 add_compile_flags_if_supported(-EHa-)
Asiri Rathnayake57e446d2016-05-31 12:01:32303endif()
Logan Chiendbcd7a32015-01-22 13:39:08304
Dan Albert0ed2e2f2014-07-03 19:35:48305# Assert
306string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
307if (LIBCXXABI_ENABLE_ASSERTIONS)
308 # MSVC doesn't like _DEBUG on release builds. See PR 4379.
309 if (NOT MSVC)
Eric Fiselier5cb50512014-11-18 20:37:53310 list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48311 endif()
312 # On Release builds cmake automatically defines NDEBUG, so we
313 # explicitly undefine it:
314 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53315 list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48316 endif()
317else()
318 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53319 list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48320 endif()
321endif()
Dan Albert0ed2e2f2014-07-03 19:35:48322
Asiri Rathnayake97ba9fa2017-01-03 12:58:34323# Threading
Eric Fiselier559f8672014-11-24 22:42:03324if (NOT LIBCXXABI_ENABLE_THREADS)
Ben Craig24a98612016-05-25 17:37:38325 if (LIBCXXABI_HAS_PTHREAD_API)
326 message(FATAL_ERROR "LIBCXXABI_HAS_PTHREAD_API can only"
327 " be set to ON when LIBCXXABI_ENABLE_THREADS"
328 " is also set to ON.")
329 endif()
Markus Böck05b37162021-03-05 14:30:13330 if (LIBCXXABI_HAS_WIN32_THREAD_API)
331 message(FATAL_ERROR "LIBCXXABI_HAS_WIN32_THREAD_API can only"
332 " be set to ON when LIBCXXABI_ENABLE_THREADS"
333 " is also set to ON.")
334 endif()
Asiri Rathnayake97ba9fa2017-01-03 12:58:34335 if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
336 message(FATAL_ERROR "LIBCXXABI_HAS_EXTERNAL_THREAD_API can only"
337 " be set to ON when LIBCXXABI_ENABLE_THREADS"
338 " is also set to ON.")
339 endif()
Asiri Rathnayakea573fe22017-01-09 11:57:21340 if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
341 message(FATAL_ERROR "LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY can only"
342 " be set to ON when LIBCXXABI_ENABLE_THREADS"
343 " is also set to ON.")
344 endif()
Asiri Rathnayake7c98baa2016-09-21 09:09:32345 add_definitions(-D_LIBCXXABI_HAS_NO_THREADS)
Eric Fiselier559f8672014-11-24 22:42:03346endif()
347
Asiri Rathnayakea573fe22017-01-09 11:57:21348if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
349 if (LIBCXXABI_HAS_PTHREAD_API)
350 message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"
351 " and LIBCXXABI_HAS_PTHREAD_API cannot be both"
352 " set to ON at the same time.")
353 endif()
Markus Böck05b37162021-03-05 14:30:13354 if (LIBCXXABI_HAS_WIN32_THREAD_API)
355 message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"
356 " and LIBCXXABI_HAS_WIN32_THREAD_API cannot be both"
357 " set to ON at the same time.")
358 endif()
Asiri Rathnayakea573fe22017-01-09 11:57:21359 if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
360 message(FATAL_ERROR "The options LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY"
361 " and LIBCXXABI_HAS_EXTERNAL_THREAD_API cannot be both"
362 " set to ON at the same time.")
363 endif()
Asiri Rathnayake97ba9fa2017-01-03 12:58:34364endif()
365
Markus Böck05b37162021-03-05 14:30:13366if (LIBCXXABI_HAS_PTHREAD_API)
367 if (LIBCXXABI_HAS_WIN32_THREAD_API)
368 message(FATAL_ERROR "The options LIBCXXABI_HAS_PTHREAD_API"
369 "and LIBCXXABI_HAS_WIN32_THREAD_API cannot be both"
370 "set to ON at the same time.")
371 endif()
372endif()
373
NAKAMURA Takumi83105a42017-07-31 09:35:08374if (LLVM_ENABLE_MODULES)
375 # Ignore that the rest of the modules flags are now unused.
376 add_compile_flags_if_supported(-Wno-unused-command-line-argument)
377 add_compile_flags(-fno-modules)
378endif()
379
Eric Fiselier6f8d62d2017-03-04 02:15:37380set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS OFF)
381if ((NOT LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
Eric Fiselier70c2b1c2017-05-11 03:49:48382 OR (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXXABI_ENABLE_SHARED)
383 OR MINGW)
Eric Fiselier6f8d62d2017-03-04 02:15:37384 set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS ON)
385endif()
Eric Fiselier2ee1d902017-03-02 19:34:35386
387if (LIBCXXABI_HAS_UNDEFINED_SYMBOLS)
Asiri Rathnayake97ba9fa2017-01-03 12:58:34388 # Need to allow unresolved symbols if this is to work with shared library builds
389 if (APPLE)
Eric Fiselier6f8d62d2017-03-04 02:15:37390 list(APPEND LIBCXXABI_LINK_FLAGS "-undefined dynamic_lookup")
Asiri Rathnayake97ba9fa2017-01-03 12:58:34391 else()
392 # Relax this restriction from HandleLLVMOptions
393 string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
394 endif()
395endif()
396
Ben Craig24a98612016-05-25 17:37:38397if (LIBCXXABI_HAS_PTHREAD_API)
398 add_definitions(-D_LIBCPP_HAS_THREAD_API_PTHREAD)
399endif()
400
Markus Böck05b37162021-03-05 14:30:13401if (LIBCXXABI_HAS_WIN32_THREAD_API)
402 add_definitions(-D_LIBCPP_HAS_THREAD_API_WIN32)
403endif()
404
Asiri Rathnayake97ba9fa2017-01-03 12:58:34405if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
Asiri Rathnayakea573fe22017-01-09 11:57:21406 add_definitions(-D_LIBCPP_HAS_THREAD_API_EXTERNAL)
407endif()
408
409if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
410 add_definitions(-D_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
Asiri Rathnayake97ba9fa2017-01-03 12:58:34411endif()
412
Shoaib Meenaif43726c2017-05-10 21:52:39413# Prevent libc++abi from having library dependencies on libc++
414add_definitions(-D_LIBCPP_DISABLE_EXTERN_TEMPLATE)
415
Dan Albert0ed2e2f2014-07-03 19:35:48416if (MSVC)
417 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
418endif()
419
James Y Knight0d3145f2017-01-13 19:22:26420if (LIBCXXABI_SILENT_TERMINATE)
Ranjeet Singhef6e6722017-03-01 11:42:01421 add_definitions(-DLIBCXXABI_SILENT_TERMINATE)
422endif()
423
Dan Albert866d4802021-01-21 21:27:14424if (LIBCXXABI_NON_DEMANGLING_TERMINATE)
425 add_definitions(-DLIBCXXABI_NON_DEMANGLING_TERMINATE)
426endif()
427
Ranjeet Singhef6e6722017-03-01 11:42:01428if (LIBCXXABI_BAREMETAL)
429 add_definitions(-DLIBCXXABI_BAREMETAL)
James Y Knight0d3145f2017-01-13 19:22:26430endif()
431
Petr Hosekb3df14b2022-03-10 09:47:09432if (C_SUPPORTS_COMMENT_LIB_PRAGMA)
Michał Górnya9b5fff2019-12-02 10:49:20433 if (LIBCXXABI_HAS_PTHREAD_LIB)
434 add_definitions(-D_LIBCXXABI_LINK_PTHREAD_LIB)
435 endif()
Petr Hosek789b7f02019-05-30 04:40:21436endif()
437
Eric Fiselier5cb50512014-11-18 20:37:53438string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")
439set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")
Logan Chiendbcd7a32015-01-22 13:39:08440set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48441
David Tenty2b416b42021-11-09 17:44:44442# On AIX, avoid picking up VMX extensions(i.e. vec_malloc) which would change
443# the default alignment of the allocators here.
444if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
445 add_definitions("-D_XOPEN_SOURCE=700")
446endif()
447
Dan Albert0ed2e2f2014-07-03 19:35:48448#===============================================================================
449# Setup Source Code
450#===============================================================================
451
Anton Korobeynikovd3b50dc2015-05-08 16:10:11452set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
453 "Specify path to libunwind includes." FORCE)
454set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
455 "Specify path to libunwind source." FORCE)
456
Eric Fiselier94296842015-04-29 15:53:03457if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
Petr Hosek4fe63c72019-05-02 17:29:39458 find_path(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL libunwind.h
Anton Korobeynikovd3b50dc2015-05-08 16:10:11459 PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}
460 ${LIBCXXABI_LIBUNWIND_PATH}/include
461 ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES}
462 ${LLVM_MAIN_SRC_DIR}/projects/libunwind/include
Petr Hosekbfb371a2016-11-11 19:12:58463 ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/include
Petr Hosek86a9ddc2018-04-04 17:40:59464 ${LLVM_MAIN_SRC_DIR}/../libunwind/include
Anton Korobeynikov1af9c7b2015-05-09 21:03:01465 NO_DEFAULT_PATH
Don Hintonae858bf2018-01-22 19:41:05466 NO_CMAKE_FIND_ROOT_PATH
Anton Korobeynikovd3b50dc2015-05-08 16:10:11467 )
468
Asiri Rathnayake4cc78d72017-04-04 14:03:54469 if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")
470 set(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL "")
471 endif()
472
473 if (NOT LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "")
Michal Gorny40180b02017-01-14 17:05:16474 include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}")
475 endif()
Eugene Zelenko9d092752016-08-08 17:59:02476endif()
Dan Albert0ed2e2f2014-07-03 19:35:48477
478# Add source code. This also contains all of the logic for deciding linker flags
479# soname, etc...
Louis Dionne6dfdf792022-02-17 16:19:45480add_subdirectory(include)
Dan Albert0ed2e2f2014-07-03 19:35:48481add_subdirectory(src)
Dan Alberta770f9d2014-07-10 02:20:11482
Don Hinton964ea502018-01-18 18:29:36483if (LIBCXXABI_INCLUDE_TESTS)
Dominik Montada8c03fdf2020-08-24 09:01:05484 add_subdirectory(test)
485 add_subdirectory(fuzz)
Dan Alberta770f9d2014-07-10 02:20:11486endif()