diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index eb19646646f0..015a359bfb48 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -397,11 +397,9 @@ endif () # Configure System #=============================================================================== -# TODO: Other projects rely on the location where we generate the libc++ headers -# internally. We should get rid of these dependencies. if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++) - set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1") + set(LIBCXX_HEADER_DIR ${LLVM_BINARY_DIR}) set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++) if(LIBCXX_LIBDIR_SUBDIR) string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR}) @@ -409,11 +407,11 @@ if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) endif() elseif(LLVM_LIBRARY_OUTPUT_INTDIR) set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) - set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1") + set(LIBCXX_HEADER_DIR ${LLVM_BINARY_DIR}) set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX}) else() set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX}) - set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1") + set(LIBCXX_HEADER_DIR ${CMAKE_BINARY_DIR}) set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX}) endif() diff --git a/libcxx/benchmarks/CMakeLists.txt b/libcxx/benchmarks/CMakeLists.txt index 12acffcbc98b..42d25c20c811 100644 --- a/libcxx/benchmarks/CMakeLists.txt +++ b/libcxx/benchmarks/CMakeLists.txt @@ -8,7 +8,7 @@ include(CheckCXXCompilerFlag) set(BENCHMARK_LIBCXX_COMPILE_FLAGS -Wno-unused-command-line-argument -nostdinc++ - -isystem "${LIBCXX_GENERATED_INCLUDE_DIR}" + -isystem ${LIBCXX_SOURCE_DIR}/include -L${LIBCXX_LIBRARY_DIR} -Wl,-rpath,${LIBCXX_LIBRARY_DIR} ${SANITIZER_FLAGS} @@ -18,6 +18,7 @@ if (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH) -L${LIBCXX_CXX_ABI_LIBRARY_PATH} -Wl,-rpath,${LIBCXX_CXX_ABI_LIBRARY_PATH}) endif() +list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS -include "${LIBCXX_BINARY_DIR}/__config_site") split_list(BENCHMARK_LIBCXX_COMPILE_FLAGS) ExternalProject_Add(google-benchmark-libcxx diff --git a/libcxx/cmake/Modules/HandleLibCXXABI.cmake b/libcxx/cmake/Modules/HandleLibCXXABI.cmake index 6f50853189a2..c5aa26739e36 100644 --- a/libcxx/cmake/Modules/HandleLibCXXABI.cmake +++ b/libcxx/cmake/Modules/HandleLibCXXABI.cmake @@ -52,10 +52,8 @@ macro(setup_abi_lib abidefines abishared abistatic abifiles abidirs) COMMENT "Copying C++ ABI header ${fpath}...") list(APPEND abilib_headers "${dst}") - if (LIBCXX_GENERATED_INCLUDE_DIR) # always true - # TODO: libc++ shouldn't be responsible for copying the libc++abi - # headers into the right location. - set(dst "${LIBCXX_GENERATED_INCLUDE_DIR}/include/c++/v1/${dstdir}/${fpath}") + if (LIBCXX_HEADER_DIR) + set(dst "${LIBCXX_HEADER_DIR}/include/c++/v1/${dstdir}/${fpath}") add_custom_command(OUTPUT ${dst} DEPENDS ${src} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} diff --git a/libcxx/docs/TestingLibcxx.rst b/libcxx/docs/TestingLibcxx.rst index ec017e23b147..d42becfd5c3d 100644 --- a/libcxx/docs/TestingLibcxx.rst +++ b/libcxx/docs/TestingLibcxx.rst @@ -26,8 +26,8 @@ Usage After building libc++, you can run parts of the libc++ test suite by simply running ``llvm-lit`` on a specified test or directory. If you're unsure -whether the required targets have been built, you can use the `check-cxx-deps` -target to build them. For example: +whether the required libraries have been built, you can use the +`check-cxx-deps` target. For example: .. code-block:: bash @@ -37,12 +37,6 @@ target to build them. For example: $ /bin/llvm-lit -sv libcxx/test/std/depr/depr.c.headers/stdlib_h.pass.cpp # Run a single test $ /bin/llvm-lit -sv libcxx/test/std/atomics libcxx/test/std/threads # Test std::thread and std::atomic -In the default configuration, the tests are built against headers that form a -fake installation root of libc++. This installation root has to be updated when -changes are made to the headers, so you should re-run the `check-cxx-deps` target -before running the tests manually with `lit` when you make any sort of change, -including to the headers. - Sometimes you'll want to change the way LIT is running the tests. Custom options can be specified using the `--param==` flag. The most common option you'll want to change is the standard dialect (ie -std=c++XX). By default the diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index a63b565e4400..7c97db41bb73 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -2,7 +2,6 @@ set(files __bit_reference __bsd_locale_defaults.h __bsd_locale_fallbacks.h - __config __errc __debug __functional_03 @@ -185,28 +184,62 @@ if(LIBCXX_INSTALL_SUPPORT_HEADERS) ) endif() -if (LIBCXX_GENERATED_INCLUDE_DIR) # Always true - configure_file("__config_site.in" "${LIBCXX_GENERATED_INCLUDE_DIR}/__config_site" @ONLY) +configure_file("__config_site.in" + "${LIBCXX_BINARY_DIR}/__config_site" + @ONLY) - set(_all_includes "${LIBCXX_GENERATED_INCLUDE_DIR}/__config_site") +# Generate a custom __config header. The new header is created +# by prepending __config_site to the current __config header. +add_custom_command(OUTPUT ${LIBCXX_BINARY_DIR}/__generated_config + COMMAND ${Python3_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/cat_files.py + ${LIBCXX_BINARY_DIR}/__config_site + ${LIBCXX_SOURCE_DIR}/include/__config + -o ${LIBCXX_BINARY_DIR}/__generated_config + DEPENDS ${LIBCXX_SOURCE_DIR}/include/__config + ${LIBCXX_BINARY_DIR}/__config_site +) +# Add a target that executes the generation commands. +add_custom_target(cxx-generated-config ALL + DEPENDS ${LIBCXX_BINARY_DIR}/__generated_config) + +if(LIBCXX_HEADER_DIR) + set(output_dir ${LIBCXX_HEADER_DIR}/include/c++/v1) + + set(out_files) foreach(f ${files}) - set(src "${CMAKE_CURRENT_SOURCE_DIR}/${f}") - set(dst "${LIBCXX_GENERATED_INCLUDE_DIR}/${f}") + set(src ${CMAKE_CURRENT_SOURCE_DIR}/${f}) + set(dst ${output_dir}/${f}) add_custom_command(OUTPUT ${dst} DEPENDS ${src} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} COMMENT "Copying CXX header ${f}") - list(APPEND _all_includes "${dst}") + list(APPEND out_files ${dst}) endforeach() - add_custom_target(generate-cxx-headers DEPENDS ${_all_includes}) + + # Copy the generated header as __config into build directory. + set(src ${LIBCXX_BINARY_DIR}/__generated_config) + set(dst ${output_dir}/__config) + add_custom_command(OUTPUT ${dst} + 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_library(cxx-headers INTERFACE) add_dependencies(cxx-headers 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-headers INTERFACE /I "${LIBCXX_GENERATED_INCLUDE_DIR}") + target_compile_options(cxx-headers INTERFACE /I "${output_dir}") else() - target_compile_options(cxx-headers INTERFACE -I "${LIBCXX_GENERATED_INCLUDE_DIR}") + target_compile_options(cxx-headers 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-headers INTERFACE /FI "${LIBCXX_BINARY_DIR}/__config_site") + else() + target_compile_options(cxx-headers INTERFACE -include "${LIBCXX_BINARY_DIR}/__config_site") endif() else() add_library(cxx-headers INTERFACE) @@ -222,15 +255,16 @@ if (LIBCXX_INSTALL_HEADERS) ) endforeach() - # Install the generated __config_site. - install(FILES ${LIBCXX_GENERATED_INCLUDE_DIR}/__config_site + # Install the generated header as __config. + install(FILES ${LIBCXX_BINARY_DIR}/__generated_config DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ + RENAME __config COMPONENT cxx-headers) if (NOT CMAKE_CONFIGURATION_TYPES) add_custom_target(install-cxx-headers - DEPENDS cxx-headers + DEPENDS cxx-headers cxx-generated-config COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=cxx-headers -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") diff --git a/libcxx/include/__config b/libcxx/include/__config index f2ebd4d167d9..7cdcd9a7275e 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -10,8 +10,6 @@ #ifndef _LIBCPP_CONFIG #define _LIBCPP_CONFIG -#include <__config_site> - #if defined(_MSC_VER) && !defined(__clang__) # if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER diff --git a/libcxx/test/configs/legacy.cfg.in b/libcxx/test/configs/legacy.cfg.in index 148ac3fc5a89..f0a4e8a73e09 100644 --- a/libcxx/test/configs/legacy.cfg.in +++ b/libcxx/test/configs/legacy.cfg.in @@ -3,7 +3,6 @@ import os import site -config.cxx_headers = "@LIBCXX_GENERATED_INCLUDE_DIR@" config.cxx_under_test = "@CMAKE_CXX_COMPILER@" config.project_obj_root = "@CMAKE_BINARY_DIR@" config.libcxx_src_root = "@LIBCXX_SOURCE_DIR@" diff --git a/libcxx/utils/libcxx/test/config.py b/libcxx/utils/libcxx/test/config.py index c5050d1b6b9a..0d21aa17afd2 100644 --- a/libcxx/utils/libcxx/test/config.py +++ b/libcxx/utils/libcxx/test/config.py @@ -331,6 +331,7 @@ class Configuration(object): def configure_compile_flags_header_includes(self): support_path = os.path.join(self.libcxx_src_root, 'test', 'support') + self.configure_config_site_header() if self.cxx_stdlib_under_test != 'libstdc++' and \ not self.target_info.is_windows(): self.cxx.compile_flags += [ @@ -347,12 +348,16 @@ class Configuration(object): 'set_windows_crt_report_mode.h') ] cxx_headers = self.get_lit_conf('cxx_headers') - if cxx_headers is None and self.cxx_stdlib_under_test != 'libc++': + if cxx_headers == '' or (cxx_headers is None + and self.cxx_stdlib_under_test != 'libc++'): self.lit_config.note('using the system cxx headers') return self.cxx.compile_flags += ['-nostdinc++'] + if cxx_headers is None: + cxx_headers = os.path.join(self.libcxx_src_root, 'include') if not os.path.isdir(cxx_headers): - self.lit_config.fatal("cxx_headers='{}' is not a directory.".format(cxx_headers)) + self.lit_config.fatal("cxx_headers='%s' is not a directory." + % cxx_headers) self.cxx.compile_flags += ['-I' + cxx_headers] if self.libcxx_obj_root is not None: cxxabi_headers = os.path.join(self.libcxx_obj_root, 'include', @@ -360,6 +365,16 @@ class Configuration(object): if os.path.isdir(cxxabi_headers): self.cxx.compile_flags += ['-I' + cxxabi_headers] + def configure_config_site_header(self): + # Check for a possible __config_site in the build directory. We + # use this if it exists. + if self.libcxx_obj_root is None: + return + config_site_header = os.path.join(self.libcxx_obj_root, '__config_site') + if not os.path.isfile(config_site_header): + return + self.cxx.compile_flags += ['-include', config_site_header] + def configure_link_flags(self): # Configure library path self.configure_link_flags_cxx_library_path() diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt index a5d3a06a20a6..3f37dbf4cd36 100644 --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -138,23 +138,9 @@ if (NOT LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_STATIC) message(FATAL_ERROR "libc++abi must be built as either a shared or static library.") endif() -# TODO: This is a hack for the fact that Standalone builds can't use targets -# from the other runtimes (so the cxx-headers target doesn't exist). -set(LIBCXXABI_LIBCXX_INCLUDES "" CACHE PATH - "Specify path to the installed libc++ includes. This is only relevant for Standalone builds, where the location of the headers can't be determined automatically.") -if (LIBCXXABI_STANDALONE_BUILD) - if (NOT IS_DIRECTORY ${LIBCXXABI_LIBCXX_INCLUDES}) - message(FATAL_ERROR - "LIBCXXABI_LIBCXX_INCLUDES=${LIBCXXABI_LIBCXX_INCLUDES} is not a valid directory. " - "Please provide the path to where the libc++ headers have been installed.") - endif() - add_library(cxx-headers INTERFACE) - if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") - target_compile_options(cxx-headers INTERFACE /I "${LIBCXXABI_LIBCXX_INCLUDES}") - else() - target_compile_options(cxx-headers INTERFACE -I "${LIBCXXABI_LIBCXX_INCLUDES}") - endif() -endif() +set(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_PATH}/include" CACHE PATH + "Specify path to libc++ includes.") +message(STATUS "Libc++abi will be using libc++ includes from ${LIBCXXABI_LIBCXX_INCLUDES}") option(LIBCXXABI_HERMETIC_STATIC_LIBRARY "Do not export any symbols from the static library." OFF) diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt index 8d4d84c225e2..e9e454082a05 100644 --- a/libcxxabi/src/CMakeLists.txt +++ b/libcxxabi/src/CMakeLists.txt @@ -55,6 +55,8 @@ if (MSVC_IDE OR XCODE) endif() endif() +include_directories("${LIBCXXABI_LIBCXX_INCLUDES}") + if (LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL) add_definitions(-DHAVE___CXA_THREAD_ATEXIT_IMPL) endif() @@ -166,7 +168,7 @@ if (LIBCXXABI_ENABLE_SHARED) if(COMMAND llvm_setup_rpath) llvm_setup_rpath(cxxabi_shared) endif() - target_link_libraries(cxxabi_shared PRIVATE cxx-headers ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES}) + target_link_libraries(cxxabi_shared PRIVATE ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES}) if (TARGET pstl::ParallelSTL) target_link_libraries(cxxabi_shared PUBLIC pstl::ParallelSTL) endif() @@ -231,7 +233,7 @@ endif() # Build the static library. if (LIBCXXABI_ENABLE_STATIC) add_library(cxxabi_static STATIC ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS}) - target_link_libraries(cxxabi_static PRIVATE cxx-headers ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES}) + target_link_libraries(cxxabi_static PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES}) if (TARGET pstl::ParallelSTL) target_link_libraries(cxxabi_static PUBLIC pstl::ParallelSTL) endif() diff --git a/libcxxabi/test/libcxxabi/test/config.py b/libcxxabi/test/libcxxabi/test/config.py index f9e17e9f97da..45fb0f5d7afc 100644 --- a/libcxxabi/test/libcxxabi/test/config.py +++ b/libcxxabi/test/libcxxabi/test/config.py @@ -56,8 +56,10 @@ class Configuration(LibcxxConfiguration): super(Configuration, self).configure_compile_flags() def configure_compile_flags_header_includes(self): - cxx_headers = self.get_lit_conf('cxx_headers', None) or \ - os.path.join(self.project_obj_root, 'include', 'c++', 'v1') + self.configure_config_site_header() + cxx_headers = self.get_lit_conf( + 'cxx_headers', + os.path.join(self.libcxx_src_root, '/include')) if cxx_headers == '': self.lit_config.note('using the systems c++ headers') else: diff --git a/libunwind/test/libunwind/test/config.py b/libunwind/test/libunwind/test/config.py index 183c48f6a801..977f9a0fb3f9 100644 --- a/libunwind/test/libunwind/test/config.py +++ b/libunwind/test/libunwind/test/config.py @@ -49,6 +49,8 @@ class Configuration(LibcxxConfiguration): super(Configuration, self).configure_compile_flags() def configure_compile_flags_header_includes(self): + self.configure_config_site_header() + libunwind_headers = self.get_lit_conf( 'libunwind_headers', os.path.join(self.libunwind_src_root, 'include')) diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index 9d8222b14991..598daa4502e1 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -133,13 +133,11 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) string(REPLACE "-" "_" canon_name ${projName}) string(TOUPPER ${canon_name} canon_name) - # compiler-rt needs to treat this as standalone builds. D57992 tried - # to get rid of it for compiler-rt, but it treats *_STANDALONE_BUILD=OFF - # as if llvm & clang are configured in the same CMake, and setup dependencies + # The subdirectories need to treat this as standalone builds. D57992 tried + # to get rid of this, but the runtimes treat *_STANDALONE_BUILD=OFF as if + # llvm & clang are configured in the same CMake, and setup dependencies # against their targets. - if ("${canon_name}" STREQUAL "COMPILER_RT") - set(${canon_name}_STANDALONE_BUILD ON) - endif() + set(${canon_name}_STANDALONE_BUILD ON) if(LLVM_RUNTIMES_LIBDIR_SUBDIR) set(${canon_name}_LIBDIR_SUBDIR "${LLVM_RUNTIMES_LIBDIR_SUBDIR}" CACHE STRING "" FORCE)