mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-24 07:08:38 -05:00
Merge topic 'gcc-import-std'
2a0ca6a26dci: add jobs to test GCC 15-to-be with `import std`469175c2e6Experimental: recycle the `import std` UUIDa980dab9b1gcc: support `import std`2791b7564bTests/RunCMake: handle C++26 support where needed Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !10023
This commit is contained in:
@@ -438,6 +438,26 @@ t:hip5.5-radeon:
|
||||
variables:
|
||||
CMAKE_CI_JOB_NIGHTLY: "true"
|
||||
|
||||
t:linux-gcc-cxx-modules-ninja:
|
||||
extends:
|
||||
- .gcc_cxx_modules_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-multi:
|
||||
extends:
|
||||
- .gcc_cxx_modules_ninja_multi
|
||||
- .cmake_test_linux_release
|
||||
- .linux_x86_64_tags
|
||||
- .run_dependent
|
||||
- .needs_centos7_x86_64
|
||||
variables:
|
||||
CMAKE_CI_JOB_NIGHTLY: "true"
|
||||
|
||||
t:debian10-legacy:
|
||||
extends:
|
||||
- .debian10_legacy
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,bmionly,build_database,import_std23" CACHE STRING "")
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
|
||||
@@ -0,0 +1,3 @@
|
||||
set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,bmionly,build_database,import_std23" CACHE STRING "")
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
|
||||
@@ -0,0 +1,9 @@
|
||||
FROM fedora:41
|
||||
MAINTAINER Ben Boeckel <ben.boeckel@kitware.com>
|
||||
|
||||
# Install build dependencies for packages.
|
||||
COPY install_deps.sh /root/install_deps.sh
|
||||
RUN sh /root/install_deps.sh
|
||||
|
||||
COPY install_gcc.sh /root/install_gcc.sh
|
||||
RUN sh /root/install_gcc.sh
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
dnf install -y --setopt=install_weak_deps=False \
|
||||
gcc-c++ mpfr-devel libmpc-devel isl-devel flex bison file findutils diffutils git-core
|
||||
dnf clean all
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
readonly revision="10e702789eeabcc88451e34c2a5c7dccb96190a5" # master as of 21 Nov 2024
|
||||
readonly tarball="git://gcc.gnu.org/git/gcc.git"
|
||||
|
||||
readonly workdir="$HOME/gcc"
|
||||
readonly srcdir="$workdir/gcc"
|
||||
readonly builddir="$workdir/build"
|
||||
readonly njobs="$( nproc )"
|
||||
|
||||
mkdir -p "$workdir"
|
||||
cd "$workdir"
|
||||
git clone "$tarball" "$srcdir"
|
||||
git -C "$srcdir" checkout "$revision"
|
||||
mkdir -p "$builddir"
|
||||
cd "$builddir"
|
||||
"$srcdir/configure" \
|
||||
--disable-multilib \
|
||||
--enable-languages=c,c++ \
|
||||
--prefix="/opt/gcc-importstd"
|
||||
make "-j$njobs"
|
||||
make "-j$njobs" install-strip
|
||||
rm -rf "$workdir"
|
||||
@@ -452,6 +452,30 @@
|
||||
CMAKE_CONFIGURATION: hip5.5_nvidia
|
||||
CTEST_LABELS: "HIP"
|
||||
|
||||
### C++ modules
|
||||
|
||||
.gcc_cxx_modules_x86_64:
|
||||
image: "kitware/cmake:ci-gcc_cxx_modules-x86_64-2024-12-23"
|
||||
|
||||
variables:
|
||||
GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
|
||||
CMAKE_ARCH: x86_64
|
||||
CC: "/opt/gcc-importstd/bin/gcc"
|
||||
CXX: "/opt/gcc-importstd/bin/g++"
|
||||
|
||||
.gcc_cxx_modules_ninja:
|
||||
extends: .gcc_cxx_modules_x86_64
|
||||
|
||||
variables:
|
||||
CMAKE_CONFIGURATION: linux_gcc_cxx_modules_ninja
|
||||
|
||||
.gcc_cxx_modules_ninja_multi:
|
||||
extends: .gcc_cxx_modules_x86_64
|
||||
|
||||
variables:
|
||||
CMAKE_CONFIGURATION: linux_gcc_cxx_modules_ninja_multi
|
||||
CMAKE_GENERATOR: "Ninja Multi-Config"
|
||||
|
||||
### Debian 10 legacy packages
|
||||
|
||||
.debian10:
|
||||
|
||||
@@ -81,7 +81,7 @@ In order to activate support for ``import std`` in C++23 and newer targets,
|
||||
set
|
||||
|
||||
* variable ``CMAKE_EXPERIMENTAL_CXX_IMPORT_STD`` to
|
||||
* value ``0e5b6991-d74f-4b3d-a41c-cf096e0b2508``.
|
||||
* value ``a9e1cf81-9932-4810-974b-6eccaf14e457``.
|
||||
|
||||
This UUID may change in future versions of CMake. Be sure to use the value
|
||||
documented here by the source tree of the version of CMake with which you are
|
||||
|
||||
@@ -316,8 +316,9 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
|
||||
set(CMAKE_${lang}_STANDARD_LIBRARY "")
|
||||
if ("x${lang}" STREQUAL "xCXX" AND
|
||||
EXISTS "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${lang}-DetectStdlib.h" AND
|
||||
"x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xClang" AND
|
||||
"x${CMAKE_${lang}_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
|
||||
("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xClang" AND
|
||||
"x${CMAKE_${lang}_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU") OR
|
||||
("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xGNU"))
|
||||
# See #20851 for a proper abstraction for this.
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_${lang}_COMPILER}"
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
function (_cmake_cxx_import_std std variable)
|
||||
if (NOT CMAKE_CXX_STANDARD_LIBRARY STREQUAL "libstdc++")
|
||||
set("${variable}"
|
||||
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Only `libstdc++` is supported\")\n"
|
||||
PARENT_SCOPE)
|
||||
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 ()
|
||||
endif ()
|
||||
|
||||
# Without this file, we do not have modules installed.
|
||||
if (NOT EXISTS "${_gnu_libstdcxx_modules_json_file}")
|
||||
set("${variable}"
|
||||
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"`libstdc++.modules.json` resource does not exist\")\n"
|
||||
PARENT_SCOPE)
|
||||
return ()
|
||||
endif ()
|
||||
|
||||
file(READ "${_gnu_libstdcxx_modules_json_file}" _gnu_libstdcxx_modules_json)
|
||||
string(JSON _gnu_modules_json_version GET "${_gnu_libstdcxx_modules_json}" "version")
|
||||
string(JSON _gnu_modules_json_revision GET "${_gnu_libstdcxx_modules_json}" "revision")
|
||||
# Require version 1.
|
||||
if (NOT _gnu_modules_json_version EQUAL "1")
|
||||
set("${variable}"
|
||||
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"`libstdc++.modules.json` version ${_gnu_modules_json_version}.${_gnu_modules_json_revision} is not recognized\")\n"
|
||||
PARENT_SCOPE)
|
||||
return ()
|
||||
endif ()
|
||||
|
||||
string(JSON _gnu_modules_json_nmodules LENGTH "${_gnu_libstdcxx_modules_json}" "modules")
|
||||
# Don't declare the target without any modules.
|
||||
if (NOT _gnu_modules_json_nmodules)
|
||||
set("${variable}"
|
||||
"set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"`libstdc++.modules.json` does not list any available modules\")\n"
|
||||
PARENT_SCOPE)
|
||||
return ()
|
||||
endif ()
|
||||
|
||||
# Declare the target.
|
||||
set(_gnu_libstdcxx_target "")
|
||||
string(APPEND _gnu_libstdcxx_target
|
||||
"add_library(__CMAKE::CXX${std} IMPORTED INTERFACE)\n")
|
||||
string(APPEND _gnu_libstdcxx_target
|
||||
"target_compile_features(__CMAKE::CXX${std} INTERFACE cxx_std_${std})\n")
|
||||
|
||||
set(_gnu_modules_is_stdlib 0)
|
||||
set(_gnu_modules_include_dirs_list "")
|
||||
set(_gnu_modules_module_paths "")
|
||||
get_filename_component(_gnu_modules_dir "${_gnu_libstdcxx_modules_json_file}" DIRECTORY)
|
||||
|
||||
# Add module sources.
|
||||
math(EXPR _gnu_modules_json_nmodules_range "${_gnu_modules_json_nmodules} - 1")
|
||||
foreach (_gnu_modules_json_modules_idx RANGE 0 "${_gnu_modules_json_nmodules_range}")
|
||||
string(JSON _gnu_modules_json_module GET "${_gnu_libstdcxx_modules_json}" "modules" "${_gnu_modules_json_modules_idx}")
|
||||
|
||||
string(JSON _gnu_modules_json_module_source GET "${_gnu_modules_json_module}" "source-path")
|
||||
string(JSON _gnu_modules_json_module_is_stdlib GET "${_gnu_modules_json_module}" "is-std-library")
|
||||
string(JSON _gnu_modules_json_module_local_arguments ERROR_VARIABLE _gnu_modules_json_module_local_arguments_error GET "${_gnu_modules_json_module}" "local-arguments")
|
||||
string(JSON _gnu_modules_json_module_nsystem_include_directories ERROR_VARIABLE _gnu_modules_json_module_nsystem_include_directories_error LENGTH "${_gnu_modules_json_module_local_arguments}" "system-include-directories")
|
||||
|
||||
if (_gnu_modules_json_module_local_arguments_error STREQUAL "NOTFOUND")
|
||||
set(_gnu_modules_json_module_local_arguments "")
|
||||
endif ()
|
||||
if (_gnu_modules_json_module_nsystem_include_directories_error STREQUAL "NOTFOUND")
|
||||
set(_gnu_modules_json_module_nsystem_include_directories 0)
|
||||
endif ()
|
||||
|
||||
if (NOT IS_ABSOLUTE "${_gnu_modules_json_module_source}")
|
||||
string(PREPEND _gnu_modules_json_module_source "${_gnu_modules_dir}/")
|
||||
endif ()
|
||||
list(APPEND _gnu_modules_module_paths
|
||||
"${_gnu_modules_json_module_source}")
|
||||
|
||||
if (_gnu_modules_json_module_is_stdlib)
|
||||
set(_gnu_modules_is_stdlib 1)
|
||||
endif ()
|
||||
|
||||
if (_gnu_modules_json_module_nsystem_include_directories)
|
||||
math(EXPR _gnu_modules_json_module_nsystem_include_directories_range "${_gnu_modules_json_module_nsystem_include_directories} - 1")
|
||||
foreach (_gnu_modules_json_modules_system_include_directories_idx RANGE 0 "${_gnu_modules_json_module_nsystem_include_directories_range}")
|
||||
string(JSON _gnu_modules_json_module_system_include_directory GET "${_gnu_modules_json_module_local_arguments}" "system-include-directories" "${_gnu_modules_json_modules_system_include_directories_idx}")
|
||||
|
||||
if (NOT IS_ABSOLUTE "${_gnu_modules_json_module_system_include_directory}")
|
||||
string(PREPEND _gnu_modules_json_module_system_include_directory "${_gnu_modules_dir}/")
|
||||
endif ()
|
||||
list(APPEND _gnu_modules_include_dirs_list
|
||||
"${_gnu_modules_json_module_system_include_directory}")
|
||||
endforeach ()
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
# Split the paths into basedirs and module paths.
|
||||
set(_gnu_modules_base_dirs_list "")
|
||||
set(_gnu_modules_files "")
|
||||
foreach (_gnu_modules_module_path IN LISTS _gnu_modules_module_paths)
|
||||
get_filename_component(_gnu_module_dir "${_gnu_modules_module_path}" DIRECTORY)
|
||||
|
||||
list(APPEND _gnu_modules_base_dirs_list
|
||||
"${_gnu_module_dir}")
|
||||
string(APPEND _gnu_modules_files
|
||||
" \"${_gnu_modules_module_path}\"")
|
||||
endforeach ()
|
||||
list(REMOVE_DUPLICATES _gnu_modules_base_dirs_list)
|
||||
set(_gnu_modules_base_dirs "")
|
||||
foreach (_gnu_modules_base_dir IN LISTS _gnu_modules_base_dirs_list)
|
||||
string(APPEND _gnu_modules_base_dirs
|
||||
" \"${_gnu_modules_base_dir}\"")
|
||||
endforeach ()
|
||||
|
||||
# Create the file set for the modules.
|
||||
string(APPEND _gnu_libstdcxx_target
|
||||
"target_sources(__CMAKE::CXX${std}
|
||||
INTERFACE
|
||||
FILE_SET std TYPE CXX_MODULES
|
||||
BASE_DIRS ${_gnu_modules_base_dirs}
|
||||
FILES ${_gnu_modules_files})\n")
|
||||
|
||||
set("${variable}" "${_gnu_libstdcxx_target}" PARENT_SCOPE)
|
||||
endfunction ()
|
||||
@@ -39,7 +39,7 @@ cmExperimental::FeatureData LookupTable[] = {
|
||||
false },
|
||||
// CxxImportStd
|
||||
{ "CxxImportStd",
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508",
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457",
|
||||
"CMAKE_EXPERIMENTAL_CXX_IMPORT_STD",
|
||||
"CMake's support for `import std;` in C++23 and newer is experimental. It "
|
||||
"is meant only for experimentation and feedback to CMake developers.",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
project(cxx_modules_import_std_export_no_std CXX)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
project(cxx_modules_import_std_export_no_std CXX)
|
||||
|
||||
@@ -1 +1 @@
|
||||
((Clang)?module 'std' not found|(MSVC)?could not find module 'std')
|
||||
((GNU)?fatal error: unknown compiled module interface: no such module|(Clang)?module 'std' not found|(MSVC)?could not find module 'std')
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
project(cxx_modules_import_std_no_std_property CXX)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
project(cxx_modules_import_std_not_in_export CXX)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
project(cxx_modules_import_std_not_in_export CXX)
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
|
||||
if (EXPORT_NO_STD)
|
||||
# Block making C++ `import std` targets.
|
||||
add_library(__CMAKE::CXX23 IMPORTED INTERFACE)
|
||||
add_library(__CMAKE::CXX26 IMPORTED INTERFACE)
|
||||
endif ()
|
||||
|
||||
project(cxx_modules_import_std_transitive CXX)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
project(cxx_modules_import_std CXX)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
|
||||
"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
|
||||
"a9e1cf81-9932-4810-974b-6eccaf14e457")
|
||||
|
||||
cmake_language(GET_EXPERIMENTAL_FEATURE_ENABLED
|
||||
"CxxImportStd"
|
||||
|
||||
Reference in New Issue
Block a user