cmake_minimum_required(VERSION 3.26) project(libc++-modules LANGUAGES CXX) # Enable CMake's module support if(CMAKE_VERSION VERSION_LESS "3.28.0") if(CMAKE_VERSION VERSION_LESS "3.27.0") set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a") else() set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "aa1f7df0-828a-4fcd-9afc-2dc80491aca7") endif() set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1) else() cmake_policy(VERSION 3.28) endif() # Default to C++ extensions being off. Libc++'s modules support have trouble # with extensions right now. set(CMAKE_CXX_EXTENSIONS OFF) # Propagates the CMake options to the modules. # # This uses the std module hard-coded since the std.compat module does not # depend on these flags. macro(compile_define_if_not condition def) if (NOT ${condition}) target_compile_definitions(std PRIVATE ${def}) endif() endmacro() macro(compile_define_if condition def) if (${condition}) target_compile_definitions(std PRIVATE ${def}) endif() endmacro() ### STD add_library(std) target_sources(std PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES std.cppm ) target_include_directories(std SYSTEM PRIVATE @LIBCXX_CONFIGURED_INCLUDE_DIRS@) if (NOT @LIBCXX_ENABLE_EXCEPTIONS@) target_compile_options(std PUBLIC -fno-exceptions) endif() target_compile_options(std PUBLIC -nostdinc++ -Wno-reserved-module-identifier -Wno-reserved-user-defined-literal @LIBCXX_COMPILE_FLAGS@ ) set_target_properties(std PROPERTIES OUTPUT_NAME "c++std" ) ### STD.COMPAT add_library(std.compat) target_sources(std.compat PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES std.compat.cppm ) target_include_directories(std.compat SYSTEM PRIVATE @LIBCXX_CONFIGURED_INCLUDE_DIRS@) if (NOT @LIBCXX_ENABLE_EXCEPTIONS@) target_compile_options(std.compat PUBLIC -fno-exceptions) endif() target_compile_options(std.compat PUBLIC -nostdinc++ -Wno-reserved-module-identifier -Wno-reserved-user-defined-literal -fmodule-file=std=${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/std.dir/std.pcm @LIBCXX_COMPILE_FLAGS@ ) set_target_properties(std.compat PROPERTIES OUTPUT_NAME "c++std.compat" ) add_dependencies(std.compat std)