# 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()