mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
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
230 lines
7.0 KiB
CMake
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()
|