blob: 10f100f7f0fbcdebcd6f54f9e30807f770569a7f [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})
Eric Fiselierf2348552014-10-18 01:15:17 +000040 if (EXISTS "${incpath}/${fpath}")
41 set(found TRUE)
42 get_filename_component(dstdir ${fpath} PATH)
43 get_filename_component(ifile ${fpath} NAME)
Petr Hosek76f569a2018-06-12 03:10:02 +000044 set(src ${incpath}/${fpath})
45
Petr Hosekf9bb1d72018-10-04 05:38:53 +000046 set(dst ${LIBCXX_BINARY_INCLUDE_DIR}/${dstdir}/${ifile})
Petr Hosek76f569a2018-06-12 03:10:02 +000047 add_custom_command(OUTPUT ${dst}
48 DEPENDS ${src}
49 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
50 COMMENT "Copying C++ ABI header ${fpath}...")
51 list(APPEND abilib_headers "${dst}")
52
Petr Hosekdb78bac2018-07-25 22:57:39 +000053 if (NOT LIBCXX_USING_INSTALLED_LLVM AND LIBCXX_HEADER_DIR)
Petr Hosek72dd2382018-07-24 15:49:29 +000054 set(dst "${LIBCXX_HEADER_DIR}/include/c++/v1/${dstdir}/${fpath}")
55 add_custom_command(OUTPUT ${dst}
56 DEPENDS ${src}
57 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
58 COMMENT "Copying C++ ABI header ${fpath}...")
59 list(APPEND abilib_headers "${dst}")
60 endif()
Petr Hosek76f569a2018-06-12 03:10:02 +000061
Eric Fiselier68205ee2015-08-26 20:18:21 +000062 if (LIBCXX_INSTALL_HEADERS)
Eric Fiselier830c7922017-01-16 20:47:35 +000063 install(FILES "${LIBCXX_BINARY_INCLUDE_DIR}/${fpath}"
Petr Hoseka2b5f392018-07-20 22:45:24 +000064 DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1/${dstdir}
Eric Fiselierda175a92017-11-25 23:39:17 +000065 COMPONENT cxx-headers
Eric Fiselier68205ee2015-08-26 20:18:21 +000066 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
67 )
68 endif()
Eric Fiselierf2348552014-10-18 01:15:17 +000069 endif()
70 endforeach()
71 if (NOT found)
Dan Albert800ee6e2015-02-10 18:46:57 +000072 message(WARNING "Failed to find ${fpath}")
Eric Fiselierf2348552014-10-18 01:15:17 +000073 endif()
74 endforeach()
75
Eric Fiselier830c7922017-01-16 20:47:35 +000076 include_directories("${LIBCXX_BINARY_INCLUDE_DIR}")
Petr Hosekc70331a2018-06-12 06:58:06 +000077 add_custom_target(cxx_abi_headers ALL DEPENDS ${abilib_headers})
78 set(LIBCXX_CXX_ABI_HEADER_TARGET "cxx_abi_headers")
Eric Fiselierf2348552014-10-18 01:15:17 +000079endmacro()
80
Eric Fiselier156a46d2015-07-30 22:30:34 +000081
82# Configure based on the selected ABI library.
Eric Fiselierf2348552014-10-18 01:15:17 +000083if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++" OR
84 "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libsupc++")
85 set(_LIBSUPCXX_INCLUDE_FILES
86 cxxabi.h bits/c++config.h bits/os_defines.h bits/cpu_defines.h
87 bits/cxxabi_tweaks.h bits/cxxabi_forced.h
88 )
89 if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++")
90 set(_LIBSUPCXX_DEFINES "-DLIBSTDCXX")
91 set(_LIBSUPCXX_LIBNAME stdc++)
92 else()
93 set(_LIBSUPCXX_DEFINES "")
94 set(_LIBSUPCXX_LIBNAME supc++)
95 endif()
Eric Fiselier828d6c42015-03-19 20:59:45 +000096 setup_abi_lib(
Eric Fiselierf2348552014-10-18 01:15:17 +000097 "-D__GLIBCXX__ ${_LIBSUPCXX_DEFINES}"
Petr Hosek5f81a592019-04-03 01:33:14 +000098 "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_INCLUDE_FILES}" "bits"
Eric Fiselierf2348552014-10-18 01:15:17 +000099 )
100elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi")
101 if (LIBCXX_CXX_ABI_INTREE)
102 # Link against just-built "cxxabi" target.
Petr Hosek5f81a592019-04-03 01:33:14 +0000103 set(CXXABI_SHARED_LIBNAME cxxabi_shared)
104 set(CXXABI_STATIC_LIBNAME cxxabi_static)
Eric Fiselierf2348552014-10-18 01:15:17 +0000105 else()
106 # Assume c++abi is installed in the system, rely on -lc++abi link flag.
Petr Hosek5f81a592019-04-03 01:33:14 +0000107 set(CXXABI_SHARED_LIBNAME "c++abi")
108 set(CXXABI_STATIC_LIBNAME "c++abi")
Eric Fiselierf2348552014-10-18 01:15:17 +0000109 endif()
Eric Fiselierec3a1672017-02-10 08:57:35 +0000110 if (LIBCXX_CXX_ABI_SYSTEM)
111 set(HEADERS "")
Petr Hosek5f81a592019-04-03 01:33:14 +0000112 else()
113 set(HEADERS "cxxabi.h;__cxxabi_config.h")
Eric Fiselierec3a1672017-02-10 08:57:35 +0000114 endif()
Petr Hosek5f81a592019-04-03 01:33:14 +0000115 setup_abi_lib(
116 "-DLIBCXX_BUILDING_LIBCXXABI"
117 "${CXXABI_SHARED_LIBNAME}" "${CXXABI_STATIC_LIBNAME}" "${HEADERS}" "")
Eric Fiselierf2348552014-10-18 01:15:17 +0000118elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
Petr Hosek5f81a592019-04-03 01:33:14 +0000119 setup_abi_lib(
120 "-DLIBCXXRT"
121 "cxxrt" "cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
Eric Fiselierf2348552014-10-18 01:15:17 +0000122 )
Eric Fiselier830c7922017-01-16 20:47:35 +0000123elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "vcruntime")
124 # Nothing TODO
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000125elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
126 list(APPEND LIBCXX_COMPILE_FLAGS "-D_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY")
127elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "default")
128 # Nothing TODO
129else()
Eric Fiselierf2348552014-10-18 01:15:17 +0000130 message(FATAL_ERROR
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000131 "Unsupported c++ abi: '${LIBCXX_CXX_ABI_LIBNAME}'. \
132 Currently libstdc++, libsupc++, libcxxabi, libcxxrt, default and none are
133 supported for c++ abi."
Eric Fiselierf2348552014-10-18 01:15:17 +0000134 )
Dan Albertb7edb6b2015-02-05 23:56:33 +0000135endif ()