From 04f0a634a5e8ebec379e7d59334181ab2c3bc854 Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Tue, 14 Jun 2005 14:00:45 -0400 Subject: ENH: Add commands for memory checking and coverage --- Source/CMakeLists.txt | 4 +- Source/CTest/cmCTestCoverageCommand.cxx | 94 +++++++++++++++++++++++++++++++++ Source/CTest/cmCTestCoverageCommand.h | 80 ++++++++++++++++++++++++++++ Source/CTest/cmCTestMemCheckCommand.cxx | 94 +++++++++++++++++++++++++++++++++ Source/CTest/cmCTestMemCheckCommand.h | 81 ++++++++++++++++++++++++++++ Source/CTest/cmCTestScriptHandler.cxx | 8 ++- 6 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 Source/CTest/cmCTestCoverageCommand.cxx create mode 100644 Source/CTest/cmCTestCoverageCommand.h create mode 100644 Source/CTest/cmCTestMemCheckCommand.cxx create mode 100644 Source/CTest/cmCTestMemCheckCommand.h diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index b5d41d2..d0c874c 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -203,14 +203,16 @@ INCLUDE_DIRECTORIES( # Sources for CTestLib # SET(CMTEST_SRCS cmCTest.cxx + CTest/cmCTestBuildAndTestHandler.cxx CTest/cmCTestBuildCommand.cxx CTest/cmCTestBuildHandler.cxx - CTest/cmCTestBuildAndTestHandler.cxx CTest/cmCTestConfigureCommand.cxx CTest/cmCTestConfigureHandler.cxx + CTest/cmCTestCoverageCommand.cxx CTest/cmCTestCoverageHandler.cxx CTest/cmCTestEmptyBinaryDirectoryCommand.cxx CTest/cmCTestGenericHandler.cxx + CTest/cmCTestMemCheckCommand.cxx CTest/cmCTestMemCheckHandler.cxx CTest/cmCTestRunScriptCommand.cxx CTest/cmCTestScriptHandler.cxx diff --git a/Source/CTest/cmCTestCoverageCommand.cxx b/Source/CTest/cmCTestCoverageCommand.cxx new file mode 100644 index 0000000..72e42ff --- /dev/null +++ b/Source/CTest/cmCTestCoverageCommand.cxx @@ -0,0 +1,94 @@ +/*========================================================================= + + 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 "cmCTestCoverageCommand.h" + +#include "cmCTest.h" +#include "cmCTestGenericHandler.h" + +bool cmCTestCoverageCommand::InitialPass( + std::vector const& args) +{ + const char* build_dir = 0; + const char* res_var = 0; + + bool havereturn_variable = false; + bool havesource = false; + for(size_t i=0; i < args.size(); ++i) + { + if ( havereturn_variable ) + { + res_var = args[i].c_str(); + havereturn_variable = false; + } + else if ( havesource ) + { + build_dir = args[i].c_str(); + havesource = false; + } + else if(args[i] == "RETURN_VALUE") + { + if ( res_var ) + { + this->SetError("called with incorrect number of arguments. RETURN_VALUE specified twice."); + return false; + } + havereturn_variable = true; + } + else if(args[i] == "BUILD") + { + if ( build_dir ) + { + this->SetError("called with incorrect number of arguments. BUILD specified twice."); + return false; + } + havesource = true; + } + else + { + cmOStringStream str; + str << "called with incorrect number of arguments. Extra argument is: " << args[i].c_str() << "."; + this->SetError(str.str().c_str()); + return false; + } + } + + if ( build_dir ) + { + m_CTest->SetCTestConfiguration("BuildDirectory", build_dir); + } + + cmCTestGenericHandler* handler = m_CTest->GetHandler("coverage"); + if ( !handler ) + { + this->SetError("internal CTest error. Cannot instantiate test handler"); + return false; + } + std::string current_dir = cmSystemTools::GetCurrentWorkingDirectory(); + cmSystemTools::ChangeDirectory(m_CTest->GetCTestConfiguration("BuildDirectory").c_str()); + int res = handler->ProcessHandler(); + if ( res_var ) + { + cmOStringStream str; + str << res; + m_Makefile->AddDefinition(res_var, str.str().c_str()); + } + cmSystemTools::ChangeDirectory(current_dir.c_str()); + return true; +} + + + diff --git a/Source/CTest/cmCTestCoverageCommand.h b/Source/CTest/cmCTestCoverageCommand.h new file mode 100644 index 0000000..ce9948a --- /dev/null +++ b/Source/CTest/cmCTestCoverageCommand.h @@ -0,0 +1,80 @@ +/*========================================================================= + + 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 cmCTestCoverageCommand_h +#define cmCTestCoverageCommand_h + +#include "cmCTestCommand.h" + +/** \class cmCTestCoverage + * \brief Run a ctest script + * + * cmCTestCoverageCommand defineds the command to test the project. + */ +class cmCTestCoverageCommand : public cmCTestCommand +{ +public: + + cmCTestCoverageCommand() {} + + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + cmCTestCoverageCommand* ni = new cmCTestCoverageCommand; + 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 const& args); + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "CTEST_COVERAGE";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Tests the repository."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + " CTEST_COVERAGE([BUILD build_dir] [RETURN_VALUE res])\n" + "Perform the coverage of the given build directory and stores results in " + "Coverage.xml. The second argument is a variable that will hold value."; + } + + cmTypeMacro(cmCTestCoverageCommand, cmCTestCommand); + +}; + + +#endif + diff --git a/Source/CTest/cmCTestMemCheckCommand.cxx b/Source/CTest/cmCTestMemCheckCommand.cxx new file mode 100644 index 0000000..0f05578 --- /dev/null +++ b/Source/CTest/cmCTestMemCheckCommand.cxx @@ -0,0 +1,94 @@ +/*========================================================================= + + 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 "cmCTestMemCheckCommand.h" + +#include "cmCTest.h" +#include "cmCTestGenericHandler.h" + +bool cmCTestMemCheckCommand::InitialPass( + std::vector const& args) +{ + const char* build_dir = 0; + const char* res_var = 0; + + bool havereturn_variable = false; + bool havesource = false; + for(size_t i=0; i < args.size(); ++i) + { + if ( havereturn_variable ) + { + res_var = args[i].c_str(); + havereturn_variable = false; + } + else if ( havesource ) + { + build_dir = args[i].c_str(); + havesource = false; + } + else if(args[i] == "RETURN_VALUE") + { + if ( res_var ) + { + this->SetError("called with incorrect number of arguments. RETURN_VALUE specified twice."); + return false; + } + havereturn_variable = true; + } + else if(args[i] == "BUILD") + { + if ( build_dir ) + { + this->SetError("called with incorrect number of arguments. BUILD specified twice."); + return false; + } + havesource = true; + } + else + { + cmOStringStream str; + str << "called with incorrect number of arguments. Extra argument is: " << args[i].c_str() << "."; + this->SetError(str.str().c_str()); + return false; + } + } + + if ( build_dir ) + { + m_CTest->SetCTestConfiguration("BuildDirectory", build_dir); + } + + cmCTestGenericHandler* handler = m_CTest->GetHandler("memcheck"); + if ( !handler ) + { + this->SetError("internal CTest error. Cannot instantiate test handler"); + return false; + } + std::string current_dir = cmSystemTools::GetCurrentWorkingDirectory(); + cmSystemTools::ChangeDirectory(m_CTest->GetCTestConfiguration("BuildDirectory").c_str()); + int res = handler->ProcessHandler(); + if ( res_var ) + { + cmOStringStream str; + str << res; + m_Makefile->AddDefinition(res_var, str.str().c_str()); + } + cmSystemTools::ChangeDirectory(current_dir.c_str()); + return true; +} + + + diff --git a/Source/CTest/cmCTestMemCheckCommand.h b/Source/CTest/cmCTestMemCheckCommand.h new file mode 100644 index 0000000..72b5095 --- /dev/null +++ b/Source/CTest/cmCTestMemCheckCommand.h @@ -0,0 +1,81 @@ +/*========================================================================= + + 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 cmCTestMemCheckCommand_h +#define cmCTestMemCheckCommand_h + +#include "cmCTestCommand.h" + +/** \class cmCTestMemCheck + * \brief Run a ctest script + * + * cmCTestMemCheckCommand defineds the command to test the project. + */ +class cmCTestMemCheckCommand : public cmCTestCommand +{ +public: + + cmCTestMemCheckCommand() {} + + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + cmCTestMemCheckCommand* ni = new cmCTestMemCheckCommand; + 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 const& args); + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "CTEST_MEMCHECK";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Tests the repository."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + " CTEST_MEMCHECK([BUILD build_dir] [RETURN_VALUE res])\n" + "Performs a memory checking of tests in the given build directory and " + "stores results in MemCheck.xml. The second argument is a variable that " + "will hold value."; + } + + cmTypeMacro(cmCTestMemCheckCommand, cmCTestCommand); + +}; + + +#endif + diff --git a/Source/CTest/cmCTestScriptHandler.cxx b/Source/CTest/cmCTestScriptHandler.cxx index 9c57043..2a408b1 100644 --- a/Source/CTest/cmCTestScriptHandler.cxx +++ b/Source/CTest/cmCTestScriptHandler.cxx @@ -45,13 +45,15 @@ #include "cmCTestBuildCommand.h" #include "cmCTestConfigureCommand.h" +#include "cmCTestCoverageCommand.h" #include "cmCTestEmptyBinaryDirectoryCommand.h" +#include "cmCTestMemCheckCommand.h" #include "cmCTestRunScriptCommand.h" #include "cmCTestSleepCommand.h" #include "cmCTestStartCommand.h" -#include "cmCTestUpdateCommand.h" -#include "cmCTestTestCommand.h" #include "cmCTestSubmitCommand.h" +#include "cmCTestTestCommand.h" +#include "cmCTestUpdateCommand.h" #define CTEST_INITIAL_CMAKE_OUTPUT_FILE_NAME "CTestInitialCMakeOutput.log" @@ -228,7 +230,9 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg) // created with the same format lets do that - ken this->AddCTestCommand(new cmCTestBuildCommand); this->AddCTestCommand(new cmCTestConfigureCommand); + this->AddCTestCommand(new cmCTestCoverageCommand); this->AddCTestCommand(new cmCTestEmptyBinaryDirectoryCommand); + this->AddCTestCommand(new cmCTestMemCheckCommand); this->AddCTestCommand(new cmCTestRunScriptCommand); this->AddCTestCommand(new cmCTestSleepCommand); this->AddCTestCommand(new cmCTestStartCommand); -- cgit v0.12