-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
95 lines (84 loc) · 3.75 KB
/
CMakeLists.txt
File metadata and controls
95 lines (84 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
set(CMAKE_VERSION_MINIMUM 3.31)
cmake_minimum_required(VERSION ${CMAKE_VERSION_MINIMUM})
message(STATUS "Cmake version: ${CMAKE_VERSION} (>= ${CMAKE_VERSION_MINIMUM} ✓)")
# Compiler version check
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if (WIN32)
message(FATAL_ERROR
"Detected the use of MinGW GCC compiler on Windows.\n"
"MinGW GCC has serious compatibility issues with C++23 modules (import std).\n"
"Please switch to Clang (such as llvm-mingw) or MSVC for compilation."
)
endif ()
set(COMPILER_GCC_VERSION_MINIMUM 14.0)
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${COMPILER_GCC_VERSION_MINIMUM})
message(FATAL_ERROR
"GCC version too old for C++ Modules.\n"
"GCC version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_GCC_VERSION_MINIMUM} X)"
)
else()
message(STATUS "GCC version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_GCC_VERSION_MINIMUM} ✓)")
endif()
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(COMPILER_CLANG_VERSION_MINIMUM 17.0)
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${COMPILER_CLANG_VERSION_MINIMUM})
message(FATAL_ERROR
"Clang version too old for C++ Modules.\n"
"Clang version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_CLANG_VERSION_MINIMUM} X)"
)
else()
message(STATUS "Clang version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_CLANG_VERSION_MINIMUM} ✓)")
endif()
elseif (MSVC)
set(COMPILER_MSVC_VERSION_MINIMUM 1934)
if (MSVC_VERSION LESS ${COMPILER_MSVC_VERSION_MINIMUM})
message(FATAL_ERROR
"MSVC version too old for C++ Modules.\n"
"MSVC version: ${CMAKE_CXX_COMPILER_VERSION} (>= ${COMPILER_MSVC_VERSION_MINIMUM} X)"
)
else()
message(STATUS "MSVC version: ${MSVC_VERSION} (>= ${COMPILER_MSVC_VERSION_MINIMUM} ✓)")
endif()
endif()
# Find CMAKE_EXPERIMENTAL_CXX_IMPORT_STD UUID
# https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst
string(REGEX REPLACE "-[A-Za-z0-9_]+$" "" CMAKE_VER_FULL "${CMAKE_VERSION}")
file(READ "${CMAKE_CURRENT_LIST_DIR}/cmake_import_std_uuids.json" _json_str)
string(REGEX MATCH "\"${CMAKE_VER_FULL}\"[ \t]*:[ \t]*\"([0-9a-fA-F\\-]+)\"" _match "${_json_str}")
if(_match)
string(REGEX REPLACE ".*\"${CMAKE_VER_FULL}\"[ \t]*:[ \t]*\"([0-9a-fA-F\\-]+)\".*" "\\1" _uuid "${_match}")
message(STATUS "Detected CMake version ${CMAKE_VER_FULL}, using import_std UUID = ${_uuid}")
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "${_uuid}")
else()
string(REGEX MATCH "\"default\"[ \t]*:[ \t]*\"([0-9a-fA-F\\-]+)\"" _default_match "${_json_str}")
if(_default_match)
string(REGEX REPLACE ".*\"default\"[ \t]*:[ \t]*\"([0-9a-fA-F\\-]+)\".*" "\\1" _uuid "${_default_match}")
message(STATUS "CMake version ${CMAKE_VER_FULL} not found in mapping, forcing default UUID = ${_uuid}")
else()
message(FATAL_ERROR "Default UUID not found in cmake_import_std_uuids.json — cannot proceed without import std configuration")
endif()
endif()
set(PROJECT_NAME mcpplibs-templates)
set(PROJECT_VERSION 1.0.0)
project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} LANGUAGES CXX)
set(CMAKE_CXX_MODULE_STD 1)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Library
add_library(${PROJECT_NAME} STATIC)
file(GLOB_RECURSE MODULE_SOURCES "src/*.cppm")
target_sources(${PROJECT_NAME}
PUBLIC
FILE_SET CXX_MODULES FILES
${MODULE_SOURCES}
)
# Example
add_executable(basic examples/basic.cpp)
target_link_libraries(basic PRIVATE mcpplibs-templates)
# Test
option(BUILD_TESTING "Build the testing directories" ON)
if (BUILD_TESTING)
include(CTest)
enable_testing()
add_subdirectory(tests)
endif()