mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-04 04:40:56 -06:00
Merge topic 'cxxmodules-custom-import-std-metadata-file'
85e536b5ebgitlab-ci: test `CMAKE_CXX_STDLIB_MODULES_JSON` in CI42621a232bTests/CXXModules: add a label2f101b2c8cTests/CXXModules: support testing with custom stdlib json locations6c178a4ae3Tests/RunCMake: add newlines in CXXModules options2b85541e39cxximportstd: support setting the `import std` metadata location Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !11175
This commit is contained in:
@@ -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
|
||||
|
||||
13
.gitlab/ci/configure_linux_gcc_cxx_modules_reloc_ninja.cmake
Normal file
13
.gitlab/ci/configure_linux_gcc_cxx_modules_reloc_ninja.cmake
Normal 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")
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
11
Help/variable/CMAKE_CXX_STDLIB_MODULES_JSON.rst
Normal file
11
Help/variable/CMAKE_CXX_STDLIB_MODULES_JSON.rst
Normal 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.
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user