diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2024-04-17 15:09:08 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2024-04-18 13:53:21 (GMT) |
commit | 678717f3e432ba80c2018ee2a3d7c2d20005667f (patch) | |
tree | 472466955ece76cd96d3229da6db258e707e0a69 | |
parent | 9bf79a7964d18cc32678d10305f948bb72f978d6 (diff) | |
download | CMake-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.rst | 3 | ||||
-rw-r--r-- | Help/manual/cmake-variables.7.rst | 1 | ||||
-rw-r--r-- | Help/variable/CMAKE_CXX_COMPILER_IMPORT_STD.rst | 14 | ||||
-rw-r--r-- | Modules/CMakeCXXCompiler.cmake.in | 1 | ||||
-rw-r--r-- | Modules/Compiler/CMakeCommonCompilerMacros.cmake | 3 | ||||
-rw-r--r-- | Tests/RunCMake/CXXModules/Inspect.cmake | 19 |
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 "\ |