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