diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -429,6 +429,7 @@ 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 @@ 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 @@ #=============================================================================== # Setup Source Code And Tests #=============================================================================== -include_directories(include) add_subdirectory(include) add_subdirectory(src) diff --git a/libcxx/cmake/Modules/DefineLinkerScript.cmake b/libcxx/cmake/Modules/DefineLinkerScript.cmake --- a/libcxx/cmake/Modules/DefineLinkerScript.cmake +++ b/libcxx/cmake/Modules/DefineLinkerScript.cmake @@ -31,6 +31,9 @@ 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)) diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -201,7 +201,6 @@ # 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 @@ 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 (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") diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt --- a/libcxx/src/CMakeLists.txt +++ b/libcxx/src/CMakeLists.txt @@ -163,7 +163,8 @@ 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 @@ # 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 @@ 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