blob: 973d87584e4dcb13f9a1c53e1bd45982b845098e [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
Petr Hosekdb78bac2018-07-25 22:57:39 +000055 if (NOT LIBCXX_USING_INSTALLED_LLVM AND LIBCXX_HEADER_DIR)
Petr Hosek72dd2382018-07-24 15:49:29 +000056 set(dst "${LIBCXX_HEADER_DIR}/include/c++/v1/${dstdir}/${fpath}")
57 add_custom_command(OUTPUT ${dst}
58 DEPENDS ${src}
59 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
60 COMMENT "Copying C++ ABI header ${fpath}...")
61 list(APPEND abilib_headers "${dst}")
62 endif()
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 Hoseka2b5f392018-07-20 22:45:24 +000066 DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}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")
Louis Dionne83a5f582020-04-02 02:09:23 -0400105 set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_SOURCE_DIR}/../libcxxabi/include")
Raul Tambre28a11052020-04-02 09:34:02 -0400106
Louis Dionne590edd22020-04-03 14:08:53 -0400107 if(LIBCXX_STANDALONE_BUILD AND NOT (LIBCXX_CXX_ABI_INTREE OR HAVE_LIBCXXABI))
Raul Tambre28a11052020-04-02 09:34:02 -0400108 set(shared c++abi)
109 set(static c++abi)
110 else()
111 set(shared cxxabi_shared)
112 set(static cxxabi_static)
113 endif()
114
Petr Hosek5f81a592019-04-03 01:33:14 +0000115 setup_abi_lib(
116 "-DLIBCXX_BUILDING_LIBCXXABI"
Raul Tambre28a11052020-04-02 09:34:02 -0400117 "${shared}" "${static}" "cxxabi.h;__cxxabi_config.h" "")
Eric Fiselierf2348552014-10-18 01:15:17 +0000118elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
Louis Dionne83a5f582020-04-02 02:09:23 -0400119 set(LIBCXX_CXX_ABI_INCLUDE_PATHS "/usr/include/c++/v1")
Petr Hosek5f81a592019-04-03 01:33:14 +0000120 setup_abi_lib(
121 "-DLIBCXXRT"
122 "cxxrt" "cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
Eric Fiselierf2348552014-10-18 01:15:17 +0000123 )
Eric Fiselier830c7922017-01-16 20:47:35 +0000124elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "vcruntime")
Louis Dionne091da9f2020-05-01 13:10:06 -0400125 # Nothing to do
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000126elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
127 list(APPEND LIBCXX_COMPILE_FLAGS "-D_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY")
128elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "default")
Louis Dionne091da9f2020-05-01 13:10:06 -0400129 # Nothing to do
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000130else()
Eric Fiselierf2348552014-10-18 01:15:17 +0000131 message(FATAL_ERROR
Eric Fiselierb0da5fa2017-01-03 01:18:48 +0000132 "Unsupported c++ abi: '${LIBCXX_CXX_ABI_LIBNAME}'. \
133 Currently libstdc++, libsupc++, libcxxabi, libcxxrt, default and none are
134 supported for c++ abi."
Eric Fiselierf2348552014-10-18 01:15:17 +0000135 )
Dan Albertb7edb6b2015-02-05 23:56:33 +0000136endif ()