1cmake_minimum_required(VERSION 3.26)
2
3project(libc++-modules LANGUAGES CXX)
4
5# Enable CMake's module support
6if(CMAKE_VERSION VERSION_LESS "3.28.0")
7  if(CMAKE_VERSION VERSION_LESS "3.27.0")
8    set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")
9  else()
10    set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "aa1f7df0-828a-4fcd-9afc-2dc80491aca7")
11  endif()
12  set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)
13else()
14  cmake_policy(VERSION 3.28)
15endif()
16
17# Default to C++ extensions being off. Libc++'s modules support have trouble
18# with extensions right now.
19set(CMAKE_CXX_EXTENSIONS OFF)
20
21# Propagates the CMake options to the modules.
22#
23# This uses the std module hard-coded since the std.compat module does not
24# depend on these flags.
25macro(compile_define_if_not condition def)
26  if (NOT ${condition})
27    target_compile_definitions(std PRIVATE ${def})
28  endif()
29endmacro()
30macro(compile_define_if condition def)
31  if (${condition})
32    target_compile_definitions(std PRIVATE ${def})
33  endif()
34endmacro()
35
36### STD
37
38add_library(std)
39target_sources(std
40  PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES
41    std.cppm
42)
43
44target_include_directories(std SYSTEM PRIVATE @LIBCXX_CONFIGURED_INCLUDE_DIRS@)
45
46if (NOT @LIBCXX_ENABLE_EXCEPTIONS@)
47  target_compile_options(std PUBLIC -fno-exceptions)
48endif()
49
50target_compile_options(std
51  PUBLIC
52    -nostdinc++
53    -Wno-reserved-module-identifier
54    -Wno-reserved-user-defined-literal
55    @LIBCXX_COMPILE_FLAGS@
56)
57set_target_properties(std
58  PROPERTIES
59    OUTPUT_NAME   "c++std"
60)
61
62### STD.COMPAT
63
64add_library(std.compat)
65target_sources(std.compat
66  PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES
67    std.compat.cppm
68)
69
70target_include_directories(std.compat SYSTEM PRIVATE @LIBCXX_CONFIGURED_INCLUDE_DIRS@)
71
72if (NOT @LIBCXX_ENABLE_EXCEPTIONS@)
73  target_compile_options(std.compat PUBLIC -fno-exceptions)
74endif()
75
76target_compile_options(std.compat
77  PUBLIC
78    -nostdinc++
79    -Wno-reserved-module-identifier
80    -Wno-reserved-user-defined-literal
81	-fmodule-file=std=${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/std.dir/std.pcm
82    @LIBCXX_COMPILE_FLAGS@
83)
84set_target_properties(std.compat
85  PROPERTIES
86    OUTPUT_NAME   "c++std.compat"
87)
88add_dependencies(std.compat std)
89