cmake_minimum_required(VERSION 3.26) project(libc++-modules LANGUAGES CXX) # Enable CMake's module support 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) # 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() if(NOT @LIBCXX_ENABLE_THREADS@ OR NOT @LIBCXXABI_ENABLE_THREADS@ OR NOT @LIBCXX_ENABLE_MONOTONIC_CLOCK@) message(FATAL_ERROR "Modules without thread support is not yet implemented.") endif() if(NOT @LIBCXX_ENABLE_FILESYSTEM@) message(FATAL_ERROR "Modules without filesystem support is not yet implemented.") endif() if(NOT @LIBCXX_ENABLE_RANDOM_DEVICE@) message(FATAL_ERROR "Modules without randome device support is not yet implemented.") endif() if(NOT @LIBCXX_ENABLE_UNICODE@) message(FATAL_ERROR "Modules without Unicode support is not yet implemented.") endif() if(NOT @LIBCXX_ENABLE_EXCEPTIONS@ OR NOT @LIBCXXABI_ENABLE_EXCEPTIONS@) message(FATAL_ERROR "Modules without exception support is not yet implemented.") endif() add_library(std) target_sources(std PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES @LIBCXX_SOURCES_MODULE_STD@ ) target_compile_definitions(std PRIVATE _LIBCPP_ENABLE_EXPERIMENTAL) target_include_directories(std SYSTEM PRIVATE @LIBCXX_CONFIGURED_INCLUDE_DIR@) 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" )