1# The headers of Table 24: C++ library headers [tab:headers.cpp] 2# and the headers of Table 25: C++ headers for C library facilities [tab:headers.cpp.c] 3set(LIBCXX_MODULE_STD_SOURCES 4 std/algorithm.inc 5 std/any.inc 6 std/array.inc 7 std/atomic.inc 8 std/barrier.inc 9 std/bit.inc 10 std/bitset.inc 11 std/cassert.inc 12 std/cctype.inc 13 std/cerrno.inc 14 std/cfenv.inc 15 std/cfloat.inc 16 std/charconv.inc 17 std/chrono.inc 18 std/cinttypes.inc 19 std/climits.inc 20 std/clocale.inc 21 std/cmath.inc 22 std/codecvt.inc 23 std/compare.inc 24 std/complex.inc 25 std/concepts.inc 26 std/condition_variable.inc 27 std/coroutine.inc 28 std/csetjmp.inc 29 std/csignal.inc 30 std/cstdarg.inc 31 std/cstddef.inc 32 std/cstdint.inc 33 std/cstdio.inc 34 std/cstdlib.inc 35 std/cstring.inc 36 std/ctime.inc 37 std/cuchar.inc 38 std/cwchar.inc 39 std/cwctype.inc 40 std/deque.inc 41 std/exception.inc 42 std/execution.inc 43 std/expected.inc 44 std/filesystem.inc 45 std/flat_map.inc 46 std/flat_set.inc 47 std/format.inc 48 std/forward_list.inc 49 std/fstream.inc 50 std/functional.inc 51 std/future.inc 52 std/generator.inc 53 std/hazard_pointer.inc 54 std/initializer_list.inc 55 std/iomanip.inc 56 std/ios.inc 57 std/iosfwd.inc 58 std/iostream.inc 59 std/istream.inc 60 std/iterator.inc 61 std/latch.inc 62 std/limits.inc 63 std/list.inc 64 std/locale.inc 65 std/map.inc 66 std/mdspan.inc 67 std/memory.inc 68 std/memory_resource.inc 69 std/mutex.inc 70 std/new.inc 71 std/numbers.inc 72 std/numeric.inc 73 std/optional.inc 74 std/ostream.inc 75 std/print.inc 76 std/queue.inc 77 std/random.inc 78 std/ranges.inc 79 std/ratio.inc 80 std/rcu.inc 81 std/regex.inc 82 std/scoped_allocator.inc 83 std/semaphore.inc 84 std/set.inc 85 std/shared_mutex.inc 86 std/source_location.inc 87 std/span.inc 88 std/spanstream.inc 89 std/sstream.inc 90 std/stack.inc 91 std/stacktrace.inc 92 std/stdexcept.inc 93 std/stdfloat.inc 94 std/stop_token.inc 95 std/streambuf.inc 96 std/string.inc 97 std/string_view.inc 98 std/strstream.inc 99 std/syncstream.inc 100 std/system_error.inc 101 std/text_encoding.inc 102 std/thread.inc 103 std/tuple.inc 104 std/type_traits.inc 105 std/typeindex.inc 106 std/typeinfo.inc 107 std/unordered_map.inc 108 std/unordered_set.inc 109 std/utility.inc 110 std/valarray.inc 111 std/variant.inc 112 std/vector.inc 113 std/version.inc 114) 115 116set(LIBCXX_MODULE_STD_COMPAT_SOURCES 117 std.compat/cassert.inc 118 std.compat/cctype.inc 119 std.compat/cerrno.inc 120 std.compat/cfenv.inc 121 std.compat/cfloat.inc 122 std.compat/cinttypes.inc 123 std.compat/climits.inc 124 std.compat/clocale.inc 125 std.compat/cmath.inc 126 std.compat/csetjmp.inc 127 std.compat/csignal.inc 128 std.compat/cstdarg.inc 129 std.compat/cstddef.inc 130 std.compat/cstdint.inc 131 std.compat/cstdio.inc 132 std.compat/cstdlib.inc 133 std.compat/cstring.inc 134 std.compat/ctime.inc 135 std.compat/cuchar.inc 136 std.compat/cwchar.inc 137 std.compat/cwctype.inc 138) 139 140# TODO MODULES the CMakeLists.txt in the build directory is only temporary. 141# This allows using as available in the build directory. Once build systems 142# have proper support for the installed files this will be removed. 143if ("${LIBCXX_GENERATED_INCLUDE_DIR}" STREQUAL "${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}") 144 # This typically happens when the target is not installed. 145 set(LIBCXX_CONFIGURED_INCLUDE_DIRS "${LIBCXX_GENERATED_INCLUDE_DIR}") 146else() 147 # It's important that the arch directory be included first so that its header files 148 # which interpose on the default include dir be included instead of the default ones. 149 set(LIBCXX_CONFIGURED_INCLUDE_DIRS 150 "${LIBCXX_GENERATED_INCLUDE_TARGET_DIR};${LIBCXX_GENERATED_INCLUDE_DIR}" 151 ) 152endif() 153configure_file( 154 "CMakeLists.txt.in" 155 "${LIBCXX_GENERATED_MODULE_DIR}/CMakeLists.txt" 156 @ONLY 157) 158 159set(LIBCXX_MODULE_STD_INCLUDE_SOURCES) 160foreach(file ${LIBCXX_MODULE_STD_SOURCES}) 161 set( 162 LIBCXX_MODULE_STD_INCLUDE_SOURCES 163 "${LIBCXX_MODULE_STD_INCLUDE_SOURCES}#include \"${file}\"\n" 164 ) 165endforeach() 166 167configure_file( 168 "std.cppm.in" 169 "${LIBCXX_GENERATED_MODULE_DIR}/std.cppm" 170 @ONLY 171) 172 173set(LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES) 174foreach(file ${LIBCXX_MODULE_STD_COMPAT_SOURCES}) 175 set( 176 LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES 177 "${LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES}#include \"${file}\"\n" 178 ) 179endforeach() 180 181configure_file( 182 "std.compat.cppm.in" 183 "${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm" 184 @ONLY 185) 186 187set(_all_modules) 188list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/CMakeLists.txt") 189list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/std.cppm") 190list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm") 191foreach(file ${LIBCXX_MODULE_STD_SOURCES} ${LIBCXX_MODULE_STD_COMPAT_SOURCES}) 192 set(src "${CMAKE_CURRENT_SOURCE_DIR}/${file}") 193 set(dst "${LIBCXX_GENERATED_MODULE_DIR}/${file}") 194 add_custom_command(OUTPUT ${dst} 195 DEPENDS ${src} 196 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} 197 COMMENT "Copying CXX module ${file}") 198 list(APPEND _all_modules "${dst}") 199endforeach() 200 201add_custom_target(generate-cxx-modules 202 ALL DEPENDS 203 ${_all_modules} 204) 205 206# Configure the modules manifest. 207# Use the relative path between the installation and the module in the json 208# file. This allows moving the entire installation to a different location. 209if("${CMAKE_INSTALL_PREFIX}" STREQUAL "") 210 set(BASE_DIRECTORY "/") 211else() 212 set(BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX}) 213endif() 214cmake_path(ABSOLUTE_PATH LIBCXX_INSTALL_LIBRARY_DIR 215 BASE_DIRECTORY ${BASE_DIRECTORY} 216 OUTPUT_VARIABLE ABS_LIBRARY_DIR) 217cmake_path(ABSOLUTE_PATH LIBCXX_INSTALL_MODULES_DIR 218 BASE_DIRECTORY ${BASE_DIRECTORY} 219 OUTPUT_VARIABLE ABS_MODULES_DIR) 220file(RELATIVE_PATH LIBCXX_MODULE_RELATIVE_PATH 221 ${ABS_LIBRARY_DIR} 222 ${ABS_MODULES_DIR}) 223configure_file( 224 "modules.json.in" 225 "${LIBCXX_LIBRARY_DIR}/libc++.modules.json" 226 @ONLY 227) 228 229# Dummy library to make modules an installation component. 230add_library(cxx-modules INTERFACE) 231add_dependencies(cxx-modules generate-cxx-modules) 232 233if (LIBCXX_INSTALL_MODULES) 234 foreach(file ${LIBCXX_MODULE_STD_SOURCES} ${LIBCXX_MODULE_STD_COMPAT_SOURCES}) 235 get_filename_component(dir ${file} DIRECTORY) 236 install(FILES ${file} 237 DESTINATION "${LIBCXX_INSTALL_MODULES_DIR}/${dir}" 238 COMPONENT cxx-modules 239 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ 240 ) 241 endforeach() 242 243 # Install the generated module files. 244 install(FILES 245 "${LIBCXX_GENERATED_MODULE_DIR}/std.cppm" 246 "${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm" 247 DESTINATION "${LIBCXX_INSTALL_MODULES_DIR}" 248 COMPONENT cxx-modules 249 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ 250 ) 251 252 # Install the module manifest. 253 install(FILES 254 "${LIBCXX_LIBRARY_DIR}/libc++.modules.json" 255 DESTINATION "${LIBCXX_INSTALL_LIBRARY_DIR}" 256 COMPONENT cxx-modules 257 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ 258 ) 259 260 if (NOT CMAKE_CONFIGURATION_TYPES) 261 add_custom_target(install-cxx-modules 262 DEPENDS cxx-modules 263 COMMAND "${CMAKE_COMMAND}" 264 -DCMAKE_INSTALL_COMPONENT=cxx-modules 265 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") 266 # Stripping is a no-op for modules 267 add_custom_target(install-cxx-modules-stripped DEPENDS install-cxx-modules) 268 endif() 269endif() 270