| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file LICENSE.rst or https://cmake.org/licensing for details. */ |
| #pragma once |
| |
| #include <chrono> |
| #include <cstddef> |
| #include <string> |
| #include <unordered_map> |
| #include <utility> |
| #include <vector> |
| |
| #include <cm/string_view> |
| |
| #include "cmMessenger.h" |
| #include "cmSarif.h" |
| |
| /// @brief Manages SARIF logging for a CMake run |
| /// |
| /// Writes diagnostics collected during a CMake run to a SARIF log file if |
| /// enabled by conditions. |
| class cmCMakeSarifLogger final |
| { |
| public: |
| cmCMakeSarifLogger() = default; |
| ~cmCMakeSarifLogger(); |
| |
| /// @brief Enable SARIF file generation at the given path when the logger is |
| /// destroyed. |
| void SetOutputPath(std::string const& path); |
| |
| /// @brief Add a logical base directory used to emit relative paths. |
| /// |
| /// Artifact locations under a given path will be expressed according to |
| /// the named base directory. If multiple base directories are added to one |
| /// log, they are tested in order. |
| void AddBaseDirectory(cm::string_view name, cm::string_view path); |
| |
| /// @brief Save CMake diagnostic messages to the SARIF log. |
| void RecordDiagnostics(std::vector<cmMessenger::Message> const& messages); |
| |
| /// @brief Save information about the CMake process invocation. |
| void RecordInvocation(int ac, char const* const* av, int exitCode, |
| std::chrono::system_clock::time_point startTime, |
| std::chrono::system_clock::time_point endTime); |
| |
| void GenerateForRun() const; |
| |
| private: |
| bool WriteFile(std::string const& path) const; |
| |
| std::string FilePath; |
| cmSarif::Run CMakeRun; |
| // Index of a diagnostic category appearing in the current run log. |
| std::unordered_map<std::string, std::size_t> RuleIndices; |
| // Maps logical name to actual path for base directories |
| std::vector<std::pair<std::string, std::string>> UriBaseIds; |
| }; |