ENH: More commands. Start working on new style ctest configuration

This commit is contained in:
Andy Cedilnik 2005-05-02 14:15:29 -04:00
parent 572d9f1147
commit f1ebfb24c6
11 changed files with 358 additions and 19 deletions

6
CTestConfig.cmake Normal file
View File

@ -0,0 +1,6 @@
SET (CTEST_NIGHTLY_START_TIME "21:00:00 EDT")
SET (CTEST_DROP_SITE "public.kitware.com")
SET (CTEST_DROP_LOCATION "/cgi-bin/HTTPUploadDartFile.cgi")
SET (CTEST_TRIGGER_SITE
"http://${DROP_SITE}/cgi-bin/Submit-CMake-TestingResults.cgi")

View File

@ -151,20 +151,22 @@ INCLUDE_DIRECTORIES(
# Sources for CTestLib
#
SET(CMTEST_SRCS cmCTest.cxx
CTest/cmCTestGenericHandler.cxx
CTest/cmCTestBuildCommand.cxx
CTest/cmCTestBuildHandler.cxx
CTest/cmCTestConfigureCommand.cxx
CTest/cmCTestConfigureHandler.cxx
CTest/cmCTestCoverageHandler.cxx
CTest/cmCTestScriptHandler.cxx
CTest/cmCTestTestHandler.cxx
CTest/cmCTestUpdateHandler.cxx
CTest/cmCTestEmptyBinaryDirectoryCommand.cxx
CTest/cmCTestGenericHandler.cxx
CTest/cmCTestMemCheckHandler.cxx
CTest/cmCTestRunScriptCommand.cxx
CTest/cmCTestScriptHandler.cxx
CTest/cmCTestSleepCommand.cxx
CTest/cmCTestStartCommand.cxx
CTest/cmCTestUpdateCommand.cxx
CTest/cmCTestMemCheckHandler.cxx
CTest/cmCTestSubmit.cxx
CTest/cmCTestTestHandler.cxx
CTest/cmCTestUpdateCommand.cxx
CTest/cmCTestUpdateHandler.cxx
)
# Build CTestLib

View File

@ -0,0 +1,48 @@
/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#include "cmCTestBuildCommand.h"
#include "cmCTest.h"
#include "cmCTestGenericHandler.h"
bool cmCTestBuildCommand::InitialPass(
std::vector<std::string> const& args)
{
if (args.size() != 2)
{
this->SetError("called with incorrect number of arguments");
return false;
}
const char* build_dir = args[0].c_str();
const char* res_var = args[1].c_str();
m_CTest->SetDartConfiguration("BuildDirectory", build_dir);
cmCTestGenericHandler* handler = m_CTest->GetHandler("build");
if ( !handler )
{
this->SetError("internal CTest error. Cannot instantiate build handler");
return false;
}
int res = handler->ProcessHandler();
cmOStringStream str;
str << res;
m_Makefile->AddDefinition(res_var, str.str().c_str());
return true;
}

View File

@ -0,0 +1,77 @@
/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef cmCTestBuildCommand_h
#define cmCTestBuildCommand_h
#include "cmCTestCommand.h"
/** \class cmCTestBuild
* \brief Run a ctest script
*
* cmCTestBuildCommand defineds the command to build the project.
*/
class cmCTestBuildCommand : public cmCTestCommand
{
public:
cmCTestBuildCommand() {}
/**
* This is a virtual constructor for the command.
*/
virtual cmCommand* Clone()
{
cmCTestBuildCommand* ni = new cmCTestBuildCommand;
ni->m_CTest = this->m_CTest;
ni->m_CTestScriptHandler = this->m_CTestScriptHandler;
return ni;
}
/**
* This is called when the command is first encountered in
* the CMakeLists.txt file.
*/
virtual bool InitialPass(std::vector<std::string> const& args);
/**
* The name of the command as specified in CMakeList.txt.
*/
virtual const char* GetName() { return "CTEST_BUILD";}
/**
* Succinct documentation.
*/
virtual const char* GetTerseDocumentation()
{
return "Builds the repository.";
}
/**
* More documentation.
*/
virtual const char* GetFullDocumentation()
{
return
" CTEST_BUILD(build_dir res)\n"
"Builds the given build directory and stores results in Build.xml.";
}
cmTypeMacro(cmCTestBuildCommand, cmCTestCommand);
};
#endif

View File

@ -0,0 +1,50 @@
/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#include "cmCTestConfigureCommand.h"
#include "cmCTest.h"
#include "cmCTestGenericHandler.h"
bool cmCTestConfigureCommand::InitialPass(
std::vector<std::string> const& args)
{
if (args.size() != 2)
{
this->SetError("called with incorrect number of arguments");
return false;
}
const char* build_dir = args[0].c_str();
const char* res_var = args[1].c_str();
m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "ConfigureCommand", "CTEST_CONFIGURE_COMMAND");
m_CTest->SetDartConfiguration("BuildDirectory", build_dir);
cmCTestGenericHandler* handler = m_CTest->GetHandler("configure");
if ( !handler )
{
this->SetError("internal CTest error. Cannot instantiate configure handler");
return false;
}
int res = handler->ProcessHandler();
cmOStringStream str;
str << res;
m_Makefile->AddDefinition(res_var, str.str().c_str());
return true;
}

