xref: /llvm-project/libcxx/modules/CMakeLists.txt (revision 0e8208eca1c316b7302de7803ab0d85a1dd77076)
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