blob: 5a8a4a270a1a1b1368f411d1f4634efaab877325 [file] [log] [blame]
Eric Fiselierf2348552014-10-18 01:15:17 +00001
2#===============================================================================
3# Add an ABI library if appropriate
4#===============================================================================
5
6#
7# _setup_abi: Set up the build to use an ABI library
8#
9# Parameters:
10# abidefines: A list of defines needed to compile libc++ with the ABI library
Petr Hosek5f81a592019-04-03 01:33:14 +000011# abishared : The shared ABI library to link against.
12# abistatic : The static ABI library to link against.
Eric Fiselierf2348552014-10-18 01:15:17 +000013# abifiles : A list of files (which may be relative paths) to copy into the
Richard Smithd0cd8722017-01-05 02:55:10 +000014# libc++ build tree for the build. These files will be copied
15# twice: once into include/, so the libc++ build itself can find
16# them, and once into include/c++/v1, so that a clang built into
17# the same build area will find them. These files will also be
Eric Fiselierf2348552014-10-18 01:15:17 +000018# installed alongside the libc++ headers.
19# abidirs : A list of relative paths to create under an include directory
20# in the libc++ build directory.
21#
Eric Fiselier830c7922017-01-16 20:47:35 +000022
Petr Hosek5f81a592019-04-03 01:33:14 +000023macro(setup_abi_lib abidefines abishared abistatic abifiles abidirs)
Eric Fiselierd0e4e102014-11-15 17:25:23 +000024 list(APPEND LIBCXX_COMPILE_FLAGS ${abidefines})
Eric Fiselier828d6c42015-03-19 20:59:45 +000025 set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_CXX_ABI_INCLUDE_PATHS}"
Eric Fiselierf2348552014-10-18 01:15:17 +000026 CACHE PATH
27 "Paths to C++ ABI header directories separated by ';'." FORCE
28 )
Eric Fiselier5c467ab2016-05-27 23:05:37 +000029 set(LIBCXX_CXX_ABI_LIBRARY_PATH "${LIBCXX_CXX_ABI_LIBRARY_PATH}"
30 CACHE PATH
31 "Paths to C++ ABI library directory"
32 )
Petr Hosek5f81a592019-04-03 01:33:14 +000033 set(LIBCXX_CXX_SHARED_ABI_LIBRARY ${abishared})
34 set(LIBCXX_CXX_STATIC_ABI_LIBRARY ${abistatic})
Eric Fiselierf2348552014-10-18 01:15:17 +000035 set(LIBCXX_ABILIB_FILES ${abifiles})
36
Eric Fiselierf2348552014-10-18 01:15:17 +000037 foreach(fpath ${LIBCXX_ABILIB_FILES})
38 set(found FALSE)
Eric Fiselier828d6c42015-03-19 20:59:45 +000039 foreach(incpath ${LIBCXX_CXX_ABI_INCLUDE_PATHS})
Sergej Jaskiewicz30921922020-03-11 21:00:46 +030040 message(STATUS "Looking for ${fpath} in ${incpath}")
Eric Fiselierf2348552014-10-18 01:15:17 +000041 if (EXISTS "${incpath}/${fpath}")
42 set(found TRUE)
Sergej Jaskiewicz30921922020-03-11 21:00:46 +030043 message(STATUS "Looking for ${fpath} in ${incpath} - found")
Eric Fiselierf2348552014-10-18 01:15:17 +000044 get_filename_component(dstdir ${fpath} PATH)
45 get_filename_component(ifile ${fpath} NAME)
Petr Hosek76f569a2018-06-12 03:10:02 +000046 set(src ${incpath}/${fpath})
47
Petr Hosekf9bb1d72018-10-04 05:38:53 +000048 set(dst ${LIBCXX_BINARY_INCLUDE_DIR}/${dstdir}/${ifile})
Petr Hosek76f569a2018-06-12 03:10:02 +000049 add_custom_command(OUTPUT ${dst}
50 DEPENDS ${src}
51 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
52 COMMENT "Copying C++ ABI header ${fpath}...")
53 list(APPEND abilib_headers "${dst}")
54
Louis Dionne94870d82020-06-26 12:08:59 -040055 # TODO: libc++ shouldn't be responsible for copying the libc++abi
56 # headers into the right location.
Petr Hosek80038922021-04-27 23:30:53 -070057 set(dst "${LIBCXX_GENERATED_INCLUDE_DIR}/${dstdir}/${fpath}")
Louis Dionne94870d82020-06-26 12:08:59 -040058 add_custom_command(OUTPUT ${dst}
59 DEPENDS ${src}
60 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
61 COMMENT "Copying C++ ABI header ${fpath}...")
62 list(APPEND abilib_headers "${dst}")
Petr Hosek76f569a2018-06-12 03:10:02 +000063
Eric Fiselier68205ee2015-08-26 20:18:21 +000064 if (LIBCXX_INSTALL_HEADERS)
Eric Fiselier830c7922017-01-16 20:47:35 +000065 install(FILES "${LIBCXX_BINARY_INCLUDE_DIR}/${fpath}"
Petr Hosek1756ac62021-03-31 17:34:05 -070066 DESTINATION include/c++/v1/${dstdir}
Eric Fiselierda175a92017-11-25 23:39:17 +000067 COMPONENT cxx-headers
Eric Fiselier68205ee2015-08-26 20:18:21 +000068 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
69 )
70 endif()
Sergej Jaskiewicz30921922020-03-11 21:00:46 +030071 else()
72 message(STATUS "Looking for ${fpath} in ${incpath} - not found")
Eric Fiselierf2348552014-10-18 01:15:17 +000073 endif()
74 endforeach()
75 if (NOT found)
Sergej Jaskiewicz30921922020-03-11 21:00:46 +030076 message(WARNING "Failed to find ${fpath} in ${LIBCXX_CXX_ABI_INCLUDE_PATHS}")
Eric Fiselierf2348552014-10-18 01:15:17 +000077 endif()
78 endforeach()
79
Eric Fiselier830c7922017-01-16 20:47:35 +000080 include_directories("${LIBCXX_BINARY_INCLUDE_DIR}")
Petr Hosekc70331a2018-06-12 06:58:06 +000081 add_custom_target(cxx_abi_headers ALL DEPENDS ${abilib_headers})
82 set(LIBCXX_CXX_ABI_HEADER_TARGET "cxx_abi_headers")
Eric Fiselierf2348552014-10-18 01:15:17 +000083endmacro()
84
Eric Fiselier156a46d2015-07-30 22:30:34 +000085
86# Configure based on the selected ABI library.
Eric Fiselierf2348552014-10-18 01:15:17 +000087if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++" OR
88 "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libsupc++")
89 set(_LIBSUPCXX_INCLUDE_FILES
90 cxxabi.h bits/c++config.h bits/os_defines.h bits/cpu_defines.h
91 bits/cxxabi_tweaks.h bits/cxxabi_forced.h
92 )
93 if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++")
94 set(_LIBSUPCXX_DEFINES "-DLIBSTDCXX")
95 set(_LIBSUPCXX_LIBNAME stdc++)
96 else()
97 set(_LIBSUPCXX_DEFINES "")
98 set(_LIBSUPCXX_LIBNAME supc++)
99 endif()
Eric Fiselier828d6c42015-03-19 20:59:45 +0000100 setup_abi_lib(
Eric Fiselierf2348552014-10-18 01:15:17 +0000101 "-D__GLIBCXX__ ${_LIBSUPCXX_DEFINES}"
Petr Hosek5f81a592019-04-03 01:33:14 +0000102 "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_INCLUDE_FILES}" "bits"
Eric Fiselierf2348552014-10-18 01:15:17 +0000103 )
104elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi")
Alex Richardson91fb06a2020-06-18 17:07:49 +0100105 if(NOT LIBCXX_CXX_ABI_INCLUDE_PATHS)
106 set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_SOURCE_DIR}/../libcxxabi/include")
107 endif()
Raul Tambre28a11052020-04-02 09:34:02 -0400108
Louis Dionne590edd22020-04-03 14:08:53 -0400109 if(LIBCXX_STANDALONE_BUILD AND NOT (LIBCXX_CXX_ABI_INTREE OR HAVE_LIBCXXABI))
Raul Tambre28a11052020-04-02 09:34:02 -0400110 set(shared c++abi)
111 set(static c++abi)
112 else()
113 set(shared cxxabi_shared)
114 set(static cxxabi_static)
115 endif()
116
Petr Hosek5f81a592019-04-03 01:33:14 +0000117 setup_abi_lib(
118 "-DLIBCXX_BUILDING_LIBCXXABI"
Raul Tambre28a11052020-04-02 09:34:02 -0400119 "${shared}" "${static}" "cxxabi.h;__cxxabi_config.h" "")
Eric Fiselierf2348552014-10-18 01:15:17 +0000120elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
Alex Richardson91fb06a2020-06-18 17:07:49 +0100121 if(NOT LIBCXX_CXX_ABI_INCLUDE_PATHS)
122 set(LIBCXX_CXX_ABI_INCLUDE_PATHS "/usr/include/c++/v1")
123 endif()
Dimitry Andric8ffa7b92021-02-15 18:22:01 +0100124 # libcxxrt does not provide aligned new and delete operators
125 set(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS ON)
Petr Hosek5f81a592019-04-03 01:33:14 +0000126 setup_abi_lib(
127 "-DLIBCXXRT"
128 "cxxrt" "cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
Eric Fiselierf2348552014-10-18 01:15:17 +0000129 )
Eric Fiselier830c7922017-01-16 20:47:35 +0000130elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "vcruntime")
Louis Dionne091da9f2020-05-01 13:10:06 -0400131 # Nothing to do
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000132elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
133 list(APPEND LIBCXX_COMPILE_FLAGS "-D_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY")
134elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "default")
Louis Dionne091da9f2020-05-01 13:10:06 -0400135 # Nothing to do
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000136else()
Eric Fiselierf2348552014-10-18 01:15:17 +0000137 message(FATAL_ERROR
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000138 "Unsupported c++ abi: '${LIBCXX_CXX_ABI_LIBNAME}'. \
139 Currently libstdc++, libsupc++, libcxxabi, libcxxrt, default and none are
140 supported for c++ abi."
Eric Fiselierf2348552014-10-18 01:15:17 +0000141 )
Dan Albertb7edb6b2015-02-05 23:56:33 +0000142endif ()