Commit a442f171 authored by Ken Martin's avatar Ken Martin
Browse files

a start on the dashboard driver

parent 81be61b1
......@@ -15,7 +15,11 @@
=========================================================================*/
#include "cmCTest.h"
#include "cmSystemTools.h"
#include "cmake.h"
#include "cmMakefile.h"
#include "cmLocalGenerator.h"
#include "cmGlobalGenerator.h"
#include <cmsys/Directory.hxx>
#include "cmListFileCache.h"
#ifdef HAVE_CURL
......@@ -258,14 +262,15 @@ bool TryExecutable(const char *dir, const char *file,
cmCTest::cmCTest()
{
m_UseIncludeRegExp = false;
m_UseExcludeRegExp = false;
m_UseExcludeRegExpFirst = false;
m_Verbose = false;
m_DartMode = false;
m_ShowOnly = false;
m_TestModel = cmCTest::EXPERIMENTAL;
m_TimeOut = 0;
m_UseIncludeRegExp = false;
m_UseExcludeRegExp = false;
m_UseExcludeRegExpFirst = false;
m_Verbose = false;
m_DartMode = false;
m_ShowOnly = false;
m_RunConfigurationScript = false;
m_TestModel = cmCTest::EXPERIMENTAL;
m_TimeOut = 0;
int cc;
for ( cc=0; cc < cmCTest::LAST_TEST; cc ++ )
{
......@@ -2518,3 +2523,152 @@ const char* cmCTest::GetTestStatus(int status)
}
return statuses[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 =
cmSystemTools::CollapseFullPath(m_ConfigurationScript.c_str());
// make sure the file exists
if (!cmSystemTools::FileExists(m_ConfigurationScript.c_str()))
{
return -1;
}
// create a cmake instance to read the configuration script
cmake cm;
cmGlobalGenerator gg;
gg.SetCMakeInstance(&cm);
// read in the list file to fill the cache
cmLocalGenerator *lg = gg.CreateLocalGenerator();
lg->SetGlobalGenerator(&gg);
if (!lg->GetMakefile()->ReadListFile(0, m_ConfigurationScript.c_str()))
{
return -2;
}
// no popup widows
cmSystemTools::SetRunCommandHideConsole(true);
// get some info that should be set
cmMakefile *mf = lg->GetMakefile();
const char *srcDir = mf->GetDefinition("CTEST_SOURCE_DIRECTORY");
const char *binDir = mf->GetDefinition("CTEST_BINARY_DIRECTORY");
const char *ctestCmd = mf->GetDefinition("CTEST_COMMAND");
// make sure the required info is here
if (!srcDir || !binDir || !ctestCmd)
{
cmSystemTools::Error("Some required settings in the configuration file were missing");
return -3;
}
// clear the binary directory?
if (mf->IsOn("CTEST_START_WITH_EMPTY_BINARY_DIRECTORY"))
{
// try to avoid deleting directories that we shouldn't
std::string check = binDir;
check += "/CMakeCache.txt";
if (cmSystemTools::FileExists(check.c_str()))
{
cmCTestRemoveDirectory(binDir);
}
}
// make sure the binary directory exists
if (!cmSystemTools::FileExists(binDir))
{
if (!cmSystemTools::MakeDirectory(binDir))
{
cmSystemTools::Error("Unable to create the binary directory");
return -4;
}
}
std::string command;
std::string output;
int retVal = 0;
bool res = 0;
// do an initial cvs update on the src dir
const char *cvsCmd = mf->GetDefinition("CTEST_CVS_COMMAND");
if (cvsCmd)
{
command = cvsCmd;
output.empty();
retVal = 0;
res = cmSystemTools::RunSingleCommand(command.c_str(), &output,
&retVal, binDir,
m_Verbose, 0 /*m_TimeOut*/);
}
// put the initial cache into the bin dir
if (mf->GetDefinition("CTEST_INITIAL_CACHE"))
{
// the cache file will always be next to the configuration script
std::string initialCache =
cmSystemTools::GetFilenamePath(m_ConfigurationScript);
initialCache += "/";
initialCache += mf->GetDefinition("CTEST_INITIAL_CACHE");
std::string destCache = binDir;
destCache += "/CMakeCache.txt";
cmSystemTools::CopyFileIfDifferent(initialCache.c_str(),
destCache.c_str());
}
// do an initial cmake to setup the DartConfig file
const char *cmakeCmd = mf->GetDefinition("CTEST_CMAKE_COMMAND");
if (cmakeCmd)
{
command = cmakeCmd;
command += " ";
command += srcDir;
output.empty();
retVal = 0;
res = cmSystemTools::RunSingleCommand(command.c_str(), &output,
&retVal, binDir,
m_Verbose, 0 /*m_TimeOut*/);
}
// run ctest
command = ctestCmd;
output.empty();
retVal = 0;
res = cmSystemTools::RunSingleCommand(command.c_str(), &output,
&retVal, binDir,
m_Verbose, 0 /*m_TimeOut*/);
return 0;
}
......@@ -24,6 +24,11 @@
class cmCTest
{
public:
/**
* Run a dashboard using a specified confiuration script
*/
int RunConfigurationScript();
/**
* Initialize and finalize testing
*/
......@@ -120,6 +125,9 @@ public:
bool m_DartMode;
bool m_ShowOnly;
bool m_RunConfigurationScript;
std::string m_ConfigurationScript;
enum {
EXPERIMENTAL,
NIGHTLY,
......
......@@ -73,6 +73,12 @@ static const cmDocumentationEntry cmDocumentationOptions[] =
"a dashboard test. All tests are ModeTest, where Mode can be Experimental, "
"Nightly, and Continuous, and Test can be Start, Update, Configure, "
"Build, Test, Coverage, and Submit."},
{"-S <ConfigScript>", "Execute a dashboard for a configuration",
"This option tells ctest to load in a configuration script which sets "
"a number of parameters such as the binary and source directories. Then "
"ctest will do what is required to create and run a dashboard. This "
"option basically sets up a dashboard and then runs ctest -D with the "
"appropriate options."},
{0,0,0}
};
......@@ -146,6 +152,12 @@ int main (int argc, char *argv[])
inst.m_ShowOnly = true;
}
if( arg.find("-S",0) == 0 && i < args.size() - 1 )
{
inst.m_RunConfigurationScript = true;
inst.m_ConfigurationScript = args[i+1];
}
if( arg.find("-D",0) == 0 && i < args.size() - 1 )
{
inst.m_DartMode = true;
......@@ -367,10 +379,18 @@ int main (int argc, char *argv[])
}
// call process directory
inst.Initialize();
int res = inst.ProcessTests();
inst.Finalize();
int res;
if (inst.m_RunConfigurationScript)
{
res = inst.RunConfigurationScript();
}
else
{
inst.Initialize();
res = inst.ProcessTests();
inst.Finalize();
}
return res;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment