| /* 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 <istream> |
| #include <mutex> |
| #include <string> |
| #include <unordered_set> |
| #include <vector> |
| |
| #include <cm/string_view> |
| |
| #include <cm3p/json/value.h> |
| |
| #include "cmFileTime.h" |
| #include "cmQtAutoGen.h" |
| |
| /** \class cmQtAutoGenerator |
| * \brief Base class for QtAutoGen generators |
| */ |
| class cmQtAutoGenerator : public cmQtAutoGen |
| { |
| public: |
| // -- Types |
| |
| /** Thread safe logger. */ |
| class Logger |
| { |
| public: |
| // -- Construction |
| Logger(); |
| ~Logger() = default; |
| // -- Verbosity |
| unsigned int Verbosity() const { return this->Verbosity_; } |
| void SetVerbosity(unsigned int value) { this->Verbosity_ = value; } |
| void RaiseVerbosity(unsigned int value); |
| bool Verbose() const { return (this->Verbosity_ != 0); } |
| void SetVerbose(bool value) { this->Verbosity_ = value ? 1 : 0; } |
| // -- Color output |
| bool ColorOutput() const { return this->ColorOutput_; } |
| void SetColorOutput(bool value); |
| // -- Log info |
| void Info(GenT genType, cm::string_view message) const; |
| // -- Log warning |
| void Warning(GenT genType, cm::string_view message) const; |
| // -- Log error |
| void Error(GenT genType, cm::string_view message) const; |
| void ErrorCommand(GenT genType, cm::string_view message, |
| std::vector<std::string> const& command, |
| std::string const& output) const; |
| |
| private: |
| static std::string HeadLine(cm::string_view title); |
| |
| mutable std::mutex Mutex_; |
| unsigned int Verbosity_ = 0; |
| bool ColorOutput_ = false; |
| }; |
| |
| /** Project directories. */ |
| struct ProjectDirsT |
| { |
| std::string Source; |
| std::string Binary; |
| std::string CurrentSource; |
| std::string CurrentBinary; |
| }; |
| |
| // -- File system methods |
| static bool MakeParentDirectory(std::string const& filename); |
| static bool FileRead(std::string& content, std::string const& filename, |
| std::string* error = nullptr); |
| static bool FileWrite(std::string const& filename, |
| std::string const& content, |
| std::string* error = nullptr); |
| static bool FileDiffers(std::string const& filename, |
| std::string const& content); |
| |
| // -- Constructors |
| cmQtAutoGenerator(GenT genType); |
| virtual ~cmQtAutoGenerator(); |
| |
| cmQtAutoGenerator(cmQtAutoGenerator const&) = delete; |
| cmQtAutoGenerator& operator=(cmQtAutoGenerator const&) = delete; |
| |
| // -- Info options |
| std::string const& InfoFile() const { return this->InfoFile_; } |
| std::string const& InfoDir() const { return this->InfoDir_; } |
| cmFileTime const& InfoFileTime() const { return this->InfoFileTime_; } |
| std::string const& InfoConfig() const { return this->InfoConfig_; } |
| |
| // -- Info file parsing |
| /** Info file reader class. */ |
| class InfoT |
| { |
| public: |
| InfoT(cmQtAutoGenerator& gen) |
| : Gen_(gen) |
| { |
| } |
| |
| /** Read json data from a stream. */ |
| bool Read(std::istream& istr); |
| |
| /** Returns false if the JSON value isn't a string. */ |
| bool GetString(std::string const& key, std::string& value, |
| bool required) const; |
| bool GetStringConfig(std::string const& key, std::string& value, |
| bool required) const; |
| bool GetBool(std::string const& key, bool& value, bool required) const; |
| bool GetUInt(std::string const& key, unsigned int& value, |
| bool required) const; |
| /** Returns false if the JSON value isn't an array. */ |
| bool GetArray(std::string const& key, std::vector<std::string>& list, |
| bool required) const; |
| bool GetArray(std::string const& key, |
| std::unordered_set<std::string>& list, bool required) const; |
| bool GetArrayConfig(std::string const& key, std::vector<std::string>& list, |
| bool required) const; |
| |
| Json::Value const& GetValue(std::string const& key) const |
| { |
| return this->Json_[key]; |
| } |
| |
| /** Returns true if strings were appended to the list. */ |
| static bool GetJsonArray(std::vector<std::string>& list, |
| Json::Value const& jval); |
| /** Returns true if strings were found in the JSON array. */ |
| static bool GetJsonArray(std::unordered_set<std::string>& list, |
| Json::Value const& jval); |
| |
| bool LogError(GenT genType, cm::string_view message) const; |
| bool LogError(cm::string_view message) const; |
| |
| private: |
| std::string ConfigKey(cm::string_view key) const; |
| |
| Json::Value Json_; |
| cmQtAutoGenerator& Gen_; |
| }; |
| |
| // -- Settings file |
| static std::string SettingsFind(cm::string_view content, |
| cm::string_view key); |
| |
| // -- Directories |
| ProjectDirsT const& ProjectDirs() const { return this->ProjectDirs_; } |
| std::string MessagePath(cm::string_view path) const; |
| |
| // -- Run |
| bool Run(cm::string_view infoFile, cm::string_view config); |
| |
| protected: |
| // -- Abstract processing interface |
| virtual bool InitFromInfo(InfoT const& info) = 0; |
| virtual bool Process() = 0; |
| // - Utility classes |
| Logger const& Log() const { return this->Logger_; } |
| |
| private: |
| // -- Generator type |
| GenT GenType_; |
| // -- Logging |
| Logger Logger_; |
| // -- Info file |
| std::string InfoFile_; |
| std::string InfoDir_; |
| cmFileTime InfoFileTime_; |
| std::string InfoConfig_; |
| // -- Directories |
| ProjectDirsT ProjectDirs_; |
| }; |