/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #ifndef cmQtAutoGenerators_h #define cmQtAutoGenerators_h #include "cmConfigure.h" // IWYU pragma: keep #include "cmFilePathChecksum.h" #include "cmQtAutoGen.h" #include "cmsys/RegularExpression.hxx" #include #include // IWYU pragma: keep #include #include #include class cmMakefile; class cmQtAutoGenerators { CM_DISABLE_COPY(cmQtAutoGenerators) public: cmQtAutoGenerators(); bool Run(std::string const& targetDirectory, std::string const& config); private: // -- Types /// @brief Search key plus regular expression pair struct KeyRegExp { KeyRegExp() = default; KeyRegExp(const char* key, const char* regExp) : Key(key) , RegExp(regExp) { } KeyRegExp(std::string const& key, std::string const& regExp) : Key(key) , RegExp(regExp) { } std::string Key; cmsys::RegularExpression RegExp; }; /// @brief Source file job struct SourceJob { bool Moc = false; bool Uic = false; }; /// @brief MOC job struct MocJobAuto { std::string SourceFile; std::string BuildFileRel; std::set Depends; }; /// @brief MOC job struct MocJobIncluded : MocJobAuto { bool DependsValid = false; std::string Includer; std::string IncludeString; }; /// @brief UIC job struct UicJob { std::string SourceFile; std::string BuildFileRel; std::string Includer; std::string IncludeString; }; /// @brief RCC job struct RccJob { std::string QrcFile; std::string RccFile; std::vector Options; std::vector Inputs; }; // -- Initialization bool InitInfoFile(cmMakefile* makefile, std::string const& targetDirectory, std::string const& config); // -- Settings file void SettingsFileRead(cmMakefile* makefile); bool SettingsFileWrite(); bool SettingsChanged() const { return (this->MocSettingsChanged || this->RccSettingsChanged || this->UicSettingsChanged); } // -- Central processing bool Process(); // -- Source parsing bool ParseSourceFile(std::string const& absFilename, const SourceJob& job); bool ParseHeaderFile(std::string const& absFilename, const SourceJob& job); bool ParsePostprocess(); // -- Moc bool MocEnabled() const { return !this->MocExecutable.empty(); } bool MocSkip(std::string const& absFilename) const; bool MocRequired(std::string const& contentText, std::string* macroName = nullptr); // Moc strings std::string MocStringMacros() const; std::string MocStringHeaders(std::string const& fileBase) const; std::string MocFindIncludedHeader(std::string const& sourcePath, std::string const& includeBase) const; bool MocFindIncludedFile(std::string& absFile, std::string const& sourceFile, std::string const& includeString) const; // Moc depends bool MocDependFilterPush(std::string const& key, std::string const& regExp); void MocFindDepends(std::string const& absFilename, std::string const& contentText, std::set& depends); // Moc bool MocParseSourceContent(std::string const& absFilename, std::string const& contentText); void MocParseHeaderContent(std::string const& absFilename, std::string const& contentText); bool MocGenerateAll(); bool MocGenerateFile(const MocJobAuto& mocJob, bool* generated = nullptr); // -- Uic bool UicEnabled() const { return !this->UicExecutable.empty(); } bool UicSkip(std::string const& absFilename) const; bool UicParseContent(std::string const& fileName, std::string const& contentText); bool UicFindIncludedFile(std::string& absFile, std::string const& sourceFile, std::string const& includeString); bool UicGenerateAll(); bool UicGenerateFile(const UicJob& uicJob); // -- Rcc bool RccEnabled() const { return !this->RccExecutable.empty(); } bool RccGenerateAll(); bool RccGenerateFile(const RccJob& rccJob); // -- Log info void LogBold(std::string const& message) const; void LogInfo(cmQtAutoGen::GeneratorType genType, std::string const& message) const; // -- Log warning void LogWarning(cmQtAutoGen::GeneratorType genType, std::string const& message) const; void LogFileWarning(cmQtAutoGen::GeneratorType genType, std::string const& filename, std::string const& message) const; // -- Log error void LogError(cmQtAutoGen::GeneratorType genType, std::string const& message) const; void LogFileError(cmQtAutoGen::GeneratorType genType, std::string const& filename, std::string const& message) const; void LogCommandError(cmQtAutoGen::GeneratorType genType, std::string const& message, std::vector const& command, std::string const& output) const; // -- Utility bool MakeParentDirectory(cmQtAutoGen::GeneratorType genType, std::string const& filename) const; bool FileDiffers(std::string const& filename, std::string const& content); bool FileWrite(cmQtAutoGen::GeneratorType genType, std::string const& filename, std::string const& content); bool FindHeader(std::string& header, std::string const& testBasePath) const; bool RunCommand(std::vector const& command, std::string& output) const; // -- Meta std::string ConfigSuffix; std::string InfoFile; // -- Settings bool IncludeProjectDirsBefore; bool Verbose; bool ColorOutput; std::string SettingsFile; std::string SettingsStringMoc; std::string SettingsStringUic; std::string SettingsStringRcc; // -- Directories std::string ProjectSourceDir; std::string ProjectBinaryDir; std::string CurrentSourceDir; std::string CurrentBinaryDir; std::string AutogenBuildDir; std::string AutogenIncludeDir; // -- Qt environment std::string QtMajorVersion; std::string QtMinorVersion; std::string MocExecutable; std::string UicExecutable; std::string RccExecutable; // -- File lists std::map HeaderJobs; std::map SourceJobs; std::vector HeaderExtensions; cmFilePathChecksum FilePathChecksum; // -- Moc bool MocSettingsChanged; bool MocPredefsChanged; bool MocRelaxedMode; std::string MocCompFileRel; std::string MocCompFileAbs; std::string MocPredefsFileRel; std::string MocPredefsFileAbs; std::vector MocSkipList; std::vector MocIncludePaths; std::vector MocIncludes; std::vector MocDefinitions; std::vector MocOptions; std::vector MocAllOptions; std::vector MocPredefsCmd; std::vector MocDependFilters; std::vector MocMacroFilters; cmsys::RegularExpression MocRegExpInclude; std::vector> MocJobsIncluded; std::vector> MocJobsAuto; // -- Uic bool UicSettingsChanged; std::vector UicSkipList; std::vector UicTargetOptions; std::map> UicOptions; std::vector UicSearchPaths; cmsys::RegularExpression UicRegExpInclude; std::vector> UicJobs; // -- Rcc bool RccSettingsChanged; std::vector RccJobs; }; #endif