| 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 PUBLIC @LIBCXX_CONFIGURED_INCLUDE_DIRS@) | |
| if (NOT @LIBCXX_ENABLE_EXCEPTIONS@) | |
| target_compile_options(std PUBLIC -fno-exceptions) | |
| endif() | |
| target_compile_options(std | |
| PUBLIC | |
| -nostdinc++ | |
| @LIBCXX_COMPILE_FLAGS@ | |
| ) | |
| target_compile_options(std | |
| PRIVATE | |
| -Wno-reserved-module-identifier | |
| -Wno-reserved-user-defined-literal | |
| ) | |
| target_link_options(std PUBLIC -nostdlib++ -Wl,-rpath,@LIBCXX_LIBRARY_DIR@ -L@LIBCXX_LIBRARY_DIR@) | |
| target_link_libraries(std c++) | |
| 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 PUBLIC @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++ | |
| @LIBCXX_COMPILE_FLAGS@ | |
| ) | |
| target_compile_options(std.compat | |
| PRIVATE | |
| -Wno-reserved-module-identifier | |
| -Wno-reserved-user-defined-literal | |
| ) | |
| set_target_properties(std.compat | |
| PROPERTIES | |
| OUTPUT_NAME "c++std.compat" | |
| ) | |
| add_dependencies(std.compat std) | |
| target_link_libraries(std.compat PUBLIC std c++) |