[libc++] Use a proper CMake target to represent libc++ headers
Instead of having complex logic around how to include the libc++ headers and __config_site, handle that by defining cxx-headers as an INTERFACE library and linking against it. After this patch, linking against cxx-headers is sufficient to get the right __config_site include and include paths for libc++. Differential Revision: https://reviews.llvm.org/D82702
This commit is contained in:
parent
3ae43a580e
commit
efa40eb194
|
@ -429,6 +429,7 @@ elseif(LLVM_LIBRARY_OUTPUT_INTDIR)
|
|||
set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX})
|
||||
else()
|
||||
set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
|
||||
set(LIBCXX_HEADER_DIR ${CMAKE_BINARY_DIR})
|
||||
set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX})
|
||||
endif()
|
||||
|
||||
|
@ -874,22 +875,11 @@ if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
|
|||
config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
endif()
|
||||
|
||||
# We generate a __config_site header (see libcxx/include/CMakeLists.txt) and
|
||||
# we make sure to include it when building the library.
|
||||
function(cxx_add_config_site target)
|
||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
|
||||
target_compile_options(${target} PUBLIC /FI "${LIBCXX_BINARY_DIR}/__config_site")
|
||||
else()
|
||||
target_compile_options(${target} PUBLIC -include "${LIBCXX_BINARY_DIR}/__config_site")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Setup all common build flags =================================================
|
||||
function(cxx_add_common_build_flags target)
|
||||
cxx_add_basic_build_flags(${target})
|
||||
cxx_add_warning_flags(${target})
|
||||
cxx_add_windows_flags(${target})
|
||||
cxx_add_config_site(${target})
|
||||
cxx_add_exception_flags(${target})
|
||||
cxx_add_rtti_flags(${target})
|
||||
cxx_add_module_flags(${target})
|
||||
|
@ -899,7 +889,6 @@ endfunction()
|
|||
#===============================================================================
|
||||
# Setup Source Code And Tests
|
||||
#===============================================================================
|
||||
include_directories(include)
|
||||
add_subdirectory(include)
|
||||
add_subdirectory(src)
|
||||
|
||||
|
|
|
@ -31,6 +31,9 @@ function(define_linker_script target)
|
|||
set(link_libraries)
|
||||
if (interface_libs)
|
||||
foreach(lib IN LISTS interface_libs)
|
||||
if ("${lib}" STREQUAL "cxx-headers")
|
||||
continue()
|
||||
endif()
|
||||
if (TARGET "${lib}" OR
|
||||
(${lib} MATCHES "cxxabi(_static|_shared)?" AND HAVE_LIBCXXABI) OR
|
||||
(${lib} MATCHES "unwind(_static|_shared)?" AND HAVE_LIBUNWIND))
|
||||
|
|
|
@ -201,7 +201,6 @@ add_custom_command(OUTPUT ${LIBCXX_BINARY_DIR}/__generated_config
|
|||
# Add a target that executes the generation commands.
|
||||
add_custom_target(cxx-generated-config ALL
|
||||
DEPENDS ${LIBCXX_BINARY_DIR}/__generated_config)
|
||||
set(generated_config_deps cxx-generated-config)
|
||||
|
||||
# In some build configurations (like bootstrapping clang), we need to be able to
|
||||
# install the libcxx headers before the CMake configuration for libcxx runs. Making
|
||||
|
@ -229,16 +228,30 @@ if(LIBCXX_HEADER_DIR)
|
|||
set(src ${LIBCXX_BINARY_DIR}/__generated_config)
|
||||
set(dst ${output_dir}/__config)
|
||||
add_custom_command(OUTPUT ${dst}
|
||||
DEPENDS ${src} ${generated_config_deps}
|
||||
DEPENDS ${src} cxx-generated-config
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
|
||||
COMMENT "Copying CXX __config")
|
||||
list(APPEND out_files ${dst})
|
||||
add_custom_target(generate-cxx-headers DEPENDS ${out_files})
|
||||
|
||||
add_custom_target(${CXX_HEADER_TARGET} ALL DEPENDS ${out_files} ${LIBCXX_CXX_ABI_HEADER_TARGET})
|
||||
add_library(${CXX_HEADER_TARGET} INTERFACE)
|
||||
add_dependencies(${CXX_HEADER_TARGET} generate-cxx-headers ${LIBCXX_CXX_ABI_HEADER_TARGET})
|
||||
# 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_HEADER_TARGET} INTERFACE /I "${output_dir}")
|
||||
else()
|
||||
target_compile_options(${CXX_HEADER_TARGET} INTERFACE -I "${output_dir}")
|
||||
endif()
|
||||
|
||||
# Make sure the generated __config_site header is included when we build the library.
|
||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
|
||||
target_compile_options(${CXX_HEADER_TARGET} INTERFACE /FI "${LIBCXX_BINARY_DIR}/__config_site")
|
||||
else()
|
||||
target_compile_options(${CXX_HEADER_TARGET} INTERFACE -include "${LIBCXX_BINARY_DIR}/__config_site")
|
||||
endif()
|
||||
else()
|
||||
add_custom_target(${CXX_HEADER_TARGET})
|
||||
add_library(${CXX_HEADER_TARGET} INTERFACE)
|
||||
endif()
|
||||
set_target_properties(${CXX_HEADER_TARGET} PROPERTIES FOLDER "Misc")
|
||||
|
||||
if (LIBCXX_INSTALL_HEADERS)
|
||||
foreach(file ${files})
|
||||
|
@ -259,7 +272,7 @@ if (LIBCXX_INSTALL_HEADERS)
|
|||
|
||||
if (NOT CMAKE_CONFIGURATION_TYPES)
|
||||
add_custom_target(install-${CXX_HEADER_TARGET}
|
||||
DEPENDS ${CXX_HEADER_TARGET} ${generated_config_deps}
|
||||
DEPENDS ${CXX_HEADER_TARGET} cxx-generated-config
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
-DCMAKE_INSTALL_COMPONENT=${CXX_HEADER_TARGET}
|
||||
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||
|
|
|
@ -163,7 +163,8 @@ if (LIBCXX_ENABLE_SHARED)
|
|||
if(COMMAND llvm_setup_rpath)
|
||||
llvm_setup_rpath(cxx_shared)
|
||||
endif()
|
||||
target_link_libraries(cxx_shared PRIVATE ${LIBCXX_LIBRARIES})
|
||||
target_link_libraries(cxx_shared PUBLIC cxx-headers
|
||||
PRIVATE ${LIBCXX_LIBRARIES})
|
||||
set_target_properties(cxx_shared
|
||||
PROPERTIES
|
||||
COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
|
||||
|
@ -244,7 +245,8 @@ endif()
|
|||
# Build the static library.
|
||||
if (LIBCXX_ENABLE_STATIC)
|
||||
add_library(cxx_static STATIC ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS})
|
||||
target_link_libraries(cxx_static PRIVATE ${LIBCXX_LIBRARIES})
|
||||
target_link_libraries(cxx_static PUBLIC cxx-headers
|
||||
PRIVATE ${LIBCXX_LIBRARIES})
|
||||
set(CMAKE_STATIC_LIBRARY_PREFIX "lib")
|
||||
set_target_properties(cxx_static
|
||||
PROPERTIES
|
||||
|
@ -298,7 +300,7 @@ if (LIBCXX_ENABLE_STATIC)
|
|||
endif()
|
||||
|
||||
# Add a meta-target for both libraries.
|
||||
add_custom_target(cxx DEPENDS cxx-headers ${LIBCXX_BUILD_TARGETS})
|
||||
add_custom_target(cxx DEPENDS ${LIBCXX_BUILD_TARGETS})
|
||||
|
||||
if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
|
||||
set(LIBCXX_EXPERIMENTAL_SOURCES
|
||||
|
|
Loading…
Reference in New Issue