xref: /llvm-project/libcxx/modules/CMakeLists.txt.in (revision ed1273d4ddee160f847cbee28714c79353022a3c)
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 PUBLIC @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    @LIBCXX_COMPILE_FLAGS@
54)
55target_compile_options(std
56  PRIVATE
57    -Wno-reserved-module-identifier
58    -Wno-reserved-user-defined-literal
59)
60target_link_options(std PUBLIC -nostdlib++ -Wl,-rpath,@LIBCXX_LIBRARY_DIR@ -L@LIBCXX_LIBRARY_DIR@)
61target_link_libraries(std c++)
62set_target_properties(std
63  PROPERTIES
64    OUTPUT_NAME   "c++std"
65)
66
67### STD.COMPAT
68
69add_library(std.compat)
70target_sources(std.compat
71  PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES
72    std.compat.cppm
73)
74
75target_include_directories(std.compat SYSTEM PUBLIC @LIBCXX_CONFIGURED_INCLUDE_DIRS@)
76
77if (NOT @LIBCXX_ENABLE_EXCEPTIONS@)
78  target_compile_options(std.compat PUBLIC -fno-exceptions)
79endif()
80
81target_compile_options(std.compat
82  PUBLIC
83    -nostdinc++
84    @LIBCXX_COMPILE_FLAGS@
85)
86target_compile_options(std.compat
87 PRIVATE
88    -Wno-reserved-module-identifier
89    -Wno-reserved-user-defined-literal
90)
91set_target_properties(std.compat
92  PROPERTIES
93    OUTPUT_NAME   "c++std.compat"
94)
95add_dependencies(std.compat std)
96target_link_libraries(std.compat PUBLIC std c++)
97