summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2024-04-17 15:09:08 (GMT)
committerBen Boeckel <ben.boeckel@kitware.com>2024-04-18 13:53:21 (GMT)
commit678717f3e432ba80c2018ee2a3d7c2d20005667f (patch)
tree472466955ece76cd96d3229da6db258e707e0a69
parent9bf79a7964d18cc32678d10305f948bb72f978d6 (diff)
downloadCMake-678717f3e432ba80c2018ee2a3d7c2d20005667f.zip
CMake-678717f3e432ba80c2018ee2a3d7c2d20005667f.tar.gz
CMake-678717f3e432ba80c2018ee2a3d7c2d20005667f.tar.bz2
cxxmodules: provide a detection variable for `import std`
-rw-r--r--Help/manual/cmake-cxxmodules.7.rst3
-rw-r--r--Help/manual/cmake-variables.7.rst1
-rw-r--r--Help/variable/CMAKE_CXX_COMPILER_IMPORT_STD.rst14
-rw-r--r--Modules/CMakeCXXCompiler.cmake.in1
-rw-r--r--Modules/Compiler/CMakeCommonCompilerMacros.cmake3
-rw-r--r--Tests/RunCMake/CXXModules/Inspect.cmake19
6 files changed, 37 insertions, 4 deletions
diff --git a/Help/manual/cmake-cxxmodules.7.rst b/Help/manual/cmake-cxxmodules.7.rst
index 8f4ff44..840d65f 100644
--- a/Help/manual/cmake-cxxmodules.7.rst
+++ b/Help/manual/cmake-cxxmodules.7.rst
@@ -96,6 +96,9 @@ library combinations:
* MSVC toolset 14.36 and newer (provided with Visual Studio 17.6 Preview 2 and
newer)
+The :variable:`CMAKE_CXX_COMPILER_IMPORT_STD` variable may be used to detect
+support for a standard level with the active C++ toolchain.
+
.. note ::
This support is provided only when experimental support for
diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst
index 6ae7d1c..92da82a 100644
--- a/Help/manual/cmake-variables.7.rst
+++ b/Help/manual/cmake-variables.7.rst
@@ -580,6 +580,7 @@ Variables for Languages
/variable/CMAKE_CUDA_STANDARD_REQUIRED
/variable/CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES
/variable/CMAKE_CXX_COMPILE_FEATURES
+ /variable/CMAKE_CXX_COMPILER_IMPORT_STD
/variable/CMAKE_CXX_EXTENSIONS
/variable/CMAKE_CXX_STANDARD
/variable/CMAKE_CXX_STANDARD_REQUIRED
diff --git a/Help/variable/CMAKE_CXX_COMPILER_IMPORT_STD.rst b/Help/variable/CMAKE_CXX_COMPILER_IMPORT_STD.rst
new file mode 100644
index 0000000..384b5eb
--- /dev/null
+++ b/Help/variable/CMAKE_CXX_COMPILER_IMPORT_STD.rst
@@ -0,0 +1,14 @@
+CMAKE_CXX_COMPILER_IMPORT_STD
+-----------------------------
+
+.. versionadded:: 3.30
+
+A list of C++ standard levels for which ``import std`` support exists for the
+current C++ toolchain. Support for C++\<NN\> may be detected using a
+``<NN> IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD`` predicate with the
+:command:`if` command.
+
+.. note ::
+
+ This variable is meaningful only when experimental support for ``import
+ std;`` has been enabled by the ``CMAKE_EXPERIMENTAL_CXX_IMPORT_STD`` gate.
diff --git a/Modules/CMakeCXXCompiler.cmake.in b/Modules/CMakeCXXCompiler.cmake.in
index e0c5f8b..1064e7c 100644
--- a/Modules/CMakeCXXCompiler.cmake.in
+++ b/Modules/CMakeCXXCompiler.cmake.in
@@ -92,4 +92,5 @@ set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "@CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES@")
set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "@CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES@")
set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "@CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR@")
+set(CMAKE_CXX_COMPILER_IMPORT_STD "")
@CMAKE_CXX_IMPORT_STD@
diff --git a/Modules/Compiler/CMakeCommonCompilerMacros.cmake b/Modules/Compiler/CMakeCommonCompilerMacros.cmake
index 0b5df0d..9eead20 100644
--- a/Modules/Compiler/CMakeCommonCompilerMacros.cmake
+++ b/Modules/Compiler/CMakeCommonCompilerMacros.cmake
@@ -244,6 +244,9 @@ function(cmake_create_cxx_import_std std variable)
string(CONCAT guarded_target_definition
"if (NOT TARGET \"__CMAKE::CXX${std}\")\n"
"${target_definition}"
+ "endif ()\n"
+ "if (TARGET \"__CMAKE::CXX${std}\")\n"
+ " list(APPEND CMAKE_CXX_COMPILER_IMPORT_STD \"${std}\")\n"
"endif ()\n")
set("${variable}" "${guarded_target_definition}" PARENT_SCOPE)
endfunction()
diff --git a/Tests/RunCMake/CXXModules/Inspect.cmake b/Tests/RunCMake/CXXModules/Inspect.cmake
index 1597bd8..e648e8c 100644
--- a/Tests/RunCMake/CXXModules/Inspect.cmake
+++ b/Tests/RunCMake/CXXModules/Inspect.cmake
@@ -15,10 +15,21 @@ if (CMAKE_CXX_FLAGS MATCHES "-std=")
set(forced_cxx_standard 1)
endif ()
-set(have_cxx23_import_std 0)
-if (TARGET "__CMAKE::CXX23")
- set(have_cxx23_import_std 1)
-endif ()
+macro (cxx_check_import_std version)
+ set(have_cxx${version}_import_std 0)
+ if ("${version}" IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD)
+ set(have_cxx${version}_import_std 1)
+ endif ()
+
+ if (TARGET "__CMAKE:CXX${version}" AND NOT have_cxx${version}_import_std)
+ message(FATAL_ERROR
+ "The toolchain's C++${version} target exists, but the user variable does "
+ "not indicate it.")
+ endif ()
+endmacro ()
+
+cxx_check_import_std(23)
+cxx_check_import_std(26)
# Forward information about the C++ compile features.
string(APPEND info "\