ENH: allow ctest_build to return error and warning counts

This commit is contained in:
Bill Hoffman 2009-01-14 13:01:38 -05:00
parent e92d99d05c
commit 82c3afcf6f
5 changed files with 49 additions and 6 deletions

View File

@ -18,6 +18,7 @@
#include "cmCTest.h" #include "cmCTest.h"
#include "cmCTestGenericHandler.h" #include "cmCTestGenericHandler.h"
#include "cmCTestBuildHandler.h"
#include "cmake.h" #include "cmake.h"
#include "cmGlobalGenerator.h" #include "cmGlobalGenerator.h"
@ -26,6 +27,10 @@
cmCTestBuildCommand::cmCTestBuildCommand() cmCTestBuildCommand::cmCTestBuildCommand()
{ {
this->GlobalGenerator = 0; this->GlobalGenerator = 0;
this->Arguments[ctb_NUMBER_ERRORS] = "NUMBER_ERRORS";
this->Arguments[ctb_NUMBER_WARNINGS] = "NUMBER_WARNINGS";
this->Arguments[ctb_LAST] = 0;
this->Last = ctb_LAST;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -48,7 +53,7 @@ cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
this->SetError("internal CTest error. Cannot instantiate build handler"); this->SetError("internal CTest error. Cannot instantiate build handler");
return 0; return 0;
} }
this->Handler = (cmCTestBuildHandler*)handler;
const char* ctestBuildCommand const char* ctestBuildCommand
= this->Makefile->GetDefinition("CTEST_BUILD_COMMAND"); = this->Makefile->GetDefinition("CTEST_BUILD_COMMAND");
if ( ctestBuildCommand && *ctestBuildCommand ) if ( ctestBuildCommand && *ctestBuildCommand )
@ -132,3 +137,24 @@ cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
} }
bool cmCTestBuildCommand::InitialPass(std::vector<std::string> const& args,
cmExecutionStatus &status)
{
bool ret = cmCTestHandlerCommand::InitialPass(args, status);
if ( this->Values[ctb_NUMBER_ERRORS] && *this->Values[ctb_NUMBER_ERRORS])
{
cmOStringStream str;
str << this->Handler->GetTotalErrors();
this->Makefile->AddDefinition(
this->Values[ctb_NUMBER_ERRORS], str.str().c_str());
}
if ( this->Values[ctb_NUMBER_WARNINGS]
&& *this->Values[ctb_NUMBER_WARNINGS])
{
cmOStringStream str;
str << this->Handler->GetTotalWarnings();
this->Makefile->AddDefinition(
this->Values[ctb_NUMBER_WARNINGS], str.str().c_str());
}
return ret;
}

View File

@ -20,6 +20,7 @@
#include "cmCTestHandlerCommand.h" #include "cmCTestHandlerCommand.h"
class cmGlobalGenerator; class cmGlobalGenerator;
class cmCTestBuildHandler;
/** \class cmCTestBuild /** \class cmCTestBuild
* \brief Run a ctest script * \brief Run a ctest script
@ -56,14 +57,16 @@ public:
{ {
return "Builds the repository."; return "Builds the repository.";
} }
virtual bool InitialPass(std::vector<std::string> const& args,
cmExecutionStatus &status);
/** /**
* More documentation. * More documentation.
*/ */
virtual const char* GetFullDocumentation() virtual const char* GetFullDocumentation()
{ {
return return
" ctest_build([BUILD build_dir] [RETURN_VALUE res])\n" " ctest_build([BUILD build_dir] [RETURN_VALUE res] "
" [NUMBER_ERRORS val] [NUMBER_WARNINGS val])\n"
"Builds the given build directory and stores results in Build.xml."; "Builds the given build directory and stores results in Build.xml.";
} }
@ -72,6 +75,14 @@ public:
cmGlobalGenerator* GlobalGenerator; cmGlobalGenerator* GlobalGenerator;
protected: protected:
cmCTestBuildHandler* Handler;
enum {
ctb_BUILD = ct_LAST,
ctb_NUMBER_ERRORS,
ctb_NUMBER_WARNINGS,
ctb_LAST
};
cmCTestGenericHandler* InitializeHandler(); cmCTestGenericHandler* InitializeHandler();
}; };

View File

@ -475,7 +475,7 @@ int cmCTestBuildHandler::ProcessHandler()
} }
this->GenerateDartBuildOutput( this->GenerateDartBuildOutput(
xofs, this->ErrorsAndWarnings, elapsed_build_time); xofs, this->ErrorsAndWarnings, elapsed_build_time);
return 0; return res;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -724,6 +724,7 @@ int cmCTestBuildHandler::RunMakeCommand(const char* command,
errorwarning.Error = false; errorwarning.Error = false;
this->ErrorsAndWarnings.push_back(errorwarning); this->ErrorsAndWarnings.push_back(errorwarning);
this->TotalWarnings ++; this->TotalWarnings ++;
return *retVal; // return the program return value
} }
} }
} }
@ -734,11 +735,13 @@ int cmCTestBuildHandler::RunMakeCommand(const char* command,
*retVal = cmsysProcess_GetExitException(cp); *retVal = cmsysProcess_GetExitException(cp);
cmCTestLog(this->CTest, WARNING, "There was an exception: " << *retVal cmCTestLog(this->CTest, WARNING, "There was an exception: " << *retVal
<< std::endl); << std::endl);
return *retVal;
} }
} }
else if(result == cmsysProcess_State_Expired) else if(result == cmsysProcess_State_Expired)
{ {
cmCTestLog(this->CTest, WARNING, "There was a timeout" << std::endl); cmCTestLog(this->CTest, WARNING, "There was a timeout" << std::endl);
return -1;
} }
else if(result == cmsysProcess_State_Error) else if(result == cmsysProcess_State_Error)
{ {
@ -754,11 +757,12 @@ int cmCTestBuildHandler::RunMakeCommand(const char* command,
this->TotalErrors ++; this->TotalErrors ++;
cmCTestLog(this->CTest, ERROR_MESSAGE, "There was an error: " cmCTestLog(this->CTest, ERROR_MESSAGE, "There was an error: "
<< cmsysProcess_GetErrorString(cp) << std::endl); << cmsysProcess_GetErrorString(cp) << std::endl);
return -1;
} }
cmsysProcess_Delete(cp); cmsysProcess_Delete(cp);
return result; return 0;
} }
//###################################################################### //######################################################################

View File

@ -49,6 +49,8 @@ public:
*/ */
virtual void Initialize(); virtual void Initialize();
int GetTotalErrors() { return this->TotalErrors;}
int GetTotalWarnings() { return this->TotalWarnings;}
private: private:
//! Run command specialized for make and configure. Returns process status //! Run command specialized for make and configure. Returns process status
// and retVal is return value or exception. // and retVal is return value or exception.

View File

@ -213,7 +213,7 @@ bool cmProcess::IsRunning()
cmsysProcess_WaitForExit(this->Process, 0); cmsysProcess_WaitForExit(this->Process, 0);
this->ExitValue = cmsysProcess_GetExitValue(this->Process); this->ExitValue = cmsysProcess_GetExitValue(this->Process);
this->TotalTime = cmSystemTools::GetTime() - this->StartTime; this->TotalTime = cmSystemTools::GetTime() - this->StartTime;
// std::cerr << "Time to run: " << this->TotalTime << "\n"; std::cerr << "Time to run: " << this->TotalTime << "\n";
return false; return false;
} }