Skip to content

Commit c17b323

Browse files
refactor: Update CMake configuration and add compiler version checks for C++ modules
1 parent f759572 commit c17b323

File tree

1 file changed

+60
-17
lines changed

1 file changed

+60
-17
lines changed

CMakeLists.txt

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,73 @@
1-
cmake_minimum_required(VERSION 4.0.2)
1+
set(CMAKE_VERSION_MINIMUM 3.31)
2+
cmake_minimum_required(VERSION ${CMAKE_VERSION_MINIMUM})
3+
message(STATUS "Cmake version: ${CMAKE_VERSION} (>= ${CMAKE_VERSION_MINIMUM} ✓)")
24

3-
# https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst
4-
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "a9e1cf81-9932-4810-974b-6eccaf14e457")
55
set(CMAKE_CXX_STANDARD 23)
6-
set(CMAKE_CXX_MODULE_STD 1)
6+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
7+
set(CMAKE_CXX_EXTENSIONS OFF)
78

8-
project(mcpplibs-templates VERSION 1.0.0 LANGUAGES CXX)
9+
project(mcpplibs-primitives VERSION 1.0.0 LANGUAGES CXX)
10+
11+
find_package(Threads REQUIRED)
12+
13+
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
14+
set(COMPILER_GCC_VERSION_MINIMUM 14.0)
15+
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${COMPILER_GCC_VERSION_MINIMUM})
16+
message(FATAL_ERROR "GCC version too old for C++ Modules.\nGCC version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_GCC_VERSION_MINIMUM} X)")
17+
else()
18+
message(STATUS "GCC version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_GCC_VERSION_MINIMUM} ✓)")
19+
endif()
20+
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
21+
set(COMPILER_CLANG_VERSION_MINIMUM 17.0)
22+
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${COMPILER_CLANG_VERSION_MINIMUM})
23+
message(FATAL_ERROR "Clang version too old for C++ Modules.\nClang version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_CLANG_VERSION_MINIMUM} X)")
24+
else()
25+
message(STATUS "Clang version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_CLANG_VERSION_MINIMUM} ✓)")
26+
endif()
27+
elseif (MSVC)
28+
set(COMPILER_MSVC_VERSION_MINIMUM 1934)
29+
if (MSVC_VERSION LESS ${COMPILER_MSVC_VERSION_MINIMUM})
30+
message(FATAL_ERROR "MSVC version too old for C++ Modules.\nMSVC version: ${MSVC_VERSION} (>= ${COMPILER_MSVC_VERSION_MINIMUM} X)")
31+
else()
32+
message(STATUS "MSVC version: ${MSVC_VERSION} (>= ${COMPILER_MSVC_VERSION_MINIMUM} ✓)")
33+
endif()
34+
endif()
935

1036
# Library
11-
add_library(mcpplibs-templates STATIC)
37+
add_library(mcpplibs-primitives STATIC)
1238

13-
file(GLOB_RECURSE MODULE_SOURCES "src/*.cppm")
39+
file(GLOB_RECURSE CXX_MODULE_FILES
40+
src/*.cppm
41+
)
1442

15-
target_sources(mcpplibs-templates
43+
target_sources(mcpplibs-primitives
1644
PUBLIC
17-
FILE_SET CXX_MODULES FILES
18-
${MODULE_SOURCES}
45+
FILE_SET CXX_MODULES TYPE CXX_MODULES FILES
46+
${CXX_MODULE_FILES}
47+
PRIVATE
48+
src/primitives.cpp
1949
)
2050

21-
# Test
22-
add_executable(templates_test tests/main.cpp)
23-
target_link_libraries(templates_test PRIVATE mcpplibs-templates)
51+
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
52+
target_compile_options(mcpplibs-primitives PRIVATE -fmodules-ts)
53+
endif()
2454

25-
enable_testing()
26-
add_test(NAME mcpplibs-templates-test COMMAND templates_test)
55+
target_link_libraries(mcpplibs-primitives PRIVATE Threads::Threads)
2756

28-
# Example
57+
target_include_directories(mcpplibs-primitives PUBLIC
58+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
59+
$<INSTALL_INTERFACE:include>
60+
)
61+
62+
# Examples
2963
add_executable(basic examples/basic.cpp)
30-
target_link_libraries(basic PRIVATE mcpplibs-templates)
64+
target_link_libraries(basic PRIVATE mcpplibs-primitives)
65+
66+
# Testing
67+
option(BUILD_TESTING "Build the testing directories" ON)
68+
69+
if (BUILD_TESTING)
70+
include(CTest)
71+
enable_testing()
72+
add_subdirectory(tests)
73+
endif()

0 commit comments

Comments
 (0)