mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 01:06:32 +00:00

We always strive to test libc++ as close as possible to the way we are actually shipping it. This was approximated reasonably well by setting up the minimal driver flags when running the test suite, however we were running the test suite against the library located in the build directory. This patch improves the situation by installing the library (the headers, the built library, modules, etc) into a fake location and then running the test suite against that fake "installation root". This should open the door to getting rid of the temporary copy of the headers we make during the build process, however this is left for a future improvement. Note that this adds quite a bit of verbosity whenever running the test suite because we install the headers beforehand every time. We should be able to override this to silence it, however CMake doesn't currently give us a way to do that, see https://gitlab.kitware.com/cmake/cmake/-/issues/26085.
270 lines
7.0 KiB
CMake
270 lines
7.0 KiB
CMake
# The headers of Table 24: C++ library headers [tab:headers.cpp]
|
||
# and the headers of Table 25: C++ headers for C library facilities [tab:headers.cpp.c]
|
||
set(LIBCXX_MODULE_STD_SOURCES
|
||
std/algorithm.inc
|
||
std/any.inc
|
||
std/array.inc
|
||
std/atomic.inc
|
||
std/barrier.inc
|
||
std/bit.inc
|
||
std/bitset.inc
|
||
std/cassert.inc
|
||
std/cctype.inc
|
||
std/cerrno.inc
|
||
std/cfenv.inc
|
||
std/cfloat.inc
|
||
std/charconv.inc
|
||
std/chrono.inc
|
||
std/cinttypes.inc
|
||
std/climits.inc
|
||
std/clocale.inc
|
||
std/cmath.inc
|
||
std/codecvt.inc
|
||
std/compare.inc
|
||
std/complex.inc
|
||
std/concepts.inc
|
||
std/condition_variable.inc
|
||
std/coroutine.inc
|
||
std/csetjmp.inc
|
||
std/csignal.inc
|
||
std/cstdarg.inc
|
||
std/cstddef.inc
|
||
std/cstdint.inc
|
||
std/cstdio.inc
|
||
std/cstdlib.inc
|
||
std/cstring.inc
|
||
std/ctime.inc
|
||
std/cuchar.inc
|
||
std/cwchar.inc
|
||
std/cwctype.inc
|
||
std/deque.inc
|
||
std/exception.inc
|
||
std/execution.inc
|
||
std/expected.inc
|
||
std/filesystem.inc
|
||
std/flat_map.inc
|
||
std/flat_set.inc
|
||
std/format.inc
|
||
std/forward_list.inc
|
||
std/fstream.inc
|
||
std/functional.inc
|
||
std/future.inc
|
||
std/generator.inc
|
||
std/hazard_pointer.inc
|
||
std/initializer_list.inc
|
||
std/iomanip.inc
|
||
std/ios.inc
|
||
std/iosfwd.inc
|
||
std/iostream.inc
|
||
std/istream.inc
|
||
std/iterator.inc
|
||
std/latch.inc
|
||
std/limits.inc
|
||
std/list.inc
|
||
std/locale.inc
|
||
std/map.inc
|
||
std/mdspan.inc
|
||
std/memory.inc
|
||
std/memory_resource.inc
|
||
std/mutex.inc
|
||
std/new.inc
|
||
std/numbers.inc
|
||
std/numeric.inc
|
||
std/optional.inc
|
||
std/ostream.inc
|
||
std/print.inc
|
||
std/queue.inc
|
||
std/random.inc
|
||
std/ranges.inc
|
||
std/ratio.inc
|
||
std/rcu.inc
|
||
std/regex.inc
|
||
std/scoped_allocator.inc
|
||
std/semaphore.inc
|
||
std/set.inc
|
||
std/shared_mutex.inc
|
||
std/source_location.inc
|
||
std/span.inc
|
||
std/spanstream.inc
|
||
std/sstream.inc
|
||
std/stack.inc
|
||
std/stacktrace.inc
|
||
std/stdexcept.inc
|
||
std/stdfloat.inc
|
||
std/stop_token.inc
|
||
std/streambuf.inc
|
||
std/string.inc
|
||
std/string_view.inc
|
||
std/strstream.inc
|
||
std/syncstream.inc
|
||
std/system_error.inc
|
||
std/text_encoding.inc
|
||
std/thread.inc
|
||
std/tuple.inc
|
||
std/type_traits.inc
|
||
std/typeindex.inc
|
||
std/typeinfo.inc
|
||
std/unordered_map.inc
|
||
std/unordered_set.inc
|
||
std/utility.inc
|
||
std/valarray.inc
|
||
std/variant.inc
|
||
std/vector.inc
|
||
std/version.inc
|
||
)
|
||
|
||
set(LIBCXX_MODULE_STD_COMPAT_SOURCES
|
||
std.compat/cassert.inc
|
||
std.compat/cctype.inc
|
||
std.compat/cerrno.inc
|
||
std.compat/cfenv.inc
|
||
std.compat/cfloat.inc
|
||
std.compat/cinttypes.inc
|
||
std.compat/climits.inc
|
||
std.compat/clocale.inc
|
||
std.compat/cmath.inc
|
||
std.compat/csetjmp.inc
|
||
std.compat/csignal.inc
|
||
std.compat/cstdarg.inc
|
||
std.compat/cstddef.inc
|
||
std.compat/cstdint.inc
|
||
std.compat/cstdio.inc
|
||
std.compat/cstdlib.inc
|
||
std.compat/cstring.inc
|
||
std.compat/ctime.inc
|
||
std.compat/cuchar.inc
|
||
std.compat/cwchar.inc
|
||
std.compat/cwctype.inc
|
||
)
|
||
|
||
# TODO MODULES the CMakeLists.txt in the build directory is only temporary.
|
||
# This allows using as available in the build directory. Once build systems
|
||
# have proper support for the installed files this will be removed.
|
||
if ("${LIBCXX_GENERATED_INCLUDE_DIR}" STREQUAL "${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}")
|
||
# This typically happens when the target is not installed.
|
||
set(LIBCXX_CONFIGURED_INCLUDE_DIRS "${LIBCXX_GENERATED_INCLUDE_DIR}")
|
||
else()
|
||
# It's important that the arch directory be included first so that its header files
|
||
# which interpose on the default include dir be included instead of the default ones.
|
||
set(LIBCXX_CONFIGURED_INCLUDE_DIRS
|
||
"${LIBCXX_GENERATED_INCLUDE_TARGET_DIR};${LIBCXX_GENERATED_INCLUDE_DIR}"
|
||
)
|
||
endif()
|
||
configure_file(
|
||
"CMakeLists.txt.in"
|
||
"${LIBCXX_GENERATED_MODULE_DIR}/CMakeLists.txt"
|
||
@ONLY
|
||
)
|
||
|
||
set(LIBCXX_MODULE_STD_INCLUDE_SOURCES)
|
||
foreach(file ${LIBCXX_MODULE_STD_SOURCES})
|
||
set(
|
||
LIBCXX_MODULE_STD_INCLUDE_SOURCES
|
||
"${LIBCXX_MODULE_STD_INCLUDE_SOURCES}#include \"${file}\"\n"
|
||
)
|
||
endforeach()
|
||
|
||
configure_file(
|
||
"std.cppm.in"
|
||
"${LIBCXX_GENERATED_MODULE_DIR}/std.cppm"
|
||
@ONLY
|
||
)
|
||
|
||
set(LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES)
|
||
foreach(file ${LIBCXX_MODULE_STD_COMPAT_SOURCES})
|
||
set(
|
||
LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES
|
||
"${LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES}#include \"${file}\"\n"
|
||
)
|
||
endforeach()
|
||
|
||
configure_file(
|
||
"std.compat.cppm.in"
|
||
"${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm"
|
||
@ONLY
|
||
)
|
||
|
||
set(_all_modules)
|
||
list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/CMakeLists.txt")
|
||
list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/std.cppm")
|
||
list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm")
|
||
foreach(file ${LIBCXX_MODULE_STD_SOURCES} ${LIBCXX_MODULE_STD_COMPAT_SOURCES})
|
||
set(src "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
|
||
set(dst "${LIBCXX_GENERATED_MODULE_DIR}/${file}")
|
||
add_custom_command(OUTPUT ${dst}
|
||
DEPENDS ${src}
|
||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
|
||
COMMENT "Copying CXX module ${file}")
|
||
list(APPEND _all_modules "${dst}")
|
||
endforeach()
|
||
|
||
add_custom_target(generate-cxx-modules
|
||
ALL DEPENDS
|
||
${_all_modules}
|
||
)
|
||
|
||
# Configure the modules manifest.
|
||
# Use the relative path between the installation and the module in the json
|
||
# file. This allows moving the entire installation to a different location.
|
||
if("${CMAKE_INSTALL_PREFIX}" STREQUAL "")
|
||
set(BASE_DIRECTORY "/")
|
||
else()
|
||
set(BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
|
||
endif()
|
||
cmake_path(ABSOLUTE_PATH LIBCXX_INSTALL_LIBRARY_DIR
|
||
BASE_DIRECTORY ${BASE_DIRECTORY}
|
||
OUTPUT_VARIABLE ABS_LIBRARY_DIR)
|
||
cmake_path(ABSOLUTE_PATH LIBCXX_INSTALL_MODULES_DIR
|
||
BASE_DIRECTORY ${BASE_DIRECTORY}
|
||
OUTPUT_VARIABLE ABS_MODULES_DIR)
|
||
file(RELATIVE_PATH LIBCXX_MODULE_RELATIVE_PATH
|
||
${ABS_LIBRARY_DIR}
|
||
${ABS_MODULES_DIR})
|
||
configure_file(
|
||
"modules.json.in"
|
||
"${LIBCXX_LIBRARY_DIR}/libc++.modules.json"
|
||
@ONLY
|
||
)
|
||
|
||
# Dummy library to make modules an installation component.
|
||
add_library(cxx-modules INTERFACE)
|
||
add_dependencies(cxx-modules generate-cxx-modules)
|
||
|
||
if (LIBCXX_INSTALL_MODULES)
|
||
foreach(file ${LIBCXX_MODULE_STD_SOURCES} ${LIBCXX_MODULE_STD_COMPAT_SOURCES})
|
||
get_filename_component(dir ${file} DIRECTORY)
|
||
install(FILES ${file}
|
||
DESTINATION "${LIBCXX_INSTALL_MODULES_DIR}/${dir}"
|
||
COMPONENT cxx-modules
|
||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||
)
|
||
endforeach()
|
||
|
||
# Install the generated module files.
|
||
install(FILES
|
||
"${LIBCXX_GENERATED_MODULE_DIR}/std.cppm"
|
||
"${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm"
|
||
DESTINATION "${LIBCXX_INSTALL_MODULES_DIR}"
|
||
COMPONENT cxx-modules
|
||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||
)
|
||
|
||
# Install the module manifest.
|
||
install(FILES
|
||
"${LIBCXX_LIBRARY_DIR}/libc++.modules.json"
|
||
DESTINATION "${LIBCXX_INSTALL_LIBRARY_DIR}"
|
||
COMPONENT cxx-modules
|
||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||
)
|
||
|
||
if (NOT CMAKE_CONFIGURATION_TYPES)
|
||
add_custom_target(install-cxx-modules
|
||
DEPENDS cxx-modules
|
||
COMMAND "${CMAKE_COMMAND}"
|
||
-DCMAKE_INSTALL_COMPONENT=cxx-modules
|
||
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||
# Stripping is a no-op for modules
|
||
add_custom_target(install-cxx-modules-stripped DEPENDS install-cxx-modules)
|
||
endif()
|
||
endif()
|