Files
cmake/Tests/CMakeGUI/CMakeGUITest.cmake
Daksh Mamodiya fdc2c2b9c7 cmake-gui: settle preset application before Configure/Generate
Selecting a configure preset applies on the worker thread, but Configure
and Generate stayed enabled and could snapshot the stale cache model
first. Tokenize preset application, disable the dependent actions until
the completion lands, and accept only the latest request.

Fixes: #28085
2026-09-11 23:24:10 +05:30

230 lines
7.0 KiB
CMake

# Avoid QtTest library timeouts before ctest's timeout.
set(ENV{QTEST_FUNCTION_TIMEOUT} 3600000)
function(run_cmake_gui_test name)
if(DEFINED ENV{CMakeGUITest_TEST_FILTER} AND NOT name MATCHES "$ENV{CMakeGUITest_TEST_FILTER}")
return()
endif()
set(_fail)
cmake_parse_arguments(_rcgt
"DO_CONFIGURE"
"GENERATOR"
"ARGS;CONFIGURE_ARGS"
${ARGN}
)
string(REPLACE ":" "-" _file_name "${name}")
set(_srcdir "${CMakeGUITest_SOURCE_DIR}/${_file_name}")
set(_workdir "${CMakeGUITest_BINARY_DIR}/${_file_name}")
file(REMOVE_RECURSE "${_workdir}")
file(MAKE_DIRECTORY "${_workdir}")
set(_ini_in "${_srcdir}/CMakeSetup.ini.in")
if(EXISTS "${_ini_in}")
configure_file("${_ini_in}" "${_workdir}/config/Kitware/CMakeSetup.ini" @ONLY)
endif()
set(_cmakelists_in "${_srcdir}/CMakeLists.txt.in")
if(EXISTS "${_cmakelists_in}")
configure_file("${_cmakelists_in}" "${_workdir}/src/CMakeLists.txt" @ONLY)
endif()
set(_cmakepresets_in "${_srcdir}/CMakePresets.json.in")
if(EXISTS "${_cmakepresets_in}")
configure_file("${_cmakepresets_in}" "${_workdir}/src/CMakePresets.json" @ONLY)
endif()
set(_instrumentation_files
"${_srcdir}/main.cxx"
"${_srcdir}/lib.h"
"${_srcdir}/lib.cxx"
"${_srcdir}/callback.cmake"
)
foreach(_instrumentation_file IN LISTS _instrumentation_files)
if(EXISTS "${_instrumentation_file}.in")
cmake_path(GET _instrumentation_file FILENAME _instrumentation_file_name)
configure_file("${_instrumentation_file}.in" "${_workdir}/src/${_instrumentation_file_name}" @ONLY)
endif()
endforeach()
if(_rcgt_DO_CONFIGURE)
if(NOT _rcgt_GENERATOR)
set(_rcgt_GENERATOR "${CMakeGUITest_GENERATOR}")
endif()
execute_process(
COMMAND "${CMAKE_COMMAND}"
-S "${_workdir}/src"
-B "${_workdir}/build"
-G "${_rcgt_GENERATOR}"
${_rcgt_CONFIGURE_ARGS}
RESULT_VARIABLE _result
OUTPUT_VARIABLE _output
ERROR_VARIABLE _error
)
if(_result)
set(_fail 1)
string(REPLACE "\n" "\n " _formatted_output "${_output}")
string(REPLACE "\n" "\n " _formatted_error "${_error}")
message(SEND_ERROR
"Configuring ${_workdir}/src failed with exit code ${_result}, should be 0\n"
"stdout:\n ${_formatted_output}\n"
"stderr:\n ${_formatted_error}"
)
endif()
endif()
set(ENV{CMake_GUI_TEST_NAME} "${name}")
set(ENV{CMake_GUI_CONFIG_DIR} "${_workdir}/config")
if(DEFINED ENV{PWD})
set(_old_pwd "$ENV{PWD}")
else()
set(_old_pwd)
endif()
set(ENV{PWD} "${_workdir}")
execute_process(
COMMAND "${CMakeGUITest_COMMAND}" ${_rcgt_ARGS}
WORKING_DIRECTORY "${_workdir}"
RESULT_VARIABLE _result
OUTPUT_VARIABLE _output
ERROR_VARIABLE _error
)
if(DEFINED _old_pwd)
set(ENV{PWD} "${_old_pwd}")
else()
set(ENV{PWD})
endif()
if(_result)
set(_fail 1)
string(REPLACE "\n" "\n " _formatted_output "${_output}")
string(REPLACE "\n" "\n " _formatted_error "${_error}")
message(SEND_ERROR "CMake GUI test ${name} failed with exit code ${_result}, should be 0\n"
"stdout:\n ${_formatted_output}\n"
"stderr:\n ${_formatted_error}"
)
endif()
if(NOT _fail)
message(STATUS "${name} -- passed")
endif()
endfunction()
run_cmake_gui_test(sourceBinaryArgs:sourceAndBinaryDir
ARGS
-S "${CMakeGUITest_BINARY_DIR}/sourceBinaryArgs-sourceAndBinaryDir/src"
-B "${CMakeGUITest_BINARY_DIR}/sourceBinaryArgs-sourceAndBinaryDir/build"
)
run_cmake_gui_test(sourceBinaryArgs:sourceAndBinaryDirRelative
ARGS
"-Ssrc"
"-Bbuild"
)
run_cmake_gui_test(sourceBinaryArgs:sourceDir
ARGS
"${CMakeGUITest_BINARY_DIR}/sourceBinaryArgs-sourceDir/src"
)
run_cmake_gui_test(sourceBinaryArgs:binaryDir
DO_CONFIGURE
ARGS
"${CMakeGUITest_BINARY_DIR}/sourceBinaryArgs-binaryDir/build"
)
run_cmake_gui_test(sourceBinaryArgs:noExist
ARGS
"${CMakeGUITest_BINARY_DIR}/sourceBinaryArgs-noExist/noexist"
)
run_cmake_gui_test(sourceBinaryArgs:noExistConfig
ARGS
"${CMakeGUITest_BINARY_DIR}/sourceBinaryArgs-noExistConfig/noexist"
)
run_cmake_gui_test(sourceBinaryArgs:noExistConfigExists
DO_CONFIGURE
ARGS
"${CMakeGUITest_BINARY_DIR}/sourceBinaryArgs-noExistConfigExists/noexist"
)
run_cmake_gui_test(simpleConfigure:success)
run_cmake_gui_test(simpleConfigure:fail)
unset(ENV{ADDED_VARIABLE})
set(ENV{KEPT_VARIABLE} "Kept variable")
set(ENV{CHANGED_VARIABLE} "This variable will be changed")
set(ENV{REMOVED_VARIABLE} "Removed variable")
run_cmake_gui_test(environment)
run_cmake_gui_test(presetArg:preset
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetArg-preset/src/"
"--preset=ninja"
)
run_cmake_gui_test(presetArg:presetBinary
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetArg-presetBinary/src"
-B "${CMakeGUITest_BINARY_DIR}/presetArg-presetBinary/build"
"--preset=ninja"
)
run_cmake_gui_test(presetArg:presetBinaryChange
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetArg-presetBinaryChange/src"
-B "${CMakeGUITest_BINARY_DIR}/presetArg-presetBinaryChange/build"
"--preset=ninja"
)
run_cmake_gui_test(presetArg:noPresetBinaryChange
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetArg-noPresetBinaryChange/src"
-B "${CMakeGUITest_BINARY_DIR}/presetArg-noPresetBinaryChange/build"
)
run_cmake_gui_test(presetArg:presetConfigExists
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetArg-presetConfigExists/src"
"--preset=ninja"
)
run_cmake_gui_test(presetArg:installDir
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetArg-installDir/src/"
"--preset=installDir"
)
run_cmake_gui_test(presetArg:noExist
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetArg-noExist/src"
"--preset=noExist"
)
run_cmake_gui_test(changingPresets)
run_cmake_gui_test(presetApplyOrdering:apply
DO_CONFIGURE
CONFIGURE_ARGS -DRACE_VALUE:STRING=old
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetApplyOrdering-apply/src"
-B "${CMakeGUITest_BINARY_DIR}/presetApplyOrdering-apply/build"
)
run_cmake_gui_test(presetApplyOrdering:replace
DO_CONFIGURE
CONFIGURE_ARGS -DRACE_VALUE:STRING=old
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetApplyOrdering-replace/src"
-B "${CMakeGUITest_BINARY_DIR}/presetApplyOrdering-replace/build"
)
run_cmake_gui_test(presetApplyOrdering:replaceCycle
DO_CONFIGURE
CONFIGURE_ARGS -DRACE_VALUE:STRING=old
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetApplyOrdering-replaceCycle/src"
-B "${CMakeGUITest_BINARY_DIR}/presetApplyOrdering-replaceCycle/build"
)
run_cmake_gui_test(presetApplyStartup:available
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetApplyStartup-available/src"
"--preset=raceA"
)
run_cmake_gui_test(presetApplyStartup:unavailable
ARGS
-S "${CMakeGUITest_BINARY_DIR}/presetApplyStartup-unavailable/src"
"--preset=doesNotExist"
)
if("${CMakeGUITest_GENERATOR}" MATCHES "Make|Ninja|FASTBuild")
run_cmake_gui_test(instrumentation)
set(instrumentation_build_dir
"${CMakeGUITest_BINARY_DIR}/instrumentation/build"
)
include(${CMAKE_CURRENT_LIST_DIR}/instrumentation/check-data-dir.cmake)
endif()