-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEnableStandardLibraryModule.cmake
More file actions
65 lines (55 loc) · 2.45 KB
/
Copy pathEnableStandardLibraryModule.cmake
File metadata and controls
65 lines (55 loc) · 2.45 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
cmake_minimum_required(VERSION 3.26.0 FATAL_ERROR)
# Check compiler support for C++23 Standard Library Module.
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "17.0.0")
if (CMAKE_CXX_STANDARD LESS 20)
message(FATAL_ERROR "C++20 or newer is required.")
endif()
set(CMAKE_CXX_STANDARD_REQUIRED YES)
set(CMAKE_CXX_EXTENSIONS OFF)
include(FetchContent)
FetchContent_Declare(
std
URL "file://${LIBCXX_BUILD}/modules/c++/v1/"
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
SYSTEM
)
FetchContent_MakeAvailable(std)
link_libraries(std c++)
link_libraries(std.compat c++)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "19.36")
if (CMAKE_CXX_STANDARD VERSION_LESS 20)
message(FATAL_ERROR "C++20 or newer is required.")
elseif (CMAKE_CXX_STANDARD VERSION_LESS 23 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.38")
message(FATAL_ERROR "C++23 Standard library module in C++20 is only supported with MSVC 19.38 or newer.")
endif()
# 如果环境变量没写进来,手动从编译器位置推算
if(NOT VCTOOLS_INSTALL_DIR OR "${VCTOOLS_INSTALL_DIR}" STREQUAL "")
get_filename_component(MSVC_BIN_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY)
# MSVC 的目录结构通常是 .../bin/Hostx64/x64/cl.exe
# 我们向上跳 3 级回到 VC 根目录
get_filename_component(VCTOOLS_INSTALL_DIR "${MSVC_BIN_DIR}/../../.." ABSOLUTE)
endif()
# 此时再转换路径就不会变成 "/modules" 了
file(TO_CMAKE_PATH "${VCTOOLS_INSTALL_DIR}" VCTOOLS_INSTALL_DIR)
message(STATUS "Check VCTOOLS_INSTALL_DIR: ${VCTOOLS_INSTALL_DIR}")
file(TO_CMAKE_PATH "${VCTOOLS_INSTALL_DIR}" VCTOOLS_INSTALL_DIR)
include(FetchContent)
FetchContent_Declare(
std
URL "file://${VCTOOLS_INSTALL_DIR}/modules"
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
SYSTEM
)
FetchContent_MakeAvailable(std)
add_library(std)
target_sources(std PUBLIC
FILE_SET CXX_MODULES
BASE_DIRS ${std_SOURCE_DIR}
FILES
${std_SOURCE_DIR}/std.ixx
${std_SOURCE_DIR}/std.compat.ixx
)
link_libraries(std)
else()
message(FATAL_ERROR "C++23 Standard library module is not supported with current compiler.")
endif()