/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include "cmsys/RegularExpression.hxx" class cmXMLElement; /** \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(); cmCTestLaunch(const cmCTestLaunch&) = delete; cmCTestLaunch& operator=(const cmCTestLaunch&) = delete; // 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; std::string OptionFilterPrefix; 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); bool MatchesFilterPrefix(std::string const& line) const; // Methods to generate the xml fragment. void WriteXML(); void WriteXMLAction(cmXMLElement&); void WriteXMLCommand(cmXMLElement&); void WriteXMLResult(cmXMLElement&); void WriteXMLLabels(cmXMLElement&); void DumpFileToXML(cmXMLElement&, const char* tag, std::string const& fname); // Configuration void LoadConfig(); std::string SourceDir; };