This revision was automatically updated to reflect the committed changes.
Closed by commit rGa80e65e00ada: [libc++] Overhaul how we select the ABI
library (authored by ldionne).
Changed prior to commit:
https://reviews.llvm.org/D120727?vs=429069&id=429209#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120727/new/
https://reviews.llvm.org/D120727
Files:
clang/cmake/caches/CrossWinToARMLinux.cmake
libcxx/CMakeLists.txt
libcxx/cmake/Modules/HandleLibCXXABI.cmake
libcxx/docs/BuildingLibcxx.rst
libcxx/include/CMakeLists.txt
libcxx/lib/abi/CMakeLists.txt
libcxx/src/CMakeLists.txt
libcxx/test/CMakeLists.txt
libcxx/test/configs/legacy.cfg.in
libcxx/utils/libcxx/test/config.py
libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in
libcxxabi/test/configs/apple-libc++abi-shared.cfg.in
libcxxabi/test/configs/cmake-bridge.cfg.in
libcxxabi/test/configs/ibm-libc++abi-shared.cfg.in
Index: libcxxabi/test/configs/ibm-libc++abi-shared.cfg.in
===================================================================
--- libcxxabi/test/configs/ibm-libc++abi-shared.cfg.in
+++ libcxxabi/test/configs/ibm-libc++abi-shared.cfg.in
@@ -4,7 +4,7 @@
config.substitutions.append(('%{flags}',''))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{include} ' +
+ '-nostdinc++ -I %{include} -I %{cxx-include} -I %{cxx-target-include} ' +
'-D__LIBC_NO_CPP_MATH_OVERLOADS__ -DLIBCXXABI_NO_TIMER ' +
'-D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' +
'-I %{libcxx}/test/support -I %{libcxx}/src'
Index: libcxxabi/test/configs/cmake-bridge.cfg.in
===================================================================
--- libcxxabi/test/configs/cmake-bridge.cfg.in
+++ libcxxabi/test/configs/cmake-bridge.cfg.in
@@ -28,7 +28,8 @@
config.substitutions.append(('%{cxx}', '@CMAKE_CXX_COMPILER@'))
config.substitutions.append(('%{libcxx}', '@LIBCXXABI_LIBCXX_PATH@'))
-config.substitutions.append(('%{include}', '@LIBCXXABI_HEADER_DIR@/include/c++/v1'))
-config.substitutions.append(('%{target-include}', '@LIBCXXABI_HEADER_DIR@/%{triple}/include/c++/v1'))
+config.substitutions.append(('%{include}', '@LIBCXXABI_SOURCE_DIR@/include'))
+config.substitutions.append(('%{cxx-include}', '@LIBCXXABI_HEADER_DIR@/include/c++/v1'))
+config.substitutions.append(('%{cxx-target-include}', '@LIBCXXABI_HEADER_DIR@/%{triple}/include/c++/v1'))
config.substitutions.append(('%{lib}', '@LIBCXXABI_LIBRARY_DIR@'))
config.substitutions.append(('%{executor}', '@LIBCXXABI_EXECUTOR@'))
Index: libcxxabi/test/configs/apple-libc++abi-shared.cfg.in
===================================================================
--- libcxxabi/test/configs/apple-libc++abi-shared.cfg.in
+++ libcxxabi/test/configs/apple-libc++abi-shared.cfg.in
@@ -6,7 +6,7 @@
'-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else ''
))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{include} -DLIBCXXABI_NO_TIMER -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' +
+ '-nostdinc++ -I %{include} -I %{cxx-include} -I %{cxx-target-include} -DLIBCXXABI_NO_TIMER -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' +
'-I %{libcxx}/test/support -I %{libcxx}/src'
))
config.substitutions.append(('%{link_flags}',
Index: libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in
===================================================================
--- libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in
+++ libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in
@@ -45,7 +45,7 @@
'-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else ''
))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{include} -DLIBCXXABI_NO_TIMER -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' +
+ '-nostdinc++ -I %{include} -I %{cxx-include} -I %{cxx-target-include} -DLIBCXXABI_NO_TIMER -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' +
'-I %{libcxx}/test/support -I %{libcxx}/src'
))
config.substitutions.append(('%{link_flags}',
Index: libcxx/utils/libcxx/test/config.py
===================================================================
--- libcxx/utils/libcxx/test/config.py
+++ libcxx/utils/libcxx/test/config.py
@@ -412,7 +412,7 @@
# The compiler normally links in oldnames.lib too, but we've
# specified -nostdlib above, so we need to specify it manually.
self.cxx.link_flags += ['-loldnames']
- elif cxx_abi == 'none' or cxx_abi == 'default':
+ elif cxx_abi == 'none':
if self.target_info.is_windows():
debug_suffix = 'd' if self.debug_build else ''
self.cxx.link_flags += ['-lmsvcrt%s' % debug_suffix]
Index: libcxx/test/configs/legacy.cfg.in
===================================================================
--- libcxx/test/configs/legacy.cfg.in
+++ libcxx/test/configs/legacy.cfg.in
@@ -14,7 +14,7 @@
config.cxx_library_root = "@LIBCXX_LIBRARY_DIR@"
config.abi_library_root = "@LIBCXX_CXX_ABI_LIBRARY_PATH@"
config.enable_shared = @LIBCXX_LINK_TESTS_WITH_SHARED_LIBCXX@
-config.cxx_abi = "@LIBCXX_CXX_ABI_LIBNAME@"
+config.cxx_abi = "@LIBCXX_CXXABI_FOR_TESTS@"
config.configuration_variant = "@LIBCXX_LIT_VARIANT@"
config.host_triple = "@LLVM_HOST_TRIPLE@"
config.sysroot = "@CMAKE_SYSROOT@"
Index: libcxx/test/CMakeLists.txt
===================================================================
--- libcxx/test/CMakeLists.txt
+++ libcxx/test/CMakeLists.txt
@@ -17,7 +17,9 @@
# The tests shouldn't link to any ABI library when it has been linked into
# libc++ statically or via a linker script.
if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY OR LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
- set(LIBCXX_CXX_ABI_LIBNAME "none")
+ set(LIBCXX_CXXABI_FOR_TESTS "none")
+else()
+ set(LIBCXX_CXXABI_FOR_TESTS "${LIBCXX_CXX_ABI}")
endif()
# The tests shouldn't link to libunwind if we have a linker script which
Index: libcxx/src/CMakeLists.txt
===================================================================
--- libcxx/src/CMakeLists.txt
+++ libcxx/src/CMakeLists.txt
@@ -156,11 +156,6 @@
set(exclude_from_all EXCLUDE_FROM_ALL)
endif()
-# If LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path.
-add_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH
- "${CMAKE_LIBRARY_PATH_FLAG}${LIBCXX_CXX_ABI_LIBRARY_PATH}")
-
-
if (LIBCXX_GENERATE_COVERAGE AND NOT LIBCXX_COVERAGE_LIBRARY)
find_compiler_rt_library(profile LIBCXX_COVERAGE_LIBRARY)
endif()
@@ -197,10 +192,6 @@
endif()
function(cxx_set_common_defines name)
- if(LIBCXX_CXX_ABI_HEADER_TARGET)
- add_dependencies(${name} ${LIBCXX_CXX_ABI_HEADER_TARGET})
- endif()
-
if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS)
target_link_libraries(${name} PUBLIC pstl::ParallelSTL)
endif()
@@ -241,19 +232,18 @@
# Link against libc++abi
if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY)
if (APPLE)
- target_link_libraries(cxx_shared PRIVATE "-Wl,-force_load" "${LIBCXX_CXX_STATIC_ABI_LIBRARY}")
+ target_link_libraries(cxx_shared PRIVATE "-Wl,-force_load" "$<TARGET_LINKER_FILE:libcxx-abi-static>")
else()
- target_link_libraries(cxx_shared PRIVATE "-Wl,--whole-archive,-Bstatic" "${LIBCXX_CXX_STATIC_ABI_LIBRARY}" "-Wl,-Bdynamic,--no-whole-archive")
+ target_link_libraries(cxx_shared PRIVATE "-Wl,--whole-archive,-Bstatic" "$<TARGET_LINKER_FILE:libcxx-abi-static>" "-Wl,-Bdynamic,--no-whole-archive")
endif()
else()
- target_link_libraries(cxx_shared PUBLIC "${LIBCXX_CXX_SHARED_ABI_LIBRARY}")
+ target_link_libraries(cxx_shared PUBLIC libcxx-abi-shared)
endif()
# Maybe re-export symbols from libc++abi
# In particular, we don't re-export the symbols if libc++abi is merged statically
# into libc++ because in that case there's no dylib to re-export from.
- if (APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR
- LIBCXX_CXX_ABI_LIBNAME STREQUAL "default")
+ if (APPLE AND LIBCXX_CXX_ABI STREQUAL "libcxxabi"
AND NOT DEFINED LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS
AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY)
set(LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS ON)
@@ -292,7 +282,8 @@
add_library(cxx_static STATIC ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS})
target_include_directories(cxx_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(cxx_static PUBLIC cxx-headers
- PRIVATE ${LIBCXX_LIBRARIES})
+ PRIVATE ${LIBCXX_LIBRARIES}
+ PRIVATE libcxx-abi-static)
set_target_properties(cxx_static
PROPERTIES
COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
@@ -323,19 +314,6 @@
list(APPEND LIBCXX_BUILD_TARGETS "cxx_static")
# Attempt to merge the libc++.a archive and the ABI library archive into one.
if (LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY)
- set(MERGE_ARCHIVES_SEARCH_PATHS "")
- if (LIBCXX_CXX_ABI_LIBRARY_PATH)
- set(MERGE_ARCHIVES_SEARCH_PATHS "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}")
- endif()
- if (TARGET "${LIBCXX_CXX_STATIC_ABI_LIBRARY}" OR HAVE_LIBCXXABI)
- set(MERGE_ARCHIVES_ABI_TARGET "$<TARGET_LINKER_FILE:${LIBCXX_CXX_STATIC_ABI_LIBRARY}>")
- else()
- set(MERGE_ARCHIVES_ABI_TARGET
- "${CMAKE_STATIC_LIBRARY_PREFIX}${LIBCXX_CXX_STATIC_ABI_LIBRARY}${CMAKE_STATIC_LIBRARY_SUFFIX}")
- if (LIBCXX_CXX_ABI_LIBRARY_PATH)
- set(MERGE_ARCHIVES_ABI_TARGET "${LIBCXX_CXX_ABI_LIBRARY_PATH}/${MERGE_ARCHIVES_ABI_TARGET}")
- endif ()
- endif()
if (APPLE)
set(MERGE_ARCHIVES_LIBTOOL "--use-libtool" "--libtool" "${CMAKE_LIBTOOL}")
endif()
@@ -347,8 +325,8 @@
--ar "${CMAKE_AR}"
${MERGE_ARCHIVES_LIBTOOL}
"$<TARGET_LINKER_FILE:cxx_static>"
- "${MERGE_ARCHIVES_ABI_TARGET}"
- "${MERGE_ARCHIVES_SEARCH_PATHS}"
+ "$<TARGET_LINKER_FILE:libcxx-abi-static>"
+ ""
WORKING_DIRECTORY ${LIBCXX_BUILD_DIR}
DEPENDS ${MERGE_ARCHIVES_ABI_TARGET}
)
Index: libcxx/lib/abi/CMakeLists.txt
===================================================================
--- libcxx/lib/abi/CMakeLists.txt
+++ libcxx/lib/abi/CMakeLists.txt
@@ -57,7 +57,7 @@
endif()
cxx_abi_list_identifier(abi_list_identifier
"${triple}"
- "${LIBCXX_CXX_ABI_LIBNAME}"
+ "${LIBCXX_CXX_ABI}"
"${LIBCXX_ABI_VERSION}"
"${LIBCXX_ABI_UNSTABLE}"
"${LIBCXX_ENABLE_EXCEPTIONS}"
Index: libcxx/include/CMakeLists.txt
===================================================================
--- libcxx/include/CMakeLists.txt
+++ libcxx/include/CMakeLists.txt
@@ -612,7 +612,8 @@
add_custom_target(generate-cxx-headers ALL DEPENDS ${_all_includes})
add_library(cxx-headers INTERFACE)
-add_dependencies(cxx-headers generate-cxx-headers ${LIBCXX_CXX_ABI_HEADER_TARGET})
+target_link_libraries(cxx-headers INTERFACE libcxx-abi-headers)
+add_dependencies(cxx-headers generate-cxx-headers)
# TODO: Use target_include_directories once we figure out why that breaks the runtimes build
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
target_compile_options(cxx-headers INTERFACE /I${LIBCXX_GENERATED_INCLUDE_DIR}
Index: libcxx/docs/BuildingLibcxx.rst
===================================================================
--- libcxx/docs/BuildingLibcxx.rst
+++ libcxx/docs/BuildingLibcxx.rst
@@ -323,7 +323,7 @@
.. option:: LIBCXX_CXX_ABI:STRING
- **Values**: ``none``, ``libcxxabi``, ``system-libcxxabi``, ``libcxxrt``, ``libstdc++``, ``libsupc++``.
+ **Values**: ``none``, ``libcxxabi``, ``system-libcxxabi``, ``libcxxrt``, ``libstdc++``, ``libsupc++``, ``vcruntime``.
Select the ABI library to build libc++ against.
@@ -333,7 +333,8 @@
.. option:: LIBCXX_CXX_ABI_LIBRARY_PATH:PATH
- Provide the path to the ABI library that libc++ should link against.
+ Provide the path to the ABI library that libc++ should link against. This is only
+ useful when linking against an out-of-tree ABI library.
.. option:: LIBCXX_ENABLE_STATIC_ABI_LIBRARY:BOOL
Index: libcxx/cmake/Modules/HandleLibCXXABI.cmake
===================================================================
--- libcxx/cmake/Modules/HandleLibCXXABI.cmake
+++ libcxx/cmake/Modules/HandleLibCXXABI.cmake
@@ -1,138 +1,164 @@
#===============================================================================
-# Add an ABI library if appropriate
+# Define targets for linking against the selected ABI library
+#
+# After including this file, the following targets are defined:
+# - libcxx-abi-headers: An interface target that allows getting access to the
+# headers of the selected ABI library.
+# - libcxx-abi-shared: A target representing the selected shared ABI library.
+# - libcxx-abi-static: A target representing the selected static ABI library.
#===============================================================================
include(GNUInstallDirs)
+# This function copies the provided headers to a private directory and adds that
+# path to the given INTERFACE target. That target can then be linked against to
+# get access to those headers (and only those).
#
-# _setup_abi: Set up the build to use an ABI library
-#
-# Parameters:
-# abidefines: A list of defines needed to compile libc++ with the ABI library
-# abishared : The shared ABI library to link against.
-# abistatic : The static ABI library to link against.
-# abifiles : A list of files (which may be relative paths) to copy into the
-# libc++ build tree for the build. These files will be copied
-# twice: once into include/, so the libc++ build itself can find
-# them, and once into include/c++/v1, so that a clang built into
-# the same build area will find them.
-# abidirs : A list of relative paths to create under an include directory
-# in the libc++ build directory.
-#
-
-macro(setup_abi_lib abidefines abishared abistatic abifiles abidirs)
- list(APPEND LIBCXX_COMPILE_FLAGS ${abidefines})
- set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_CXX_ABI_INCLUDE_PATHS}"
- CACHE PATH
- "Paths to C++ ABI header directories separated by ';'." FORCE
- )
- set(LIBCXX_CXX_ABI_LIBRARY_PATH "${LIBCXX_CXX_ABI_LIBRARY_PATH}"
- CACHE PATH
- "Paths to C++ ABI library directory"
- )
- set(LIBCXX_CXX_SHARED_ABI_LIBRARY ${abishared})
- set(LIBCXX_CXX_STATIC_ABI_LIBRARY ${abistatic})
- set(LIBCXX_ABILIB_FILES ${abifiles})
-
- foreach(fpath ${LIBCXX_ABILIB_FILES})
+# The problem this solves is that when building against a system-provided ABI library,
+# the ABI headers might live side-by-side with an actual C++ Standard Library
+# installation. For that reason, we can't just add `-I <path-to-ABI-headers>`,
+# since we would end up also adding the system-provided C++ Standard Library to
+# the search path. Instead, what we do is copy just the ABI library headers to
+# a private directory and add just that path when we build libc++.
+function(import_private_headers target include_dirs headers)
+ foreach(header ${headers})
set(found FALSE)
- foreach(incpath ${LIBCXX_CXX_ABI_INCLUDE_PATHS})
- message(STATUS "Looking for ${fpath} in ${incpath}")
- if (EXISTS "${incpath}/${fpath}")
+ foreach(incpath ${include_dirs})
+ if (EXISTS "${incpath}/${header}")
set(found TRUE)
- message(STATUS "Looking for ${fpath} in ${incpath} - found")
- get_filename_component(dstdir ${fpath} PATH)
- get_filename_component(ifile ${fpath} NAME)
- set(src ${incpath}/${fpath})
-
- set(dst ${LIBCXX_BINARY_INCLUDE_DIR}/${dstdir}/${ifile})
- add_custom_command(OUTPUT ${dst}
- DEPENDS ${src}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
- COMMENT "Copying C++ ABI header ${fpath}...")
- list(APPEND abilib_headers "${dst}")
+ message(STATUS "Looking for ${header} in ${incpath} - found")
+ get_filename_component(dstdir ${header} PATH)
+ get_filename_component(header_file ${header} NAME)
+ set(src ${incpath}/${header})
+ set(dst "${LIBCXX_BINARY_DIR}/private-abi-headers/${dstdir}/${header_file}")
- # TODO: libc++ shouldn't be responsible for copying the libc++abi
- # headers into the right location.
- set(dst "${LIBCXX_GENERATED_INCLUDE_DIR}/${dstdir}/${fpath}")
add_custom_command(OUTPUT ${dst}
DEPENDS ${src}
+ COMMAND ${CMAKE_COMMAND} -E make_directory "${LIBCXX_BINARY_DIR}/private-abi-headers/${dstdir}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
- COMMENT "Copying C++ ABI header ${fpath}...")
+ COMMENT "Copying C++ ABI header ${header}")
list(APPEND abilib_headers "${dst}")
else()
- message(STATUS "Looking for ${fpath} in ${incpath} - not found")
+ message(STATUS "Looking for ${header} in ${incpath} - not found")
endif()
endforeach()
if (NOT found)
- message(WARNING "Failed to find ${fpath} in ${LIBCXX_CXX_ABI_INCLUDE_PATHS}")
+ message(WARNING "Failed to find ${header} in ${include_dirs}")
endif()
endforeach()
- include_directories("${LIBCXX_BINARY_INCLUDE_DIR}")
- add_custom_target(cxx_abi_headers ALL DEPENDS ${abilib_headers})
- set(LIBCXX_CXX_ABI_HEADER_TARGET "cxx_abi_headers")
-endmacro()
-
-
-# Configure based on the selected ABI library.
-if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++" OR
- "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libsupc++")
- set(_LIBSUPCXX_INCLUDE_FILES
- cxxabi.h bits/c++config.h bits/os_defines.h bits/cpu_defines.h
- bits/cxxabi_tweaks.h bits/cxxabi_forced.h
- )
- if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++")
- set(_LIBSUPCXX_DEFINES "-DLIBSTDCXX")
- set(_LIBSUPCXX_LIBNAME stdc++)
- else()
- set(_LIBSUPCXX_DEFINES "")
- set(_LIBSUPCXX_LIBNAME supc++)
+ # Work around https://gitlab.kitware.com/cmake/cmake/-/issues/18399
+ add_library(${target}-generate-private-headers OBJECT ${abilib_headers})
+ set_target_properties(${target}-generate-private-headers PROPERTIES LINKER_LANGUAGE CXX)
+
+ target_link_libraries(${target} INTERFACE ${target}-generate-private-headers)
+ target_include_directories(${target} INTERFACE "${LIBCXX_BINARY_DIR}/private-abi-headers")
+endfunction()
+
+# This function creates an imported library named <target> of the given <kind> (SHARED|STATIC).
+# It imports a library named <name> searched at the given <path>.
+function(imported_library target kind path name)
+ add_library(${target} ${kind} IMPORTED GLOBAL)
+ set(libnames "${CMAKE_${kind}_LIBRARY_PREFIX}${name}${CMAKE_${kind}_LIBRARY_SUFFIX}")
+ # Make sure we find .tbd files on macOS
+ if (kind STREQUAL "SHARED")
+ list(APPEND libnames "${CMAKE_${kind}_LIBRARY_PREFIX}${name}.tbd")
endif()
- setup_abi_lib(
- "-D__GLIBCXX__ ${_LIBSUPCXX_DEFINES}"
- "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_INCLUDE_FILES}" "bits"
- )
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi")
- if(NOT LIBCXX_CXX_ABI_INCLUDE_PATHS)
- set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_SOURCE_DIR}/../libcxxabi/include")
+ find_library(file
+ NAMES ${libnames}
+ PATHS "${path}"
+ NO_CACHE)
+ set_target_properties(${target} PROPERTIES IMPORTED_LOCATION "${file}")
+endfunction()
+
+# Link against a system-provided libstdc++
+if ("${LIBCXX_CXX_ABI}" STREQUAL "libstdc++")
+ add_library(libcxx-abi-headers INTERFACE)
+ import_private_headers(libcxx-abi-headers "${LIBCXX_CXX_ABI_INCLUDE_PATHS}"
+ "cxxabi.h;bits/c++config.h;bits/os_defines.h;bits/cpu_defines.h;bits/cxxabi_tweaks.h;bits/cxxabi_forced.h")
+ target_compile_definitions(libcxx-abi-headers INTERFACE "-DLIBSTDCXX" "-D__GLIBCXX__")
+
+ imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" stdc++)
+ target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
+
+ imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" stdc++)
+ target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
+
+# Link against a system-provided libsupc++
+elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libsupc++")
+ add_library(libcxx-abi-headers INTERFACE)
+ import_private_headers(libcxx-abi-headers "${LIBCXX_CXX_ABI_INCLUDE_PATHS}"
+ "cxxabi.h;bits/c++config.h;bits/os_defines.h;bits/cpu_defines.h;bits/cxxabi_tweaks.h;bits/cxxabi_forced.h")
+ target_compile_definitions(libcxx-abi-headers INTERFACE "-D__GLIBCXX__")
+
+ imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" supc++)
+ target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
+
+ imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" supc++)
+ target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
+
+# Link against the in-tree libc++abi
+elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxabi")
+ add_library(libcxx-abi-headers INTERFACE)
+ target_link_libraries(libcxx-abi-headers INTERFACE cxxabi-headers)
+ target_compile_definitions(libcxx-abi-headers INTERFACE "-DLIBCXX_BUILDING_LIBCXXABI")
+
+ if (TARGET cxxabi_shared)
+ add_library(libcxx-abi-shared ALIAS cxxabi_shared)
endif()
- if(LIBCXX_STANDALONE_BUILD AND NOT (LIBCXX_CXX_ABI_INTREE OR HAVE_LIBCXXABI))
- set(shared c++abi)
- set(static c++abi)
- else()
- set(shared cxxabi_shared)
- set(static cxxabi_static)
+ if (TARGET cxxabi_static)
+ add_library(libcxx-abi-static ALIAS cxxabi_static)
endif()
- setup_abi_lib(
- "-DLIBCXX_BUILDING_LIBCXXABI"
- "${shared}" "${static}" "cxxabi.h;__cxxabi_config.h" "")
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "system-libcxxabi")
- setup_abi_lib(
- "-DLIBCXX_BUILDING_LIBCXXABI"
- "c++abi" "c++abi" "cxxabi.h;__cxxabi_config.h" "")
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
+# Link against a system-provided libc++abi
+elseif ("${LIBCXX_CXX_ABI}" STREQUAL "system-libcxxabi")
+ add_library(libcxx-abi-headers INTERFACE)
+ import_private_headers(libcxx-abi-headers "${LIBCXX_CXX_ABI_INCLUDE_PATHS}" "cxxabi.h;__cxxabi_config.h")
+ target_compile_definitions(libcxx-abi-headers INTERFACE "-DLIBCXX_BUILDING_LIBCXXABI")
+
+ imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" c++abi)
+ target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
+
+ imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" c++abi)
+ target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
+
+# Link against a system-provided libcxxrt
+elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxrt")
+ # libcxxrt does not provide aligned new and delete operators
+ # TODO: We're keeping this for backwards compatibility, but this doesn't belong here.
+ set(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS ON)
+
if(NOT LIBCXX_CXX_ABI_INCLUDE_PATHS)
+ message(STATUS "LIBCXX_CXX_ABI_INCLUDE_PATHS not set, using /usr/include/c++/v1")
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "/usr/include/c++/v1")
endif()
- # libcxxrt does not provide aligned new and delete operators
- set(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS ON)
- setup_abi_lib(
- "-DLIBCXXRT"
- "cxxrt" "cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
- )
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "vcruntime")
- # Nothing to do
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
- list(APPEND LIBCXX_COMPILE_FLAGS "-D_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY")
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "default")
- # Nothing to do
-else()
- message(FATAL_ERROR
- "Unsupported c++ abi: '${LIBCXX_CXX_ABI_LIBNAME}'. \
- Currently libstdc++, libsupc++, libcxxabi, libcxxrt, default and none are
- supported for c++ abi."
- )
-endif ()
+ add_library(libcxx-abi-headers INTERFACE)
+ import_private_headers(libcxx-abi-headers "${LIBCXX_CXX_ABI_INCLUDE_PATHS}"
+ "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h")
+ target_compile_definitions(libcxx-abi-headers INTERFACE "-DLIBCXXRT")
+
+ imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" cxxrt)
+ target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
+
+ imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" cxxrt)
+ target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
+
+# Link against a system-provided vcruntime
+# FIXME: Figure out how to configure the ABI library on Windows.
+elseif ("${LIBCXX_CXX_ABI}" STREQUAL "vcruntime")
+ add_library(libcxx-abi-headers INTERFACE)
+ add_library(libcxx-abi-shared INTERFACE)
+ add_library(libcxx-abi-static INTERFACE)
+
+# Don't link against any ABI library
+elseif ("${LIBCXX_CXX_ABI}" STREQUAL "none")
+ add_library(libcxx-abi-headers INTERFACE)
+ target_compile_definitions(libcxx-abi-headers INTERFACE "-D_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY")
+
+ add_library(libcxx-abi-shared INTERFACE)
+ target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
+
+ add_library(libcxx-abi-static INTERFACE)
+ target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
+endif()
Index: libcxx/CMakeLists.txt
===================================================================
--- libcxx/CMakeLists.txt
+++ libcxx/CMakeLists.txt
@@ -239,24 +239,24 @@
Note that this is not related to the version of libc++'s ABI itself!")
# ABI Library options ---------------------------------------------------------
-set(LIBCXX_CXX_ABI "default" CACHE STRING "Specify C++ ABI library to use.")
-set(CXXABIS none default libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
-set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
+if (LIBCXX_TARGETING_MSVC)
+ set(LIBCXX_DEFAULT_ABI_LIBRARY "vcruntime")
+elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
+ set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxrt")
+else()
+ set(LIBCXX_DEFAULT_ABI_LIBRARY "libcxxabi")
+endif()
+
+set(LIBCXX_SUPPORTED_ABI_LIBRARIES none libcxxabi system-libcxxabi libcxxrt libstdc++ libsupc++ vcruntime)
+set(LIBCXX_CXX_ABI "${LIBCXX_DEFAULT_ABI_LIBRARY}" CACHE STRING "Specify C++ ABI library to use. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
-# Setup the default options if LIBCXX_CXX_ABI is not specified.
+# Temporary to still accept existing CMake caches that contain "default" as the value
if (LIBCXX_CXX_ABI STREQUAL "default")
- if (LIBCXX_TARGETING_MSVC)
- # FIXME: Figure out how to configure the ABI library on Windows.
- set(LIBCXX_CXX_ABI_LIBNAME "vcruntime")
- elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
- set(LIBCXX_CXX_ABI_LIBNAME "libcxxrt")
- elseif (NOT LIBCXX_STANDALONE_BUILD OR HAVE_LIBCXXABI)
- set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
- else()
- set(LIBCXX_CXX_ABI_LIBNAME "default")
- endif()
-else()
- set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
+ set(LIBCXX_CXX_ABI "${LIBCXX_DEFAULT_ABI_LIBRARY}")
+endif()
+
+if (NOT "${LIBCXX_CXX_ABI}" IN_LIST LIBCXX_SUPPORTED_ABI_LIBRARIES)
+ message(FATAL_ERROR "Unsupported C++ ABI library: '${LIBCXX_CXX_ABI}'. Supported values are ${LIBCXX_SUPPORTED_ABI_LIBRARIES}.")
endif()
option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY
@@ -278,8 +278,7 @@
# or is specified to be "none".
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY
- AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"
- AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "default"
+ AND NOT LIBCXX_CXX_ABI STREQUAL "none"
AND Python3_EXECUTABLE
AND LIBCXX_ENABLE_SHARED)
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
Index: clang/cmake/caches/CrossWinToARMLinux.cmake
===================================================================
--- clang/cmake/caches/CrossWinToARMLinux.cmake
+++ clang/cmake/caches/CrossWinToARMLinux.cmake
@@ -152,8 +152,6 @@
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_ENABLE_SHARED OFF CACHE BOOL "")
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_ABI_VERSION 2 CACHE STRING "")
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_CXX_ABI "libcxxabi" CACHE STRING "") #!!!
-set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_CXX_ABI_INCLUDE_PATHS "${LLVM_PROJECT_DIR}/libcxxabi/include" CACHE PATH "")
-set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_CXX_ABI_LIBRARY_PATH "${CMAKE_BINARY_DIR}/lib/${TOOLCHAIN_TARGET_TRIPLE}" CACHE PATH "")
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS ON CACHE BOOL "")
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits