/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2000-2009 Kitware, Inc., Insight Software Consortium Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #ifndef cmCTestLaunch_h #define cmCTestLaunch_h #include "cmStandardIncludes.h" #include /** \class cmCTestLaunch * \brief Launcher for make rules to report results for ctest * * This implements the 'ctest --launch' tool. */ class cmCTestLaunch { public: /** Entry point from ctest executable main(). */ static int Main(int argc, const char* const* argv); private: // Initialize the launcher from its command line. cmCTestLaunch(int argc, const char* const* argv); ~cmCTestLaunch(); // Run the real command. int Run(); void RunChild(); // Methods to check the result of the real command. bool IsError() const; bool CheckResults(); // Launcher options specified before the real command. std::string OptionOutput; std::string OptionSource; std::string OptionLanguage; std::string OptionTargetName; std::string OptionTargetType; std::string OptionBuildDir; bool ParseArguments(int argc, const char* const* argv); // The real command line appearing after launcher arguments. int RealArgC; const char* const* RealArgV; std::string CWD; // The real command line after response file expansion. std::vector RealArgs; void HandleRealArg(const char* arg); // A hash of the real command line is unique and unlikely to collide. std::string LogHash; void ComputeFileNames(); bool Passthru; struct cmsysProcess_s* Process; int ExitCode; // Temporary log files for stdout and stderr of real command. std::string LogDir; std::string LogOut; std::string LogErr; bool HaveOut; bool HaveErr; // Labels associated with the build rule. std::set Labels; void LoadLabels(); bool SourceMatches(std::string const& lhs, std::string const& rhs); // Regular expressions to match warnings and their exceptions. bool ScrapeRulesLoaded; std::vector RegexWarning; std::vector RegexWarningSuppress; void LoadScrapeRules(); void LoadScrapeRules(const char* purpose, std::vector& regexps); bool ScrapeLog(std::string const& fname); bool Match(std::string const& line, std::vector& regexps); // Methods to generate the xml fragment. void WriteXML(); void WriteXMLAction(std::ostream& fxml); void WriteXMLCommand(std::ostream& fxml); void WriteXMLResult(std::ostream& fxml); void WriteXMLLabels(std::ostream& fxml); void DumpFileToXML(std::ostream& fxml, std::string const& fname); // Configuration void LoadConfig(); std::string SourceDir; }; #endif