Merge topic 'cxxmodules-custom-import-std-metadata-file'

85e536b5eb gitlab-ci: test `CMAKE_CXX_STDLIB_MODULES_JSON` in CI
42621a232b Tests/CXXModules: add a label
2f101b2c8c Tests/CXXModules: support testing with custom stdlib json locations
6c178a4ae3 Tests/RunCMake: add newlines in CXXModules options
2b85541e39 cxximportstd: support setting the `import std` metadata location

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !11175
This commit is contained in:
Brad King
2025-09-15 15:39:14 +00:00
committed by Kitware Robot
12 changed files with 127 additions and 49 deletions

View File

@@ -478,6 +478,16 @@ t:hip6.3-radeon:
variables:
CMAKE_CI_JOB_NIGHTLY: "true"
t:linux-gcc-cxx-modules-reloc-ninja:
extends:
- .gcc_cxx_modules_reloc_ninja
- .cmake_test_linux_release
- .linux_x86_64_tags
- .run_dependent
- .needs_centos7_x86_64
variables:
CMAKE_CI_JOB_NIGHTLY: "true"
t:linux-gcc-cxx-modules-ninja:
extends:
- .gcc_cxx_modules_ninja

View File

@@ -0,0 +1,13 @@
# "Misplace" the `libstdc++.modules.json` file so that
# `CMAKE_CXX_STDLIB_MODULES_JSON` is needed to use `import std`.
set(gcc_prefix "/opt/gcc-importstd")
set(CMake_TEST_CXX_STDLIB_MODULES_JSON
"${gcc_prefix}/lib64/libstdc++.modules.json"
CACHE FILEPATH "")
file(MAKE_DIRECTORY
"${gcc_prefix}/lib64.reloc")
file(RENAME
"${gcc_prefix}/lib64/libstdc++.modules.json"
"${CMake_TEST_CXX_STDLIB_MODULES_JSON}")
include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")

View File

@@ -524,6 +524,13 @@
variables:
CMAKE_CONFIGURATION: linux_gcc_cxx_modules_ninja
.gcc_cxx_modules_reloc_ninja:
extends: .gcc_cxx_modules_x86_64
variables:
CMAKE_CONFIGURATION: linux_gcc_cxx_modules_reloc_ninja
CTEST_LABELS: "CXXModules"
.gcc_cxx_modules_ninja_multi:
extends: .gcc_cxx_modules_x86_64

View File

@@ -45,6 +45,7 @@ Variables that Provide Information
/variable/CMAKE_CURRENT_LIST_FILE
/variable/CMAKE_CURRENT_LIST_LINE
/variable/CMAKE_CURRENT_SOURCE_DIR
/variable/CMAKE_CXX_STDLIB_MODULES_JSON
/variable/CMAKE_DEBUG_TARGET_PROPERTIES
/variable/CMAKE_DIRECTORY_LABELS
/variable/CMAKE_DL_LIBS

View File

@@ -0,0 +1,7 @@
cxxmodules-custom-import-std-metadata-file
------------------------------------------
* The ``import std`` support learned to use the
:variable:`CMAKE_CXX_STDLIB_MODULES_JSON` variable to set the path to the
metadata file for the standard library rather than using the compiler to
discover its location.

View File

@@ -0,0 +1,11 @@
CMAKE_CXX_STDLIB_MODULES_JSON
-----------------------------
.. versionadded:: 4.2
This variable may be used to set the path to a metadata file for CMake to
understand how the ``import std`` target for the active CXX compiler should be
constructed.
This should only be used when the compiler does not know how to discover the
relevant module metadata file without such assistance.

View File

