cmCTestScriptHandler: Add new field ShouldRunCurrentScript

This is to avoid scope issues with CTEST_RUN_CURRENT_SCRIPT. If
ctest_start() is called within a function scope, the value of
CTEST_RUN_CURRENT_SCRIPT that it sets doesn't make it to the global
scope. With this change, ctest_start() no longer sets
CTEST_RUN_CURRENT_SCRIPT, and instead sets a field directly in
cmCTestScriptHandler. The old behavior of CTEST_RUN_CURRENT_SCRIPT
has also been kept for projects and tests that rely on setting it.
This commit is contained in:
Kyle Edwards 2018-01-25 14:04:12 -05:00
parent 7c30a3a3c3
commit 74092d92bf
8 changed files with 36 additions and 4 deletions

View File

@ -343,6 +343,7 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg)
this->Makefile->AddDefinition("CMAKE_EXECUTABLE_NAME",
cmSystemTools::GetCMakeCommand().c_str());
this->Makefile->AddDefinition("CTEST_RUN_CURRENT_SCRIPT", true);
this->SetRunCurrentScript(true);
this->UpdateElapsedTime();
// add the script arg if defined
@ -524,7 +525,8 @@ int cmCTestScriptHandler::RunConfigurationScript(
}
// only run the curent script if we should
if (this->Makefile && this->Makefile->IsOn("CTEST_RUN_CURRENT_SCRIPT")) {
if (this->Makefile && this->Makefile->IsOn("CTEST_RUN_CURRENT_SCRIPT") &&
this->ShouldRunCurrentScript) {
return this->RunCurrentScript();
}
return result;
@ -535,7 +537,7 @@ int cmCTestScriptHandler::RunCurrentScript()
int result;
// do not run twice
this->Makefile->AddDefinition("CTEST_RUN_CURRENT_SCRIPT", false);
this->SetRunCurrentScript(false);
// no popup widows
cmSystemTools::SetRunCommandHideConsole(true);
@ -978,3 +980,8 @@ std::chrono::duration<double> cmCTestScriptHandler::GetRemainingTimeAllowed()
std::chrono::steady_clock::now() - this->ScriptStartTime);
return (timelimit - duration);
}
void cmCTestScriptHandler::SetRunCurrentScript(bool value)
{
this->ShouldRunCurrentScript = value;
}

View File

@ -106,6 +106,8 @@ public:
void CreateCMake();
cmake* GetCMake() { return this->CMake; }
void SetRunCurrentScript(bool value);
private:
// reads in a script
int ReadInScript(const std::string& total_script_arg);
@ -136,6 +138,8 @@ private:
std::vector<std::string> ConfigurationScripts;
std::vector<bool> ScriptProcessScope;
bool ShouldRunCurrentScript;
bool Backup;
bool EmptyBinDir;
bool EmptyBinDirOnce;

View File

@ -126,7 +126,7 @@ bool cmCTestStartCommand::InitialPass(std::vector<std::string> const& args,
return false;
}
this->Makefile->AddDefinition("CTEST_RUN_CURRENT_SCRIPT", "OFF");
this->CTest->SetRunCurrentScript(false);
this->CTest->SetSuppressUpdatingCTestConfiguration(true);
int model = this->CTest->GetTestModelFromString(smodel);
this->CTest->SetTestModel(model);

View File

@ -2805,6 +2805,14 @@ std::chrono::duration<double> cmCTest::MaxDuration()
return std::chrono::duration<double>(1.0e7);
}
void cmCTest::SetRunCurrentScript(bool value)
{
cmCTestScriptHandler* ch =
static_cast<cmCTestScriptHandler*>(this->GetHandler("script"));
ch->SetRunCurrentScript(value);
}
void cmCTest::OutputTestErrors(std::vector<char> const& process_output)
{
std::string test_outputs("\n*** Test Failed:\n");

View File

@ -462,6 +462,8 @@ public:
void GenerateSubprojectsOutput(cmXMLWriter& xml);
std::vector<std::string> GetLabelsForSubprojects();
void SetRunCurrentScript(bool value);
private:
int RepeatTests;
bool RepeatUntilFail;

View File

@ -0,0 +1 @@
^$

View File

@ -11,6 +11,8 @@ run_ctest_start(StartQuiet Experimental QUIET)
run_ctest_start(ConfigInSource Experimental)
run_ctest_start(FunctionScope Experimental QUIET)
function(run_ConfigInBuild)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ConfigInBuild-build)
set(RunCMake_TEST_NO_CLEAN 1)

View File

@ -9,5 +9,13 @@ set(CTEST_CMAKE_GENERATOR_PLATFORM "@RunCMake_GENERATOR_PLATFORM@")
set(CTEST_CMAKE_GENERATOR_TOOLSET "@RunCMake_GENERATOR_TOOLSET@")
set(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}")
function(setup_tests)
ctest_start(${ctest_start_args})
endfunction()
set(ctest_start_args "@CASE_CTEST_START_ARGS@")
ctest_start(${ctest_start_args})
if("@CASE_NAME@" STREQUAL "FunctionScope")
setup_tests()
else()
ctest_start(${ctest_start_args})
endif()