Tests/RunCMake/ToolchainSkipsChecks: add tests for skipping compiler checks

There is interest in being able to craft a toolchain file that skips all
(relatively expensive) `try_*` commands during compiler detection. Add
tests which:

- discover the toolchain for a language
- write a toolchain file using that knowledge
- add a test that uses the toolchain file
- verify that the toolchain file-using test performs no `try_*` commands
  by inspecting the configure log

There are also checks which use `execute_process`, but these are far
less expensive and not a worry at the moment.
This commit is contained in:
Ben Boeckel
2026-04-09 23:07:15 -04:00
parent bfeef792bb
commit 94f4c64461
12 changed files with 129 additions and 6 deletions

View File

@@ -1,9 +1,7 @@
$erroractionpreference = "stop"
cmd /c "`".gitlab\intel\setvars.bat`" & set" |
foreach {
if ($_ -match "=") {
$v = $_.split("=")
[Environment]::SetEnvironmentVariable($v[0], $v[1])
}
$all_env = cmd /c "`".gitlab\intel\setvars.bat`" >NUL & powershell -Command `"Get-ChildItem env: | Select-Object -Property Key,Value | ConvertTo-Json`"" | ConvertFrom-Json
foreach ($envvar in $all_env) {
[Environment]::SetEnvironmentVariable($envvar.Key, $envvar.Value)
}

View File

@@ -628,6 +628,11 @@ add_RunCMake_test(FileSet-SOURCES -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
-DCMAKE_C_OUTPUT_EXTENSION=${CMAKE_C_OUTPUT_EXTENSION}
-DMSVC_VERSION=${MSVC_VERSION})
add_RunCMake_test(ToolchainFile)
add_RunCMake_test(ToolchainSkipsChecks
-DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
-DCMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID}
-DCMAKE_Fortran_COMPILER_ID=${CMAKE_Fortran_COMPILER_ID}
)
if(NOT CMake_TEST_EXTERNAL_CMAKE)
set(Tutorial_ARGS TEST_DIR Tutorial -DTutorial_SOURCE_DIR=${CMake_SOURCE_DIR}/Help/guide/tutorial)

View File

@@ -0,0 +1,22 @@
enable_language(C)
set(vars
CMAKE_C_COMPILER_WORKS
CMAKE_C_COMPILER_ARCHITECTURE_ID
CMAKE_C_STANDARD_INCLUDE_DIRECTORIES
CMAKE_C_COMPILER_LINKER
CMAKE_C_COMPILER_LINKER_ID
CMAKE_C_COMPILER_LINKER_VERSION
CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT
CMAKE_C_IMPLICIT_LINK_LIBRARIES
CMAKE_C_IMPLICIT_LINK_DIRECTORIES
CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
CMAKE_C_LIBRARY_ARCHITECTURE
CMAKE_C_COMPILE_FEATURES
CMAKE_C_USE_LINKER_INFORMATION)
foreach (std IN ITEMS 23 17 11 99 90)
list(APPEND vars
CMAKE_C${std}_COMPILE_FEATURES)
endforeach ()
include("${CMAKE_CURRENT_LIST_DIR}/write-toolchain.cmake")

View File

@@ -0,0 +1 @@
enable_language(C)

View File

@@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.29)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@@ -0,0 +1,25 @@
enable_language(CXX)
set(vars
CMAKE_CXX_COMPILER_WORKS
CMAKE_CXX_COMPILER_ARCHITECTURE_ID
CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
CMAKE_CXX_COMPILER_LINKER
CMAKE_CXX_COMPILER_LINKER_ID
CMAKE_CXX_COMPILER_LINKER_VERSION
CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT
CMAKE_CXX_IMPLICIT_LINK_LIBRARIES
CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES
CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
CMAKE_CXX_LIBRARY_ARCHITECTURE
CMAKE_CXX_COMPILE_FEATURES
CMAKE_CXX_USE_LINKER_INFORMATION
CMAKE_CXX_COMPILER_IMPORT_STD
CMAKE_CXX_STDLIB_MODULES_JSON)
foreach (std IN ITEMS 26 23 20 17 14 11 98)
list(APPEND vars
CMAKE_CXX${std}_COMPILE_FEATURES)
endforeach ()
include("${CMAKE_CURRENT_LIST_DIR}/write-toolchain.cmake")

View File

@@ -0,0 +1 @@
enable_language(CXX)

View File

@@ -0,0 +1,18 @@
enable_language(Fortran)
set(vars
CMAKE_Fortran_COMPILER_ARCHITECTURE_ID
CMAKE_Fortran_COMPILER_SUPPORTS_F90
CMAKE_Fortran_COMPILER_WORKS
CMAKE_Fortran_STANDARD_INCLUDE_DIRECTORIES
CMAKE_Fortran_COMPILER_LINKER
CMAKE_Fortran_COMPILER_LINKER_ID
CMAKE_Fortran_COMPILER_LINKER_VERSION
CMAKE_Fortran_COMPILER_LINKER_FRONTEND_VARIANT
CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES
CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES
CMAKE_Fortran_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
CMAKE_Fortran_LIBRARY_ARCHITECTURE
CMAKE_Fortran_USE_LINKER_INFORMATION)
include("${CMAKE_CURRENT_LIST_DIR}/write-toolchain.cmake")

View File

@@ -0,0 +1 @@
enable_language(Fortran)

View File

@@ -0,0 +1,16 @@
include(RunCMake)
function (run_cmake_lang lang)
if (NOT CMAKE_${lang}_COMPILER_ID)
return ()
endif ()
run_cmake(${lang}-toolchain)
set(RunCMake-check-file "check.cmake")
run_cmake_with_options(${lang}
# "-DCMAKE_${lang}_COMPILER_FORCED=1"
"-DCMAKE_TOOLCHAIN_FILE=${RunCMake_BINARY_DIR}/${lang}-toolchain-build/Toolchain.cmake")
endfunction ()
run_cmake_lang(C)
run_cmake_lang(CXX)
run_cmake_lang(Fortran)

View File

@@ -0,0 +1,27 @@
set(configure_log "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/CMakeConfigureLog.yaml")
if (NOT EXISTS "${configure_log}")
set(RunCMake_TEST_FAILED "Configure log does not exist:\n ${configure_log}")
return ()
endif ()
set(force_fail 0)
set(want_varname 0)
file(STRINGS "${configure_log}" lines REGEX "(kind:|variable:)")
foreach (line IN LISTS lines)
if (line MATCHES "kind:")
string(REGEX REPLACE ".*\"([^\"]+)\".*" "\\1" kind "${line}")
if (kind MATCHES "try_")
set(force_fail 1)
set(want_varname 1)
endif ()
elseif (want_varname AND line MATCHES "variable:")
string(REGEX REPLACE ".*\"([^\"]+)\".*" "\\1" varname "${line}")
list(APPEND RunCMake_TEST_FAILED
"Found a `${kind}` event for `${varname}`")
set(want_varname 0)
endif ()
endforeach ()
if (force_fail AND NOT RunCMake_TEST_FAILED)
set(RunCMake_TEST_FAILED "Found a failing event, but not its variable. Forcing a failure. See ${configure_log}")
endif ()

View File

@@ -0,0 +1,6 @@
set(toolchain_file "${CMAKE_BINARY_DIR}/Toolchain.cmake")
file(WRITE "${toolchain_file}" "")
foreach (var IN LISTS vars)
file(APPEND "${toolchain_file}"
"set(\"${var}\" [===[${${var}}]===])\n")
endforeach ()