@@ -10,21 +10,25 @@ function (_cmake_cxx_import_std std variable)
return ()
endif ()
execute_process(
COMMAND
"${CMAKE_CXX_COMPILER}"
${CMAKE_CXX_COMPILER_ID_ARG1}
"-print-file-name=${_clang_modules_json_impl}.modules.json"
OUTPUT_VARIABLE _clang_libcxx_modules_json_file
ERROR_VARIABLE _clang_libcxx_modules_json_file_err
RESULT_VARIABLE _clang_libcxx_modules_json_file_res
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if (_clang_libcxx_modules_json_file_res)
set("${variable}"
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Could not find `${_clang_modules_json_impl}.modules.json` resource\")\n"
PARENT_SCOPE)
return ()
if (CMAKE_CXX_STDLIB_MODULES_JSON)
set(_clang_libcxx_modules_json_file "${CMAKE_CXX_STDLIB_MODULES_JSON}")
else ()
execute_process(
COMMAND
"${CMAKE_CXX_COMPILER}"
${CMAKE_CXX_COMPILER_ID_ARG1}
"-print-file-name=${_clang_modules_json_impl}.modules.json"
OUTPUT_VARIABLE _clang_libcxx_modules_json_file
ERROR_VARIABLE _clang_libcxx_modules_json_file_err
RESULT_VARIABLE _clang_libcxx_modules_json_file_res
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if (_clang_libcxx_modules_json_file_res)
set("${variable}"
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Could not find `${_clang_modules_json_impl}.modules.json` resource\")\n"
PARENT_SCOPE)
return ()
endif ()
endif ()
# Without this file, we do not have modules installed.

View File

@@ -6,21 +6,25 @@ function (_cmake_cxx_import_std std variable)
return ()
endif ()
execute_process(
COMMAND
"${CMAKE_CXX_COMPILER}"
${CMAKE_CXX_COMPILER_ID_ARG1}
-print-file-name=libstdc++.modules.json
OUTPUT_VARIABLE _gnu_libstdcxx_modules_json_file
ERROR_VARIABLE _gnu_libstdcxx_modules_json_file_err
RESULT_VARIABLE _gnu_libstdcxx_modules_json_file_res
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if (_gnu_libstdcxx_modules_json_file_res)
set("${variable}"
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Could not find `libstdc++.modules.json` resource\")\n"
PARENT_SCOPE)
return ()
if (CMAKE_CXX_STDLIB_MODULES_JSON)
set(_gnu_libstdcxx_modules_json_file "${CMAKE_CXX_STDLIB_MODULES_JSON}")
else ()
execute_process(
COMMAND
"${CMAKE_CXX_COMPILER}"
${CMAKE_CXX_COMPILER_ID_ARG1}
-print-file-name=libstdc++.modules.json
OUTPUT_VARIABLE _gnu_libstdcxx_modules_json_file
ERROR_VARIABLE _gnu_libstdcxx_modules_json_file_err
RESULT_VARIABLE _gnu_libstdcxx_modules_json_file_res
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if (_gnu_libstdcxx_modules_json_file_res)
set("${variable}"
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Could not find `libstdc++.modules.json` resource\")\n"
PARENT_SCOPE)
return ()
endif ()
endif ()
# Without this file, we do not have modules installed.

View File

@@ -1,21 +1,25 @@
function (_cmake_cxx_import_std std variable)
find_file(_msvc_modules_json_file
NAME modules.json
HINTS
"$ENV{VCToolsInstallDir}/modules"
PATHS
"$ENV{INCLUDE}"
"${CMAKE_CXX_COMPILER}/../../.."
"${CMAKE_CXX_COMPILER}/../.." # msvc-wine layout
PATH_SUFFIXES
../modules
NO_CACHE)
# Without this file, we do not have modules installed.
if (NOT EXISTS "${_msvc_modules_json_file}")
set("${variable}"
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Could not find `modules.json` resource\")\n"
PARENT_SCOPE)
return ()
if (CMAKE_CXX_STDLIB_MODULES_JSON)
set(_msvc_modules_json_file "${CMAKE_CXX_STDLIB_MODULES_JSON}")
else ()
find_file(_msvc_modules_json_file
NAME modules.json
HINTS
"$ENV{VCToolsInstallDir}/modules"
PATHS
"$ENV{INCLUDE}"
"${CMAKE_CXX_COMPILER}/../../.."
"${CMAKE_CXX_COMPILER}/../.." # msvc-wine layout
PATH_SUFFIXES
../modules
NO_CACHE)
# Without this file, we do not have modules installed.
if (NOT EXISTS "${_msvc_modules_json_file}")
set("${variable}"
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Could not find `modules.json` resource\")\n"
PARENT_SCOPE)
return ()
endif ()
endif ()
file(READ "${_msvc_modules_json_file}" _msvc_modules_json)

View File

@@ -1095,6 +1095,7 @@ cm::optional<cmTryCompileResult> cmCoreTryCompile::TryCompileCode(
vars.emplace("CMAKE_MSVC_RUNTIME_CHECKS"_s);
vars.emplace("CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS"_s);
vars.emplace("CMAKE_VS_USE_DEBUG_LIBRARIES"_s);
vars.emplace("CMAKE_CXX_STDLIB_MODULES_JSON"_s);
if (cmValue varListStr = this->Makefile->GetDefinition(
kCMAKE_TRY_COMPILE_PLATFORM_VARIABLES)) {

View File

@@ -824,7 +824,13 @@ add_RunCMake_test(DependencyGraph)
set_property(TEST RunCMake.DependencyGraph APPEND PROPERTY LABELS "Fortran")
# Add C++ Module tests.
add_RunCMake_test(CXXModules -DCMake_TEST_MODULE_COMPILATION=${CMake_TEST_MODULE_COMPILATION} -DCMake_TEST_MODULE_COMPILATION_RULES=${CMake_TEST_MODULE_COMPILATION_RULES})
add_RunCMake_test(CXXModules
-DCMake_TEST_MODULE_COMPILATION=${CMake_TEST_MODULE_COMPILATION}
-DCMake_TEST_MODULE_COMPILATION_RULES=${CMake_TEST_MODULE_COMPILATION_RULES}
-DCMake_TEST_CXX_STDLIB_MODULES_JSON=${CMake_TEST_CXX_STDLIB_MODULES_JSON}
)
set_property(TEST RunCMake.CXXModules APPEND
PROPERTY LABELS "CXXModules")
# ctresalloc links against CMakeLib and CTestLib, which means it can't be built
# if CMake_TEST_EXTERNAL_CMAKE is activated (the compiler might be different.)

View File

@@ -1,6 +1,12 @@
include(RunCMake)
run_cmake(Inspect)
set(stdlib_custom_json)
if (CMake_TEST_CXX_STDLIB_MODULES_JSON)
list(APPEND stdlib_custom_json
-DCMAKE_CXX_STDLIB_MODULES_JSON=${CMake_TEST_CXX_STDLIB_MODULES_JSON})
endif ()
run_cmake(Inspect ${stdlib_custom_json})
include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake")
# Test negative cases where C++20 modules do not work.
@@ -149,6 +155,10 @@ function (run_cxx_module_test directory)
else ()
set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
endif ()
if (directory MATCHES "import-std")
list(APPEND RunCMake_TEST_OPTIONS
${stdlib_custom_json})
endif ()
if (RunCMake_CXXModules_INSTALL)
set(prefix "${RunCMake_BINARY_DIR}/examples/${test_name}-install")