/* 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 #include #include class cmMakefile; class cmQtAutoGenerators { CM_DISABLE_COPY(cmQtAutoGenerators) public: cmQtAutoGenerators(); bool Run(const std::string& targetDirectory, const std::string& 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(const std::string& key, const std::string& regExp) : Key(key) , RegExp(regExp) { } std::string Key; cmsys::RegularExpression RegExp; }; /// @brief RCC job struct RccJob { std::string QrcFile; std::string RccFile; std::vector Options; std::vector Inputs; }; // -- Configuration bool MocDependFilterPush(const std::string& key, const std::string& regExp); bool ReadAutogenInfoFile(cmMakefile* makefile, const std::string& targetDirectory, const std::string& config); bool MocEnabled() const { return !this->MocExecutable.empty(); } bool UicEnabled() const { return !this->UicExecutable.empty(); } bool RccEnabled() const { return !this->RccExecutable.empty(); } // -- Settings file void SettingsFileRead(cmMakefile* makefile); bool SettingsFileWrite(); bool AnySettingsChanged() const { return (this->MocSettingsChanged || this->RccSettingsChanged || this->UicSettingsChanged); } // -- Init and run void Init(cmMakefile* makefile); bool RunAutogen(); // -- Content analysis bool MocRequired(const std::string& contentText, std::string* macroName = nullptr); void MocFindDepends( const std::string& absFilename, const std::string& contentText, std::map>& mocDepends); bool MocSkip(const std::string& absFilename) const; bool UicSkip(const std::string& absFilename) const; bool ParseSourceFile( const std::string& absFilename, std::map& mocsIncluded, std::map>& mocDepends, std::map>& includedUis, bool relaxed); void SearchHeadersForSourceFile(const std::string& absFilename, std::set& mocHeaderFiles, std::set& uicHeaderFiles) const; bool ParseHeaders( const std::set& mocHeaderFiles, const std::set& uicHeaderFiles, const std::map& mocsIncluded, std::map& mocsNotIncluded, std::map>& mocDepends, std::map>& includedUis); void UicParseContent( const std::string& fileName, const std::string& contentText, std::map>& includedUis); std::string MocMacroNamesString() const; std::string MocHeaderSuffixesString() const; bool MocParseSourceContent( const std::string& absFilename, const std::string& contentText, std::map& mocsIncluded, std::map>& mocDepends, bool relaxed); void MocParseHeaderContent( const std::string& absFilename, const std::string& contentText, std::map& mocsNotIncluded, std::map>& mocDepends); // -- Moc file generation bool MocGenerateAll( const std::map& mocsIncluded, const std::map& mocsNotIncluded, const std::map>& mocDepends); bool MocGenerateFile( const std::string& sourceFile, const std::string& mocFileName, const std::map>& mocDepends, bool included); // -- Uic file generation bool UicFindIncludedFile(std::string& absFile, const std::string& sourceFile, const std::string& searchPath, const std::string& searchFile); bool UicGenerateAll( const std::map>& includedUis); bool UicGenerateFile(const std::string& realName, const std::string& uiInputFile, const std::string& uiOutputFile); // -- Rcc file generation bool RccGenerateAll(); bool RccGenerateFile(const RccJob& rccJob); // -- Log info void LogBold(const std::string& message) const; void LogInfo(cmQtAutoGen::GeneratorType genType, const std::string& message) const; // -- Log warning void LogWarning(cmQtAutoGen::GeneratorType genType, const std::string& message) const; void LogFileWarning(cmQtAutoGen::GeneratorType genType, const std::string& filename, const std::string& message) const; // -- Log error void LogError(cmQtAutoGen::GeneratorType genType, const std::string& message) const; void LogFileError(cmQtAutoGen::GeneratorType genType, const std::string& filename, const std::string& message) const; void LogCommandError(cmQtAutoGen::GeneratorType genType, const std::string& message, const std::vector& command, const std::string& output) const; void LogNameCollisionError( cmQtAutoGen::GeneratorType genType, const std::string& message, const std::multimap& collisions) const; // -- Utility bool NameCollisionTest( const std::map& genFiles, std::multimap& collisions) const; std::string ChecksumedPath(const std::string& sourceFile, const std::string& basePrefix, const std::string& baseSuffix) const; bool MakeParentDirectory(cmQtAutoGen::GeneratorType genType, const std::string& filename) const; bool FileDiffers(const std::string& filename, const std::string& content); bool FileWrite(cmQtAutoGen::GeneratorType genType, const std::string& filename, const std::string& content); bool RunCommand(const std::vector& command, std::string& output) const; bool FindHeader(std::string& header, const std::string& testBasePath) const; std::string MocFindHeader(const std::string& sourcePath, const std::string& includeBase) const; bool MocFindIncludedFile(std::string& absFile, const std::string& sourceFile, const std::string& includeString) const; // -- Meta std::string ConfigSuffix; // -- 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::vector Sources; std::vector Headers; std::vector HeaderExtensions; cmFilePathChecksum FPathChecksum; // -- Settings bool IncludeProjectDirsBefore; bool Verbose; bool ColorOutput; std::string SettingsFile; std::string SettingsStringMoc; std::string SettingsStringUic; std::string SettingsStringRcc; // -- Moc bool MocSettingsChanged; bool MocPredefsChanged; bool MocRelaxedMode; bool MocRunFailed; 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 MocPredefsCmd; std::vector MocDependFilters; std::vector MocMacroFilters; cmsys::RegularExpression MocRegExpInclude; // -- Uic bool UicSettingsChanged; bool UicRunFailed; std::vector UicSkipList; std::vector UicTargetOptions; std::map> UicOptions; std::vector UicSearchPaths; cmsys::RegularExpression UicRegExpInclude; // -- Rcc bool RccSettingsChanged; bool RccRunFailed; std::vector RccJobs; }; #endif