summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2003-12-17 13:36:10 (GMT)
committerKen Martin <ken.martin@kitware.com>2003-12-17 13:36:10 (GMT)
commit076e52a26a02bf5bdc30c7f358d3ad99b2e24483 (patch)
tree8f4af864b4b433344c1fdbee2ce44d897c8b1948 /Source
parent92bcdb8d66de337fc2bb21b82ae4487ef29919d2 (diff)
downloadCMake-076e52a26a02bf5bdc30c7f358d3ad99b2e24483.zip
CMake-076e52a26a02bf5bdc30c7f358d3ad99b2e24483.tar.gz
CMake-076e52a26a02bf5bdc30c7f358d3ad99b2e24483.tar.bz2
better ctest driver and return codes
Diffstat (limited to 'Source')
-rw-r--r--Source/cmCTest.cxx110
1 files changed, 71 insertions, 39 deletions
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 61a318d..16aee70 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -36,6 +36,13 @@
#define SAFEDIV(x,y) (((y)!=0)?((x)/(y)):(0))
+// provide some more detailed info on the return code for ctest
+#define CTEST_UPDATE_ERRORS 0x01
+#define CTEST_CONFIGURE_ERRORS 0x02
+#define CTEST_BUILD_ERRORS 0x04
+#define CTEST_TEST_ERRORS 0x08
+#define CTEST_MEMORY_ERRORS 0x10
+
static struct tm* GetNightlyTime(std::string str)
{
struct tm* lctime;
@@ -2382,7 +2389,7 @@ int cmCTest::ProcessTests()
update_count = this->UpdateDirectory();
if ( update_count < 0 )
{
- res += 1;
+ res |= CTEST_UPDATE_ERRORS;
}
}
if ( m_TestModel == cmCTest::CONTINUOUS && !update_count )
@@ -2391,15 +2398,24 @@ int cmCTest::ProcessTests()
}
if ( m_Tests[CONFIGURE_TEST] || m_Tests[ALL_TEST] )
{
- res += this->ConfigureDirectory();
+ if (this->ConfigureDirectory())
+ {
+ res |= CTEST_CONFIGURE_ERRORS;
+ }
}
if ( m_Tests[BUILD_TEST] || m_Tests[ALL_TEST] )
{
- res += this->BuildDirectory();
+ if (this->BuildDirectory())
+ {
+ res |= CTEST_BUILD_ERRORS;
+ }
}
if ( m_Tests[TEST_TEST] || m_Tests[ALL_TEST] || notest )
{
- res += this->TestDirectory(false);
+ if (this->TestDirectory(false))
+ {
+ res |= CTEST_TEST_ERRORS;
+ }
}
if ( m_Tests[COVERAGE_TEST] || m_Tests[ALL_TEST] )
{
@@ -2407,7 +2423,10 @@ int cmCTest::ProcessTests()
}
if ( m_Tests[MEMCHECK_TEST] || m_Tests[ALL_TEST] )
{
- res += this->TestDirectory(true);
+ if (this->TestDirectory(true))
+ {
+ res |= CTEST_MEMORY_ERRORS;
+ }
}
if ( m_Tests[SUBMIT_TEST] || m_Tests[ALL_TEST] )
{
@@ -2759,36 +2778,6 @@ const char* cmCTest::GetTestStatus(int status)
}
-void cmCTestRemoveDirectory(const char *binDir)
-{
- cmsys::Directory dir;
- dir.Load(binDir);
- size_t fileNum;
- for (fileNum = 0; fileNum < dir.GetNumberOfFiles(); ++fileNum)
- {
- if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)),".") &&
- strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)),".."))
- {
- std::string fullPath = binDir;
- fullPath += "/";
- fullPath += dir.GetFile(static_cast<unsigned long>(fileNum));
- if(cmSystemTools::FileIsDirectory(fullPath.c_str()))
- {
- cmCTestRemoveDirectory(fullPath.c_str());
- }
- else
- {
- if(!cmSystemTools::RemoveFile(fullPath.c_str()))
- {
- std::string m = "Remove failed on file: ";
- m += fullPath;
- cmSystemTools::ReportLastSystemError(m.c_str());
- }
- }
- }
- }
-}
-
int cmCTest::RunConfigurationScript()
{
m_ConfigurationScript =
@@ -2830,7 +2819,8 @@ int cmCTest::RunConfigurationScript()
const char *binDir = mf->GetDefinition("CTEST_BINARY_DIRECTORY");
const char *ctestCmd = mf->GetDefinition("CTEST_COMMAND");
const char *ctestEnv = mf->GetDefinition("CTEST_ENVIRONMENT");
-
+ bool backup = mf->IsOn("CTEST_BACKUP_AND_RESTORE");
+
// make sure the required info is here
if (!srcDir || !binDir || !ctestCmd)
{
@@ -2865,7 +2855,31 @@ int cmCTest::RunConfigurationScript()
putenv(ctestEnvStatic[i]);
}
}
+
+ // compute the backup names
+ std::string backupSrcDir = srcDir;
+ backupSrcDir += "_CMakeBackup";
+ std::string backupBinDir = binDir;
+ backupBinDir += "_CMakeBackup";
+
+ // backup the binary and src directories if requested
+ if (backup)
+ {
+ // if for some reason those directories exist then first delete them
+ if (cmSystemTools::FileExists(backupSrcDir.c_str()))
+ {
+ cmSystemTools::RemoveADirectory(backupSrcDir.c_str());
+ }
+ if (cmSystemTools::FileExists(backupBinDir.c_str()))
+ {
+ cmSystemTools::RemoveADirectory(backupBinDir.c_str());
+ }
+ // first rename the src and binary directories
+ rename(srcDir, backupSrcDir.c_str());
+ rename(binDir, backupBinDir.c_str());
+ }
+
// clear the binary directory?
if (mf->IsOn("CTEST_START_WITH_EMPTY_BINARY_DIRECTORY"))
{
@@ -2874,7 +2888,7 @@ int cmCTest::RunConfigurationScript()
check += "/CMakeCache.txt";
if (cmSystemTools::FileExists(check.c_str()))
{
- cmCTestRemoveDirectory(binDir);
+ cmSystemTools::RemoveADirectory(binDir);
}
}
@@ -2977,9 +2991,27 @@ int cmCTest::RunConfigurationScript()
&retVal, binDir,
m_Verbose, 0 /*m_TimeOut*/);
- // the main ctest return values need to be fixed
- if (!res /* || retVal != 0 */)
+ // did something critical fail in ctest
+ if (!res ||
+ retVal | CTEST_BUILD_ERRORS)
{
+ // if we backed up the dirs and the build failed, then restore
+ // the backed up dirs
+ if (backup)
+ {
+ // if for some reason those directories exist then first delete them
+ if (cmSystemTools::FileExists(srcDir))
+ {
+ cmSystemTools::RemoveADirectory(srcDir);
+ }
+ if (cmSystemTools::FileExists(binDir))
+ {
+ cmSystemTools::RemoveADirectory(binDir);
+ }
+ // rename the src and binary directories
+ rename(backupSrcDir.c_str(), srcDir);
+ rename(backupBinDir.c_str(), binDir);
+ }
cmSystemTools::Error("Unable to run ctest");
return -8;
}