View File

@ -0,0 +1,79 @@
/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef cmCTestConfigureCommand_h
#define cmCTestConfigureCommand_h
#include "cmCTestCommand.h"
/** \class cmCTestConfigure
* \brief Run a ctest script
*
* cmCTestConfigureCommand defineds the command to configures the project.
*/
class cmCTestConfigureCommand : public cmCTestCommand
{
public:
cmCTestConfigureCommand() {}
/**
* This is a virtual constructor for the command.
*/
virtual cmCommand* Clone()
{
cmCTestConfigureCommand* ni = new cmCTestConfigureCommand;
ni->m_CTest = this->m_CTest;
ni->m_CTestScriptHandler = this->m_CTestScriptHandler;
return ni;
}
/**
* This is called when the command is first encountered in
* the CMakeLists.txt file.
*/
virtual bool InitialPass(std::vector<std::string> const& args);
/**
* The name of the command as specified in CMakeList.txt.
*/
virtual const char* GetName() { return "CTEST_CONFIGURE";}
/**
* Succinct documentation.
*/
virtual const char* GetTerseDocumentation()
{
return "Configures the repository.";
}
/**
* More documentation.
*/
virtual const char* GetFullDocumentation()
{
return
" CTEST_CONFIGURE(build_dir res)\n"
"Configures the given build directory and stores results in Configure.xml. The "
"second argument is a variable that will hold return value.";
}
cmTypeMacro(cmCTestConfigureCommand, cmCTestCommand);
};
#endif

View File

