blob: a58789f5bfb7124d8d763e5bab606e88fdef86f0 [file] [log] [blame]
Martell Malone062f8f02017-06-01 00:09:201# See www/CMake.html for instructions on how to build libcxxabi with CMake.
2
Louis Dionne19aec8c2020-03-12 22:01:203if (NOT IS_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../libcxx")
4 message(FATAL_ERROR "libc++abi now requires being built in a monorepo layout with libcxx available")
5endif()
6
Dan Albert0ed2e2f2014-07-03 19:35:487#===============================================================================
8# Setup Project
9#===============================================================================
10
Chris Bieneman1d72b892016-05-31 20:21:5311cmake_minimum_required(VERSION 3.4.3)
Dan Albert0ed2e2f2014-07-03 19:35:4812
Eric Fiselier42c8f932015-01-26 22:00:3013if(POLICY CMP0042)
14 cmake_policy(SET CMP0042 NEW) # Set MACOSX_RPATH=YES by default
15endif()
16
Petr Hosek5f3d5be2017-04-07 20:10:4117# Add path for custom modules
18set(CMAKE_MODULE_PATH
19 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
20 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
21 ${CMAKE_MODULE_PATH}
22 )
23
Jonas Hahnfeld66c60d92019-02-17 12:16:2024if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBCXXABI_STANDALONE_BUILD)
Martell Malone062f8f02017-06-01 00:09:2025 project(libcxxabi CXX C)
Dan Albert0ed2e2f2014-07-03 19:35:4826
27 set(PACKAGE_NAME libcxxabi)
Alex Langfordeffa0bc2020-01-30 20:18:2428 set(PACKAGE_VERSION 11.0.0git)
Dan Albert0ed2e2f2014-07-03 19:35:4829 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
Tanya Lattnerbe2225f2015-08-05 04:01:2630 set(PACKAGE_BUGREPORT "[email protected]")
Dan Albert0ed2e2f2014-07-03 19:35:4831
Martell Malone062f8f02017-06-01 00:09:2032 # Find the LLVM sources and simulate LLVM CMake options.
33 include(HandleOutOfTreeLLVM)
Dan Albert0ed2e2f2014-07-03 19:35:4834endif()
35
Martell Malone062f8f02017-06-01 00:09:2036# Require out of source build.
37include(MacroEnsureOutOfSourceBuild)
38MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
39 "${PROJECT_NAME} requires an out of source build. Please create a separate
40 build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
41 )
42
Dan Albert0ed2e2f2014-07-03 19:35:4843#===============================================================================
44# Setup CMake Options
45#===============================================================================
Martell Malone062f8f02017-06-01 00:09:2046include(CMakeDependentOption)
Petr Hosek5f3d5be2017-04-07 20:10:4147include(HandleCompilerRT)
Dan Albert0ed2e2f2014-07-03 19:35:4848
49# Define options.
Petr Hosek2e398f12019-07-12 19:10:5950option(LIBCXXABI_ENABLE_EXCEPTIONS
51 "Provide support for exceptions in the runtime.
52 When disabled, libc++abi does not support stack unwinding and other exceptions-related features." ON)
Dan Albert0ed2e2f2014-07-03 19:35:4853option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
54option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
Sam Clegg31d73942019-04-03 00:34:1255option(LIBCXXABI_ENABLE_PIC "Build Position-Independent Code, even in static library" ON)
Dan Albert0ed2e2f2014-07-03 19:35:4856option(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
Saleem Abdulrasoole5f6e2b2015-04-28 02:09:5357option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
Petr Hosekef6f2312017-02-09 02:19:3058option(LIBCXXABI_ENABLE_STATIC_UNWINDER "Statically link the LLVM unwinder." OFF)
Saleem Abdulrasool6e2aa5e2016-07-15 00:49:4259option(LIBCXXABI_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
Eric Fiselier559f8672014-11-24 22:42:0360option(LIBCXXABI_ENABLE_THREADS "Build with threads enabled" ON)
Ben Craig24a98612016-05-25 17:37:3861option(LIBCXXABI_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
Asiri Rathnayake97ba9fa2017-01-03 12:58:3462option(LIBCXXABI_HAS_EXTERNAL_THREAD_API
63 "Build libc++abi with an externalized threading API.
64 This option may only be set to ON when LIBCXXABI_ENABLE_THREADS=ON." OFF)
Asiri Rathnayakea573fe22017-01-09 11:57:2165option(LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY
66 "Build libc++abi with an externalized threading library.
67 This option may only be set to ON when LIBCXXABI_ENABLE_THREADS=ON" OFF)
Eric Fiselier38643b92017-03-02 21:55:1768
69# FIXME: This option should default to off. Unfortunatly GCC 4.9 fails to link
70# programs to due undefined references to new/delete in libc++abi. Once this
71# has been fixed or worked around the default value should be changed.
Eric Fiselier2ee1d902017-03-02 19:34:3572option(LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS
73 "Build libc++abi with definitions for operator new/delete. Normally libc++
Eric Fiselier38643b92017-03-02 21:55:1774 provides these definitions" ON)
Eric Fiselierffd18932016-06-02 02:18:3175option(LIBCXXABI_BUILD_32_BITS "Build 32 bit libc++abi." ${LLVM_BUILD_32_BITS})
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)")
Petr Hosekaa96d2e2017-11-17 23:25:0979option(LIBCXXABI_INSTALL_LIBRARY "Install the libc++abi library." ON)
Eric Fiselierffd18932016-06-02 02:18:3180set(LIBCXXABI_TARGET_TRIPLE "" CACHE STRING "Target triple for cross compiling.")
Ben Craig658310b2016-06-01 12:50:3081set(LIBCXXABI_GCC_TOOLCHAIN "" CACHE PATH "GCC toolchain for cross compiling.")
82set(LIBCXXABI_SYSROOT "" CACHE PATH "Sysroot for cross compiling.")
83set(LIBCXXABI_LIBCXX_LIBRARY_PATH "" CACHE PATH "The path to libc++ library.")
Louis Dionnebe52ff92019-10-07 19:22:0484set(LIBCXXABI_LIBRARY_VERSION "1.0" CACHE STRING
85"Version of libc++abi. This will be reflected in the name of the shared \
86library produced. For example, -DLIBCXXABI_LIBRARY_VERSION=x.y will \
87result in the library being named libc++abi.x.y.dylib, along with the \
88usual symlinks pointing to that.")
Dan Alberta770f9d2014-07-10 02:20:1189
90# Default to building a shared library so that the default options still test
91# the libc++abi that is being built. There are two problems with testing a
92# static libc++abi. In the case of a standalone build, the tests will link the
93# system's libc++, which might not have been built against our libc++abi. In the
94# case of an in tree build, libc++ will prefer a dynamic libc++abi from the
95# system over a static libc++abi from the output directory.
96option(LIBCXXABI_ENABLE_SHARED "Build libc++abi as a shared library." ON)
Eric Fiselier14dbeaa2015-03-03 15:59:0997option(LIBCXXABI_ENABLE_STATIC "Build libc++abi as a static library." ON)
98
Sam Clegg77c99ee2018-07-25 23:13:0099cmake_dependent_option(LIBCXXABI_INSTALL_STATIC_LIBRARY
100 "Install the static libc++abi library." ON
101 "LIBCXXABI_ENABLE_STATIC;LIBCXXABI_INSTALL_LIBRARY" OFF)
102cmake_dependent_option(LIBCXXABI_INSTALL_SHARED_LIBRARY
103 "Install the shared libc++abi library." ON
104 "LIBCXXABI_ENABLE_SHARED;LIBCXXABI_INSTALL_LIBRARY" OFF)
105
Petr Hosek058c04c2018-07-24 07:06:17106cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY
107 "Statically link the LLVM unwinder to static library" ON
108 "LIBCXXABI_ENABLE_STATIC_UNWINDER;LIBCXXABI_ENABLE_STATIC" OFF)
109cmake_dependent_option(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY
110 "Statically link the LLVM unwinder to shared library" ON
111 "LIBCXXABI_ENABLE_STATIC_UNWINDER;LIBCXXABI_ENABLE_SHARED" OFF)
112
Ranjeet Singhef6e6722017-03-01 11:42:01113option(LIBCXXABI_BAREMETAL "Build libc++abi for baremetal targets." OFF)
114# The default terminate handler attempts to demangle uncaught exceptions, which
115# causes extra I/O and demangling code to be pulled in.
116option(LIBCXXABI_SILENT_TERMINATE "Set this to make the terminate handler default to a silent alternative" OFF)
117
Eric Fiselier14dbeaa2015-03-03 15:59:09118if (NOT LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_STATIC)
119 message(FATAL_ERROR "libc++abi must be built as either a shared or static library.")
120endif()
Dan Alberta770f9d2014-07-10 02:20:11121
Mehdi Aminic1f152d2016-11-07 22:07:43122if (LLVM_EXTERNAL_LIBCXX_SOURCE_DIR)
Petr Hosekbfb371a2016-11-11 19:12:58123 set(LIBCXXABI_LIBCXX_SRC_DIRS ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR})
Mehdi Aminic1f152d2016-11-07 22:07:43124else()
Petr Hosekbfb371a2016-11-11 19:12:58125 set(LIBCXXABI_LIBCXX_SRC_DIRS
126 "${LLVM_MAIN_SRC_DIR}/projects/libcxx"
127 "${LLVM_MAIN_SRC_DIR}/runtimes/libcxx"
Petr Hosek86a9ddc2018-04-04 17:40:59128 "${LLVM_MAIN_SRC_DIR}/../libcxx"
Petr Hosekbfb371a2016-11-11 19:12:58129 )
Mehdi Aminic1f152d2016-11-07 22:07:43130endif()
131
Petr Hosekbfb371a2016-11-11 19:12:58132set(LIBCXXABI_LIBCXX_INCLUDE_DIRS "")
133foreach(dir ${LIBCXXABI_LIBCXX_SRC_DIRS})
134 list(APPEND LIBCXXABI_LIBCXX_INCLUDE_DIRS "${dir}/include")
135endforeach()
136
Dan Alberta770f9d2014-07-10 02:20:11137find_path(
138 LIBCXXABI_LIBCXX_INCLUDES
Shoaib Meenai51d5cc92018-06-30 01:25:47139 __config
Dan Alberta770f9d2014-07-10 02:20:11140 PATHS ${LIBCXXABI_LIBCXX_INCLUDES}
Eric Fiselier753f7c32015-01-22 20:00:06141 ${LIBCXXABI_LIBCXX_PATH}/include
Dan Alberta770f9d2014-07-10 02:20:11142 ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES}
Petr Hosekbfb371a2016-11-11 19:12:58143 ${LIBCXXABI_LIBCXX_INCLUDE_DIRS}
Dan Alberta770f9d2014-07-10 02:20:11144 ${LLVM_INCLUDE_DIR}/c++/v1
Shoaib Meenai777ec372018-06-30 01:04:50145 NO_DEFAULT_PATH
Don Hintonae858bf2018-01-22 19:41:05146 NO_CMAKE_FIND_ROOT_PATH
Dan Alberta770f9d2014-07-10 02:20:11147 )
148
Eric Fiselier753f7c32015-01-22 20:00:06149set(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_INCLUDES}" CACHE PATH
Dan Alberta770f9d2014-07-10 02:20:11150 "Specify path to libc++ includes." FORCE)
Dan Albert0ed2e2f2014-07-03 19:35:48151
Eric Fiselier753f7c32015-01-22 20:00:06152find_path(
153 LIBCXXABI_LIBCXX_PATH
Petr Hosek460af4b2017-02-18 04:37:59154 utils/libcxx/test/__init__.py
Eric Fiselier753f7c32015-01-22 20:00:06155 PATHS ${LIBCXXABI_LIBCXX_PATH}
156 ${LIBCXXABI_LIBCXX_INCLUDES}/../
Petr Hosekbfb371a2016-11-11 19:12:58157 ${LIBCXXABI_LIBCXX_SRC_DIRS}
Eric Fiselier753f7c32015-01-22 20:00:06158 NO_DEFAULT_PATH
Don Hintonae858bf2018-01-22 19:41:05159 NO_CMAKE_FIND_ROOT_PATH
Eric Fiselier753f7c32015-01-22 20:00:06160 )
161
162if (LIBCXXABI_LIBCXX_PATH STREQUAL "LIBCXXABI_LIBCXX_PATH-NOTFOUND")
163 message(WARNING "LIBCXXABI_LIBCXX_PATH was not specified and couldn't be infered.")
164 set(LIBCXXABI_LIBCXX_PATH "")
165endif()
166
167set(LIBCXXABI_LIBCXX_PATH "${LIBCXXABI_LIBCXX_PATH}" CACHE PATH
168 "Specify path to libc++ source." FORCE)
169
Petr Hosek8807db32019-01-24 03:18:29170option(LIBCXXABI_HERMETIC_STATIC_LIBRARY
171 "Do not export any symbols from the static library." OFF)
172
Dan Albert0ed2e2f2014-07-03 19:35:48173#===============================================================================
174# Configure System
175#===============================================================================
176
177# Add path for custom modules
178set(CMAKE_MODULE_PATH
179 "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
180 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
181 ${CMAKE_MODULE_PATH}
182 )
183
Chandler Carruth24a6b052014-12-29 12:22:04184set(LIBCXXABI_COMPILER ${CMAKE_CXX_COMPILER})
185set(LIBCXXABI_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
186set(LIBCXXABI_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
Petr Hosek887f26d2018-06-28 03:11:52187
188string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION
189 ${PACKAGE_VERSION})
190
191if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
Petr Hosek81f433b2019-05-22 21:08:33192 set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++)
193 set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++)
194 if(LIBCXX_LIBDIR_SUBDIR)
195 string(APPEND LIBCXXABI_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR})
196 string(APPEND LIBCXXABI_INSTALL_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR})
197 endif()
Petr Hosek887f26d2018-06-28 03:11:52198elseif(LLVM_LIBRARY_OUTPUT_INTDIR)
Jonas Hahnfeld57aa0d42017-05-04 06:04:49199 set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
Petr Hosek81f433b2019-05-22 21:08:33200 set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LIBCXXABI_LIBDIR_SUFFIX})
Jonas Hahnfeld57aa0d42017-05-04 06:04:49201else()
Petr Hosekcbb43132018-07-25 16:51:00202 set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
Petr Hosek81f433b2019-05-22 21:08:33203 set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LIBCXXABI_LIBDIR_SUFFIX})
Jonas Hahnfeld57aa0d42017-05-04 06:04:49204endif()
Chandler Carruth24a6b052014-12-29 12:22:04205
Petr Hosek81f433b2019-05-22 21:08:33206set(LIBCXXABI_INSTALL_PREFIX "" CACHE STRING "Define libc++abi destination prefix.")
Petr Hosek60fe5792017-07-11 01:42:26207
Ben Craigab56c402016-04-18 13:30:38208set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
209set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
Martell Malone062f8f02017-06-01 00:09:20210set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR})
Ben Craigab56c402016-04-18 13:30:38211
Ben Craig658310b2016-06-01 12:50:30212# By default, for non-standalone builds, libcxx and libcxxabi share a library
213# directory.
214if (NOT LIBCXXABI_LIBCXX_LIBRARY_PATH)
215 set(LIBCXXABI_LIBCXX_LIBRARY_PATH "${LIBCXXABI_LIBRARY_DIR}" CACHE PATH
Sergej Jaskiewiczfb76c792019-12-26 09:28:39216 "The path to libc++ library." FORCE)
Eugene Zelenko9d092752016-08-08 17:59:02217endif()
Eric Fiselierffd18932016-06-02 02:18:31218
219# Check that we can build with 32 bits if requested.
220if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32)
221 if (LIBCXXABI_BUILD_32_BITS AND NOT LLVM_BUILD_32_BITS) # Don't duplicate the output from LLVM
222 message(STATUS "Building 32 bits executables and libraries.")
223 endif()
224elseif(LIBCXXABI_BUILD_32_BITS)
225 message(FATAL_ERROR "LIBCXXABI_BUILD_32_BITS=ON is not supported on this platform.")
226endif()
227
Martell Malone062f8f02017-06-01 00:09:20228# Declare libc++abi configuration variables.
229# They are intended for use as follows:
230# LIBCXXABI_C_FLAGS: General flags for both the c++ compiler and linker.
231# LIBCXXABI_CXX_FLAGS: General flags for both the c++ compiler and linker.
232# LIBCXXABI_COMPILE_FLAGS: Compile only flags.
233# LIBCXXABI_LINK_FLAGS: Linker only flags.
234# LIBCXXABI_LIBRARIES: libraries libc++abi is linked to.
Eric Fiselierffd18932016-06-02 02:18:31235
Logan Chiendbcd7a32015-01-22 13:39:08236set(LIBCXXABI_C_FLAGS "")
Eric Fiselier5cb50512014-11-18 20:37:53237set(LIBCXXABI_CXX_FLAGS "")
238set(LIBCXXABI_COMPILE_FLAGS "")
239set(LIBCXXABI_LINK_FLAGS "")
Martell Malone062f8f02017-06-01 00:09:20240set(LIBCXXABI_LIBRARIES "")
241
242# Include macros for adding and removing libc++abi flags.
243include(HandleLibcxxabiFlags)
244
245#===============================================================================
246# Setup Compiler Flags
247#===============================================================================
Eric Fiselier5cb50512014-11-18 20:37:53248
Eric Fiselierffd18932016-06-02 02:18:31249# Configure target flags
250add_target_flags_if(LIBCXXABI_BUILD_32_BITS "-m32")
Petr Hosek6fd4e7f2019-02-04 20:02:26251
252if(LIBCXXABI_TARGET_TRIPLE)
253 add_target_flags("--target=${LIBCXXABI_TARGET_TRIPLE}")
254elseif(CMAKE_CXX_COMPILER_TARGET)
255 set(LIBCXXABI_TARGET_TRIPLE "${CMAKE_CXX_COMPILER_TARGET}")
256endif()
257if(LIBCXX_GCC_TOOLCHAIN)
258 add_target_flags("--gcc-toolchain=${LIBCXXABI_GCC_TOOLCHAIN}")
259elseif(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN)
260 set(LIBCXXABI_GCC_TOOLCHAIN "${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
261endif()
262if(LIBCXXABI_SYSROOT)
263 add_target_flags("--sysroot=${LIBCXXABI_SYSROOT}")
264elseif(CMAKE_SYSROOT)
265 set(LIBCXXABI_SYSROOT "${CMAKE_SYSROOT}")
266endif()
Eric Fiselierffd18932016-06-02 02:18:31267
Eric Fiselier79ff8f032016-11-13 22:27:00268if (LIBCXXABI_TARGET_TRIPLE)
269 set(TARGET_TRIPLE "${LIBCXXABI_TARGET_TRIPLE}")
270endif()
271
Eric Fiselierffd18932016-06-02 02:18:31272# Configure compiler. Must happen after setting the target flags.
273include(config-ix)
Eric Fiselier5cb50512014-11-18 20:37:53274
Dan Albert0ed2e2f2014-07-03 19:35:48275if (LIBCXXABI_HAS_NOSTDINCXX_FLAG)
Eric Fiselier5cb50512014-11-18 20:37:53276 list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
Sam Clegg4230fa92019-11-07 22:51:25277 # cmake 3.14 and above remove system include paths that are explicitly
278 # passed on the command line. We build with -nostdinc++ and explicitly add
279 # just the libcxx system include paths with -I on the command line.
280 # Setting CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES effectively prevents cmake
281 # from removing these.
282 # See: https://gitlab.kitware.com/cmake/cmake/issues/19227
283 set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "")
Eric Fiselier5cb50512014-11-18 20:37:53284 # Remove -stdlib flags to prevent them from causing an unused flag warning.
285 string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
286 string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48287endif()
Dan Albert0ed2e2f2014-07-03 19:35:48288
Shoaib Meenai88c6acf2016-09-27 03:44:09289# Let the library headers know they are currently being used to build the
290# library.
291add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)
292
293# Disable DLL annotations on Windows for static builds.
294if (WIN32 AND LIBCXXABI_ENABLE_STATIC AND NOT LIBCXXABI_ENABLE_SHARED)
Martell Malone41119cd2017-05-28 22:46:50295 add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
Shoaib Meenai88c6acf2016-09-27 03:44:09296endif()
297
Martell Malone062f8f02017-06-01 00:09:20298add_compile_flags_if_supported(-Werror=return-type)
Dan Albert0ed2e2f2014-07-03 19:35:48299
300# Get warning flags
Martell Malone062f8f02017-06-01 00:09:20301add_compile_flags_if_supported(-W)
302add_compile_flags_if_supported(-Wall)
303add_compile_flags_if_supported(-Wchar-subscripts)
304add_compile_flags_if_supported(-Wconversion)
305add_compile_flags_if_supported(-Wmismatched-tags)
306add_compile_flags_if_supported(-Wmissing-braces)
307add_compile_flags_if_supported(-Wnewline-eof)
308add_compile_flags_if_supported(-Wunused-function)
309add_compile_flags_if_supported(-Wshadow)
310add_compile_flags_if_supported(-Wshorten-64-to-32)
311add_compile_flags_if_supported(-Wsign-compare)
312add_compile_flags_if_supported(-Wsign-conversion)
313add_compile_flags_if_supported(-Wstrict-aliasing=2)
314add_compile_flags_if_supported(-Wstrict-overflow=4)
315add_compile_flags_if_supported(-Wunused-parameter)
316add_compile_flags_if_supported(-Wunused-variable)
317add_compile_flags_if_supported(-Wwrite-strings)
318add_compile_flags_if_supported(-Wundef)
Dan Albert3c4780e2014-07-10 22:23:03319
Dan Albert0ed2e2f2014-07-03 19:35:48320if (LIBCXXABI_ENABLE_WERROR)
Martell Malone062f8f02017-06-01 00:09:20321 add_compile_flags_if_supported(-Werror)
322 add_compile_flags_if_supported(-WX)
Dan Albert0ed2e2f2014-07-03 19:35:48323else()
Martell Malone062f8f02017-06-01 00:09:20324 add_compile_flags_if_supported(-Wno-error)
325 add_compile_flags_if_supported(-WX-)
Dan Albert0ed2e2f2014-07-03 19:35:48326endif()
327if (LIBCXXABI_ENABLE_PEDANTIC)
Martell Malone062f8f02017-06-01 00:09:20328 add_compile_flags_if_supported(-pedantic)
Dan Albert0ed2e2f2014-07-03 19:35:48329endif()
330
331# Get feature flags.
Martell Malone062f8f02017-06-01 00:09:20332add_compile_flags_if_supported(-fstrict-aliasing)
Dan Albert0ed2e2f2014-07-03 19:35:48333
Asiri Rathnayake57e446d2016-05-31 12:01:32334# Exceptions
335if (LIBCXXABI_ENABLE_EXCEPTIONS)
336 # Catches C++ exceptions only and tells the compiler to assume that extern C
337 # functions never throw a C++ exception.
Martell Malone062f8f02017-06-01 00:09:20338 add_compile_flags_if_supported(-EHsc)
339 # Do we really need to be run through the C compiler ?
340 add_c_compile_flags_if_supported(-funwind-tables)
Asiri Rathnayake57e446d2016-05-31 12:01:32341else()
342 add_definitions(-D_LIBCXXABI_NO_EXCEPTIONS)
Martell Malone062f8f02017-06-01 00:09:20343 add_compile_flags_if_supported(-fno-exceptions)
344 add_compile_flags_if_supported(-EHs-)
345 add_compile_flags_if_supported(-EHa-)
Asiri Rathnayake57e446d2016-05-31 12:01:32346endif()
Logan Chiendbcd7a32015-01-22 13:39:08347
Dan Albert0ed2e2f2014-07-03 19:35:48348# Assert
349string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
350if (LIBCXXABI_ENABLE_ASSERTIONS)
351 # MSVC doesn't like _DEBUG on release builds. See PR 4379.
352 if (NOT MSVC)
Eric Fiselier5cb50512014-11-18 20:37:53353 list(APPEND LIBCXXABI_COMPILE_FLAGS -D_DEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48354 endif()
355 # On Release builds cmake automatically defines NDEBUG, so we
356 # explicitly undefine it:
357 if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53358 list(APPEND LIBCXXABI_COMPILE_FLAGS -UNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48359 endif()
360else()
361 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
Eric Fiselier5cb50512014-11-18 20:37:53362 list(APPEND LIBCXXABI_COMPILE_FLAGS -DNDEBUG)
Dan Albert0ed2e2f2014-07-03 19:35:48363 endif()
364endif()
365# Static library
366if (NOT LIBCXXABI_ENABLE_SHARED)
Eric Fiselier5cb50512014-11-18 20:37:53367 list(APPEND LIBCXXABI_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC)
Dan Albert0ed2e2f2014-07-03 19:35:48368endif()
369
Asiri Rathnayake97ba9fa2017-01-03 12:58:34370# Threading
Eric Fiselier559f8672014-11-24 22:42:03371if (NOT LIBCXXABI_ENABLE_THREADS)
Ben Craig24a98612016-05-25 17:37:38372 if (LIBCXXABI_HAS_PTHREAD_API)
373 message(FATAL_ERROR "LIBCXXABI_HAS_PTHREAD_API can only"
374 " be set to ON when LIBCXXABI_ENABLE_THREADS"
375 " is also set to ON.")
376 endif()
Asiri Rathnayake97ba9fa2017-01-03 12:58:34377 if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
378 message(FATAL_ERROR "LIBCXXABI_HAS_EXTERNAL_THREAD_API can only"
379 " be set to ON when LIBCXXABI_ENABLE_THREADS"
380 " is also set to ON.")
381 endif()
Asiri Rathnayakea573fe22017-01-09 11:57:21382 if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
383 message(FATAL_ERROR "LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY can only"
384 " be set to ON when LIBCXXABI_ENABLE_THREADS"
385 " is also set to ON.")
386 endif()
Asiri Rathnayake7c98baa2016-09-21 09:09:32387 add_definitions(-D_LIBCXXABI_HAS_NO_THREADS)
Eric Fiselier559f8672014-11-24 22:42:03388endif()
389
Asiri Rathnayakea573fe22017-01-09 11:57:21390if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
391 if (LIBCXXABI_HAS_PTHREAD_API)
392 message(FATAL_ERROR "The options LIBCXXABI_HAS_EXTERNAL_THREAD_API"
393 " and LIBCXXABI_HAS_PTHREAD_API cannot be both"
394 " set to ON at the same time.")
395 endif()
396 if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
397 message(FATAL_ERROR "The options LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY"
398 " and LIBCXXABI_HAS_EXTERNAL_THREAD_API cannot be both"
399 " set to ON at the same time.")
400 endif()
Asiri Rathnayake97ba9fa2017-01-03 12:58:34401endif()
402
NAKAMURA Takumi83105a42017-07-31 09:35:08403if (LLVM_ENABLE_MODULES)
404 # Ignore that the rest of the modules flags are now unused.
405 add_compile_flags_if_supported(-Wno-unused-command-line-argument)
406 add_compile_flags(-fno-modules)
407endif()
408
Eric Fiselier6f8d62d2017-03-04 02:15:37409set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS OFF)
410if ((NOT LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
Eric Fiselier70c2b1c2017-05-11 03:49:48411 OR (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY AND LIBCXXABI_ENABLE_SHARED)
412 OR MINGW)
Eric Fiselier6f8d62d2017-03-04 02:15:37413 set(LIBCXXABI_HAS_UNDEFINED_SYMBOLS ON)
414endif()
Eric Fiselier2ee1d902017-03-02 19:34:35415
416if (LIBCXXABI_HAS_UNDEFINED_SYMBOLS)
Asiri Rathnayake97ba9fa2017-01-03 12:58:34417 # Need to allow unresolved symbols if this is to work with shared library builds
418 if (APPLE)
Eric Fiselier6f8d62d2017-03-04 02:15:37419 list(APPEND LIBCXXABI_LINK_FLAGS "-undefined dynamic_lookup")
Asiri Rathnayake97ba9fa2017-01-03 12:58:34420 else()
421 # Relax this restriction from HandleLLVMOptions
422 string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
423 endif()
424endif()
425
Ben Craig24a98612016-05-25 17:37:38426if (LIBCXXABI_HAS_PTHREAD_API)
427 add_definitions(-D_LIBCPP_HAS_THREAD_API_PTHREAD)
428endif()
429
Asiri Rathnayake97ba9fa2017-01-03 12:58:34430if (LIBCXXABI_HAS_EXTERNAL_THREAD_API)
Asiri Rathnayakea573fe22017-01-09 11:57:21431 add_definitions(-D_LIBCPP_HAS_THREAD_API_EXTERNAL)
432endif()
433
434if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
435 add_definitions(-D_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
Asiri Rathnayake97ba9fa2017-01-03 12:58:34436endif()
437
Shoaib Meenaif43726c2017-05-10 21:52:39438# Prevent libc++abi from having library dependencies on libc++
439add_definitions(-D_LIBCPP_DISABLE_EXTERN_TEMPLATE)
440
Nico Weber297ec322018-04-29 23:05:11441# Bring back `std::unexpected`, which is removed in C++17, to support
442# pre-C++17.
443add_definitions(-D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS)
444
Dan Albert0ed2e2f2014-07-03 19:35:48445if (MSVC)
446 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
447endif()
448
Logan Chien4947eb62015-01-22 13:27:36449# Define LIBCXXABI_USE_LLVM_UNWINDER for conditional compilation.
Logan Chien71cdd302016-11-13 14:42:15450if (LIBCXXABI_USE_LLVM_UNWINDER)
Ranjeet Singhef6e6722017-03-01 11:42:01451 add_definitions(-DLIBCXXABI_USE_LLVM_UNWINDER)
Logan Chien4947eb62015-01-22 13:27:36452endif()
453
James Y Knight0d3145f2017-01-13 19:22:26454if (LIBCXXABI_SILENT_TERMINATE)
Ranjeet Singhef6e6722017-03-01 11:42:01455 add_definitions(-DLIBCXXABI_SILENT_TERMINATE)
456endif()
457
458if (LIBCXXABI_BAREMETAL)
459 add_definitions(-DLIBCXXABI_BAREMETAL)
James Y Knight0d3145f2017-01-13 19:22:26460endif()
461
Petr Hosek789b7f02019-05-30 04:40:21462if (LIBCXXABI_HAS_COMMENT_LIB_PRAGMA)
Michał Górnya9b5fff2019-12-02 10:49:20463 if (LIBCXXABI_HAS_PTHREAD_LIB)
464 add_definitions(-D_LIBCXXABI_LINK_PTHREAD_LIB)
465 endif()
Petr Hosek789b7f02019-05-30 04:40:21466endif()
467
Eric Fiselier5cb50512014-11-18 20:37:53468string(REPLACE ";" " " LIBCXXABI_CXX_FLAGS "${LIBCXXABI_CXX_FLAGS}")
469set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")
Logan Chiendbcd7a32015-01-22 13:39:08470set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")
Dan Albert0ed2e2f2014-07-03 19:35:48471
472#===============================================================================
473# Setup Source Code
474#===============================================================================
475
Anton Korobeynikovd3b50dc2015-05-08 16:10:11476set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
477 "Specify path to libunwind includes." FORCE)
478set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
479 "Specify path to libunwind source." FORCE)
480
Dan Albert0ed2e2f2014-07-03 19:35:48481include_directories(include)
Eric Fiselier94296842015-04-29 15:53:03482if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
Petr Hosek4fe63c72019-05-02 17:29:39483 find_path(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL libunwind.h
Anton Korobeynikovd3b50dc2015-05-08 16:10:11484 PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}
485 ${LIBCXXABI_LIBUNWIND_PATH}/include
486 ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES}
487 ${LLVM_MAIN_SRC_DIR}/projects/libunwind/include
Petr Hosekbfb371a2016-11-11 19:12:58488 ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/include
Petr Hosek86a9ddc2018-04-04 17:40:59489 ${LLVM_MAIN_SRC_DIR}/../libunwind/include
Anton Korobeynikov1af9c7b2015-05-09 21:03:01490 NO_DEFAULT_PATH
Don Hintonae858bf2018-01-22 19:41:05491 NO_CMAKE_FIND_ROOT_PATH
Anton Korobeynikovd3b50dc2015-05-08 16:10:11492 )
493
Asiri Rathnayake4cc78d72017-04-04 14:03:54494 if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")
495 set(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL "")
496 endif()
497
498 if (NOT LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "")
Michal Gorny40180b02017-01-14 17:05:16499 include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}")
500 endif()
Eugene Zelenko9d092752016-08-08 17:59:02501endif()
Dan Albert0ed2e2f2014-07-03 19:35:48502
503# Add source code. This also contains all of the logic for deciding linker flags
504# soname, etc...
505add_subdirectory(src)
Dan Alberta770f9d2014-07-10 02:20:11506
Don Hinton964ea502018-01-18 18:29:36507if (LIBCXXABI_INCLUDE_TESTS)
508 if (LIBCXXABI_STANDALONE_BUILD AND NOT LIBCXXABI_ENABLE_SHARED)
509 # We can't reasonably test the system C++ library with a static
510 # libc++abi. We either need to be able to replace libc++abi at
511 # run time (with a shared libc++abi), or we need to be able to
512 # replace the C++ runtime (with a non- standalone build).
513 message(WARNING "The libc++abi tests aren't valid when libc++abi "
514 "is built standalone (i.e. outside of "
515 "llvm/projects/libcxxabi ) and is built without "
516 "a shared library. Either build a shared "
517 "library, build libc++abi at the same time as "
518 "you build libc++, or do without testing. No "
519 "check target will be available!")
520 else()
521 add_subdirectory(test)
522 add_subdirectory(fuzz)
523 endif()
Dan Alberta770f9d2014-07-10 02:20:11524endif()