summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2007-01-30 16:35:17 (GMT)
committerKen Martin <ken.martin@kitware.com>2007-01-30 16:35:17 (GMT)
commit49085f7fedfe467211129205349edaeb9b195a18 (patch)
tree3a5bdc8d6c50059d926e20ca7e1052b269cb3783
parentb32f3b4131294b0d4d8895cecf3bb2df11ff434c (diff)
downloadCMake-49085f7fedfe467211129205349edaeb9b195a18.zip
CMake-49085f7fedfe467211129205349edaeb9b195a18.tar.gz
CMake-49085f7fedfe467211129205349edaeb9b195a18.tar.bz2
BUG: fixes so that --build-and-test will honor timeouts
-rw-r--r--Source/CMakeLists.txt11
-rw-r--r--Source/CTest/cmCTestBuildAndTestHandler.cxx42
-rw-r--r--Source/cmGlobalGenerator.cxx12
-rw-r--r--Source/cmGlobalGenerator.h5
-rw-r--r--Source/ctest.cxx4
5 files changed, 62 insertions, 12 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index ff26382..73676e4 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -383,6 +383,13 @@ IF(BUILD_TESTING)
OPTION(CMAKE_RUN_LONG_TESTS "Should the long tests be run (such as Bootstrap)." ON)
MARK_AS_ADVANCED(CMAKE_RUN_LONG_TESTS)
+ IF (CMAKE_RUN_LONG_TESTS)
+ OPTION(CTEST_TEST_CTEST
+ "Should the tests that run a full sub ctest process be run?"
+ OFF)
+ MARK_AS_ADVANCED(CTEST_TEST_CTEST)
+ ENDIF (CMAKE_RUN_LONG_TESTS)
+
ADD_TEST(CommandLineTest ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/CommandLineTest"
@@ -1071,6 +1078,10 @@ IF(BUILD_TESTING)
-S "${CMake_BINARY_DIR}/Tests/CTestTest3/test.cmake" -V
--output-log "${CMake_BINARY_DIR}/Tests/CTestTest3/testOutput.log"
)
+ # these tests take a log time, make sure they have it
+ SET_TESTS_PROPERTIES ( CTestTest CTestTest2 CTestTest3
+ PROPERTIES TIMEOUT 1500
+ )
ENDIF (CTEST_TEST_CTEST AND CMAKE_RUN_LONG_TESTS)
IF("${CMAKE_TEST_GENERATOR}" MATCHES Xcode)
diff --git a/Source/CTest/cmCTestBuildAndTestHandler.cxx b/Source/CTest/cmCTestBuildAndTestHandler.cxx
index f7b7481..c470299 100644
--- a/Source/CTest/cmCTestBuildAndTestHandler.cxx
+++ b/Source/CTest/cmCTestBuildAndTestHandler.cxx
@@ -161,6 +161,10 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
return 1;
}
+ // we need to honor the timeout specified, the timeout include cmake, build
+ // and test time
+ double clock_start = cmSystemTools::GetTime();
+
// make sure the binary dir is there
std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
out << "Internal cmake changing into directory: "
@@ -178,7 +182,7 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
if(!this->BuildNoCMake)
{
- // do the cmake step
+ // do the cmake step, no timeout here since it is not a sub process
if (this->RunCMake(outstring,out,cmakeOutString,cwd,&cm))
{
return 1;
@@ -194,12 +198,27 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
for ( tarIt = this->BuildTargets.begin(); tarIt != this->BuildTargets.end();
++ tarIt )
{
+ double remainingTime = 0;
+ if (this->Timeout)
+ {
+ remainingTime = this->Timeout - cmSystemTools::GetTime() + clock_start;
+ if (remainingTime <= 0)
+ {
+ if(outstring)
+ {
+ *outstring = "--build-and-test timeout exceeded. ";
+ }
+ return 1;
+ }
+ }
std::string output;
int retVal = cm.GetGlobalGenerator()->Build(
this->SourceDir.c_str(), this->BinaryDir.c_str(),
this->BuildProject.c_str(), tarIt->c_str(),
&output, this->BuildMakeProgram.c_str(),
- this->CTest->GetConfigType().c_str(),!this->BuildNoClean, false);
+ this->CTest->GetConfigType().c_str(),
+ !this->BuildNoClean,
+ false, remainingTime);
out << output;
// if the build failed then return
@@ -361,8 +380,25 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
out << this->TestCommandArgs[k] << " ";
}
out << "\n";
+
+ // how much time is remaining
+ double remainingTime = 0;
+ if (this->Timeout)
+ {
+ remainingTime = this->Timeout - cmSystemTools::GetTime() + clock_start;
+ if (remainingTime <= 0)
+ {
+ if(outstring)
+ {
+ *outstring = "--build-and-test timeout exceeded. ";
+ }
+ return 1;
+ }
+ }
+
int runTestRes = this->CTest->RunTest(testCommand, &outs, &retval, 0,
- this->Timeout);
+ remainingTime);
+
if(runTestRes != cmsysProcess_State_Exited || retval != 0)
{
out << "Failed to run test command: " << testCommand[0] << "\n";
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 62d1b2f..e554de7 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -28,8 +28,6 @@
#include <assert.h>
-int cmGlobalGenerator::s_TryCompileTimeout = 0;
-
cmGlobalGenerator::cmGlobalGenerator()
{
// By default the .SYMBOLIC dependency is not needed on symbolic rules.
@@ -49,6 +47,9 @@ cmGlobalGenerator::cmGlobalGenerator()
// Whether an install target is needed.
this->InstallTargetEnabled = false;
+
+ // how long to let try compiles run
+ this->TryCompileTimeout = 0;
}
cmGlobalGenerator::~cmGlobalGenerator()
@@ -808,7 +809,8 @@ int cmGlobalGenerator::TryCompile(const char *srcdir, const char *bindir,
const char* config = mf->GetDefinition("CMAKE_TRY_COMPILE_CONFIGURATION");
return this->Build(srcdir,bindir,projectName,
newTarget.c_str(),
- output,makeCommand.c_str(),config,false,true);
+ output,makeCommand.c_str(),config,false,true,
+ this->TryCompileTimeout);
}
std::string cmGlobalGenerator
@@ -852,7 +854,8 @@ int cmGlobalGenerator::Build(
std::string *output,
const char *makeCommandCSTR,
const char *config,
- bool clean, bool fast)
+ bool clean, bool fast,
+ double timeout)
{
*output += "\nTesting TryCompileWithoutMakefile\n";
@@ -863,7 +866,6 @@ int cmGlobalGenerator::Build(
cmSystemTools::ChangeDirectory(bindir);
int retVal;
- int timeout = cmGlobalGenerator::s_TryCompileTimeout;
bool hideconsole = cmSystemTools::GetRunCommandHideConsole();
cmSystemTools::SetRunCommandHideConsole(true);
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 90a907e..bccf8fa 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -100,7 +100,8 @@ public:
const char *projectName, const char *targetName,
std::string *output,
const char *makeProgram, const char *config,
- bool clean, bool fast);
+ bool clean, bool fast,
+ double timeout);
virtual std::string GenerateBuildCommand
(const char* makeProgram,
const char *projectName, const char* additionalOptions,
@@ -125,7 +126,7 @@ public:
void AddInstallComponent(const char* component);
void EnableInstallTarget();
- static int s_TryCompileTimeout;
+ int TryCompileTimeout;
bool GetForceUnixPaths() {return this->ForceUnixPaths;}
bool GetToolSupportsColor() { return this->ToolSupportsColor; }
diff --git a/Source/ctest.cxx b/Source/ctest.cxx
index 77d9fee..864ae26 100644
--- a/Source/ctest.cxx
+++ b/Source/ctest.cxx
@@ -148,7 +148,7 @@ static const cmDocumentationEntry cmDocumentationOptions[] =
"complete. Other options that affect this mode are --build-target "
"--build-nocmake, --build-run-dir, "
"--build-two-config, --build-exe-dir, --build-project,"
- "--build-noclean, --build-options, --test-timeout"},
+ "--build-noclean, --build-options"},
{"--build-target", "Specify a specific target to build.",
"This option goes with the --build-and-test option, if left out the all "
"target is built." },
@@ -168,7 +168,7 @@ static const cmDocumentationEntry cmDocumentationOptions[] =
{"--test-command", "The test to run with the --build-and-test option.", ""
},
- {"--test-timeout", "The time limit in seconds for --test-command.", ""
+ {"--test-timeout", "The time limit in seconds, internal use only.", ""
},
{"--tomorrow-tag", "Nightly or experimental starts with next day tag.",
"This is useful if the build will not finish in one day." },