@ -42,6 +42,8 @@
# include <unistd.h>
#endif
#include "cmCTestBuildCommand.h"
#include "cmCTestConfigureCommand.h"
#include "cmCTestEmptyBinaryDirectoryCommand.h"
#include "cmCTestRunScriptCommand.h"
#include "cmCTestSleepCommand.h"
@ -220,8 +222,10 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg)
// add any ctest specific commands, probably should have common superclass
// for ctest commands to clean this up. If a couple more commands are
// created with the same format lets do that - ken
this->AddCTestCommand(new cmCTestRunScriptCommand);
this->AddCTestCommand(new cmCTestBuildCommand);
this->AddCTestCommand(new cmCTestConfigureCommand);
this->AddCTestCommand(new cmCTestEmptyBinaryDirectoryCommand);
this->AddCTestCommand(new cmCTestRunScriptCommand);
this->AddCTestCommand(new cmCTestSleepCommand);
this->AddCTestCommand(new cmCTestStartCommand);
this->AddCTestCommand(new cmCTestUpdateCommand);
@ -372,6 +376,7 @@ int cmCTestScriptHandler::RunConfigurationScript(const std::string& total_script
return result;
}
//----------------------------------------------------------------------
int cmCTestScriptHandler::RunCurrentScript()
{
int result;

View File

@ -17,6 +17,8 @@
#include "cmCTestStartCommand.h"
#include "cmCTest.h"
#include "cmLocalGenerator.h"
#include "cmGlobalGenerator.h"
bool cmCTestStartCommand::InitialPass(
std::vector<std::string> const& args)
@ -65,6 +67,27 @@ bool cmCTestStartCommand::InitialPass(
std::cout << "Run dashboard with model " << smodel
<< " for src dir: " << src_dir << " and binary dir: " << bld_dir << std::endl;
std::string fname = src_dir;
fname += "/CTestConfig.cmake";
cmSystemTools::ConvertToUnixSlashes(fname);
if ( cmSystemTools::FileExists(fname.c_str()) )
{
std::cout << " Reading ctest configuration file: " << fname.c_str() << std::endl;
bool readit = m_Makefile->ReadListFile(m_Makefile->GetCurrentListFile(),
fname.c_str() );
if(!readit)
{
std::string m = "Could not find include file: ";
m += fname;
this->SetError(m.c_str());
return false;
}
}
m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "NightlyStartTime", "CTEST_NIGHTLY_START_TIME");
m_CTest->SetDartConfiguration("SourceDirectory", src_dir);
m_CTest->SetDartConfiguration("BuildDirectory", bld_dir);
int model = m_CTest->GetTestModelFromString(smodel);
m_CTest->SetTestModel(model);
m_CTest->SetProduceXML(true);

View File

@ -31,6 +31,9 @@ bool cmCTestUpdateCommand::InitialPass(
const char* source_dir = args[0].c_str();
const char* res_var = args[1].c_str();
m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "CVSCommand", "CTEST_CVS_COMMAND");
m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "SVNCommand", "CTEST_SVN_COMMAND");
cmCTestGenericHandler* handler = m_CTest->GetHandler("update");
if ( !handler )
{

View File

@ -227,6 +227,7 @@ cmCTest::cmCTest()
m_BuildNoClean = false;
m_BuildTwoConfig = false;
m_Verbose = false;
m_ExtraVerbose = false;
m_ProduceXML = false;
m_ShowOnly = false;
m_RunConfigurationScript = false;
@ -343,7 +344,7 @@ int cmCTest::Initialize(const char* binary_dir)
if ( m_TestModel == cmCTest::NIGHTLY )
{
lctime = cmCTest::GetNightlyTime(m_DartConfiguration["NightlyStartTime"],
m_Verbose,
m_ExtraVerbose,
m_TomorrowTag);
}
char datestring[100];
@ -627,7 +628,7 @@ int cmCTest::SubmitResults()
std::cout << "Submit files (using " << m_DartConfiguration["DropMethod"] << ")"
<< std::endl;
cmCTestSubmit submit;
submit.SetVerbose(m_Verbose);
submit.SetVerbose(m_ExtraVerbose);
submit.SetLogFile(&ofs);
if ( m_DartConfiguration["DropMethod"] == "" ||
m_DartConfiguration["DropMethod"] == "ftp" )
@ -1048,7 +1049,7 @@ int cmCTest::RunTest(std::vector<const char*> argv,
}
cmSystemTools::ChangeDirectory(oldpath.c_str());
if(m_Verbose)
if(m_ExtraVerbose)
{
std::cout << "Internal cmCTest object used to run test.\n";
std::cout << *output << "\n";
@ -1079,7 +1080,7 @@ int cmCTest::RunTest(std::vector<const char*> argv,
{
tempOutput.insert(tempOutput.end(), data, data+length);
}
if ( m_Verbose )
if ( m_ExtraVerbose )
{
std::cout.write(data, length);
std::cout.flush();
@ -1096,7 +1097,7 @@ int cmCTest::RunTest(std::vector<const char*> argv,
{
output->append(&*tempOutput.begin(), tempOutput.size());
}
if ( m_Verbose )
if ( m_ExtraVerbose )
{
std::cout << "-- Process completed" << std::endl;
}
@ -1113,7 +1114,7 @@ int cmCTest::RunTest(std::vector<const char*> argv,
std::string outerr = "\n*** Exception executing: ";
outerr += cmsysProcess_GetExceptionString(cp);
*output += outerr;
if ( m_Verbose )
if ( m_ExtraVerbose )
{
std::cout << outerr.c_str() << "\n";
std::cout.flush();
@ -1124,7 +1125,7 @@ int cmCTest::RunTest(std::vector<const char*> argv,
std::string outerr = "\n*** ERROR executing: ";
outerr += cmsysProcess_GetErrorString(cp);
*output += outerr;
if ( m_Verbose )
if ( m_ExtraVerbose )
{
std::cout << outerr.c_str() << "\n";
std::cout.flush();
@ -1246,11 +1247,11 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output)
if( arg.find("-V",0) == 0 || arg.find("--verbose",0) == 0 )
{
this->m_Verbose = true;
cmCTest::t_TestingHandlers::iterator it;
for ( it = m_TestingHandlers.begin(); it != m_TestingHandlers.end(); ++ it )
{
it->second->SetVerbose(this->m_Verbose);
}
}
if( arg.find("-VV",0) == 0 || arg.find("--extra-verbose",0) == 0 )
{
this->m_ExtraVerbose = true;
this->m_Verbose = true;
}
if( arg.find("-N",0) == 0 || arg.find("--show-only",0) == 0 )
@ -1670,10 +1671,22 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output)
// call process directory
if (this->m_RunConfigurationScript)
{
cmCTest::t_TestingHandlers::iterator it;
for ( it = m_TestingHandlers.begin(); it != m_TestingHandlers.end(); ++ it )
{
it->second->SetVerbose(this->m_ExtraVerbose);
}
this->GetHandler("script")->SetVerbose(m_Verbose);
res = this->GetHandler("script")->ProcessHandler();
}
else
{
m_Verbose = m_ExtraVerbose;
cmCTest::t_TestingHandlers::iterator it;
for ( it = m_TestingHandlers.begin(); it != m_TestingHandlers.end(); ++ it )
{
it->second->SetVerbose(this->m_Verbose);
}
if ( !this->Initialize(cmSystemTools::GetCurrentWorkingDirectory().c_str()) )
{
res = 12;
@ -2200,6 +2213,20 @@ std::string cmCTest::GetDartConfiguration(const char *name)
return m_DartConfiguration[name];
}
void cmCTest::SetDartConfiguration(const char *name, const char* value)
{
if ( !name )
{
return;
}
if ( !value )
{
m_DartConfiguration.erase(name);
return;
}
m_DartConfiguration[name] = value;
}
std::string cmCTest::GetCurrentTag()
{
@ -2230,3 +2257,15 @@ bool cmCTest::GetProduceXML()
{
return m_ProduceXML;
}
bool cmCTest::SetDartConfigurationFromCMakeVariable(cmMakefile* mf, const char* dconfig, const char* cmake_var)
{
const char* ctvar;
ctvar = mf->GetDefinition(cmake_var);
if ( !ctvar )
{
return false;
}
this->SetDartConfiguration(dconfig, ctvar);
return true;
}

View File

@ -101,6 +101,7 @@ public:
static int GetTestModelFromString(const char* str);
static std::string CleanString(const std::string& str);
std::string GetDartConfiguration(const char *name);
void SetDartConfiguration(const char *name, const char* value);
/**
* constructor and destructor
@ -192,9 +193,15 @@ public:
*/
cmCTestGenericHandler* GetHandler(const char* handler);
/*
* Set the CTest variable from CMake variable
*/
bool SetDartConfigurationFromCMakeVariable(cmMakefile* mf, const char* dconfig, const char* cmake_var);
private:
std::string m_ConfigType;
bool m_Verbose;
bool m_ExtraVerbose;
bool m_ProduceXML;
bool m_ForceNewCTestProcess;