mirror of
https://github.com/Kitware/CMake.git
synced 2026-06-30 19:57:41 +00:00
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:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
22
Tests/RunCMake/ToolchainSkipsChecks/C-toolchain.cmake
Normal file
22
Tests/RunCMake/ToolchainSkipsChecks/C-toolchain.cmake
Normal 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")
|
||||
1
Tests/RunCMake/ToolchainSkipsChecks/C.cmake
Normal file
1
Tests/RunCMake/ToolchainSkipsChecks/C.cmake
Normal file
@@ -0,0 +1 @@
|
||||
enable_language(C)
|
||||
3
Tests/RunCMake/ToolchainSkipsChecks/CMakeLists.txt
Normal file
3
Tests/RunCMake/ToolchainSkipsChecks/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
project(${RunCMake_TEST} NONE)
|
||||
include(${RunCMake_TEST}.cmake)
|
||||
25
Tests/RunCMake/ToolchainSkipsChecks/CXX-toolchain.cmake
Normal file
25
Tests/RunCMake/ToolchainSkipsChecks/CXX-toolchain.cmake
Normal 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")
|
||||
1
Tests/RunCMake/ToolchainSkipsChecks/CXX.cmake
Normal file
1
Tests/RunCMake/ToolchainSkipsChecks/CXX.cmake
Normal file
@@ -0,0 +1 @@
|
||||
enable_language(CXX)
|
||||
18
Tests/RunCMake/ToolchainSkipsChecks/Fortran-toolchain.cmake
Normal file
18
Tests/RunCMake/ToolchainSkipsChecks/Fortran-toolchain.cmake
Normal 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")
|
||||
1
Tests/RunCMake/ToolchainSkipsChecks/Fortran.cmake
Normal file
1
Tests/RunCMake/ToolchainSkipsChecks/Fortran.cmake
Normal file
@@ -0,0 +1 @@
|
||||
enable_language(Fortran)
|
||||
16
Tests/RunCMake/ToolchainSkipsChecks/RunCMakeTest.cmake
Normal file
16
Tests/RunCMake/ToolchainSkipsChecks/RunCMakeTest.cmake
Normal 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)
|
||||
27
Tests/RunCMake/ToolchainSkipsChecks/check.cmake
Normal file
27
Tests/RunCMake/ToolchainSkipsChecks/check.cmake
Normal 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 ()
|
||||
@@ -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 ()
|
||||
Reference in New Issue
Block a user