Bump version to 19.1.0 (final)
[llvm-project.git] / libcxx / modules / CMakeLists.txt
blob82cd7b66beb7a9472be4841af1bfc2004c350b88
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]
3 set(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
116 set(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
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.
143 if ("${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}")
146 else()
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   )
152 endif()
153 configure_file(
154   "CMakeLists.txt.in"
155   "${LIBCXX_GENERATED_MODULE_DIR}/CMakeLists.txt"
156   @ONLY
159 set(LIBCXX_MODULE_STD_INCLUDE_SOURCES)
160 foreach(file ${LIBCXX_MODULE_STD_SOURCES})
161   set(
162     LIBCXX_MODULE_STD_INCLUDE_SOURCES
163     "${LIBCXX_MODULE_STD_INCLUDE_SOURCES}#include \"${file}\"\n"
164   )
165 endforeach()
167 configure_file(
168   "std.cppm.in"
169   "${LIBCXX_GENERATED_MODULE_DIR}/std.cppm"
170   @ONLY
173 set(LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES)
174 foreach(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   )
179 endforeach()
181 configure_file(
182   "std.compat.cppm.in"
183   "${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm"
184   @ONLY
187 set(_all_modules)
188 list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/CMakeLists.txt")
189 list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/std.cppm")
190 list(APPEND _all_modules "${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm")
191 foreach(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}")
199 endforeach()
201 add_custom_target(generate-cxx-modules
202   ALL DEPENDS
203     ${_all_modules}
205 add_dependencies(cxx-test-depends generate-cxx-modules)
207 # Configure the modules manifest.
208 # Use the relative path between the installation and the module in the json
209 # file. This allows moving the entire installation to a different location.
210 if("${CMAKE_INSTALL_PREFIX}" STREQUAL "")
211   set(BASE_DIRECTORY "/")
212 else()
213   set(BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
214 endif()
215 cmake_path(ABSOLUTE_PATH LIBCXX_INSTALL_LIBRARY_DIR
216   BASE_DIRECTORY ${BASE_DIRECTORY}
217   OUTPUT_VARIABLE ABS_LIBRARY_DIR)
218 cmake_path(ABSOLUTE_PATH LIBCXX_INSTALL_MODULES_DIR
219   BASE_DIRECTORY ${BASE_DIRECTORY}
220   OUTPUT_VARIABLE ABS_MODULES_DIR)
221 file(RELATIVE_PATH LIBCXX_MODULE_RELATIVE_PATH
222   ${ABS_LIBRARY_DIR}
223   ${ABS_MODULES_DIR})
224 configure_file(
225   "modules.json.in"
226   "${LIBCXX_LIBRARY_DIR}/libc++.modules.json"
227   @ONLY
230 # Dummy library to make modules an installation component.
231 add_library(cxx-modules INTERFACE)
232 add_dependencies(cxx-modules generate-cxx-modules)
234 if (LIBCXX_INSTALL_MODULES)
235   foreach(file ${LIBCXX_MODULE_STD_SOURCES} ${LIBCXX_MODULE_STD_COMPAT_SOURCES})
236     get_filename_component(dir ${file} DIRECTORY)
237     install(FILES ${file}
238       DESTINATION "${LIBCXX_INSTALL_MODULES_DIR}/${dir}"
239       COMPONENT cxx-modules
240       PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
241     )
242   endforeach()
244   # Install the generated module files.
245   install(FILES
246       "${LIBCXX_GENERATED_MODULE_DIR}/std.cppm"
247       "${LIBCXX_GENERATED_MODULE_DIR}/std.compat.cppm"
248     DESTINATION "${LIBCXX_INSTALL_MODULES_DIR}"
249     COMPONENT cxx-modules
250     PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
251   )
253   # Install the module manifest.
254   install(FILES
255       "${LIBCXX_LIBRARY_DIR}/libc++.modules.json"
256     DESTINATION "${LIBCXX_INSTALL_LIBRARY_DIR}"
257     COMPONENT cxx-modules
258     PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
259   )
261   if (NOT CMAKE_CONFIGURATION_TYPES)
262     add_custom_target(install-cxx-modules
263                       DEPENDS cxx-modules
264                       COMMAND "${CMAKE_COMMAND}"
265                               -DCMAKE_INSTALL_COMPONENT=cxx-modules
266                               -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
267     # Stripping is a no-op for modules
268     add_custom_target(install-cxx-modules-stripped DEPENDS install-cxx-modules)
269   endif()
270 endif()