/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #ifndef cmQtAutoGenInitializer_h #define cmQtAutoGenInitializer_h #include "cmConfigure.h" // IWYU pragma: keep #include "cmGeneratedFileStream.h" #include "cmQtAutoGen.h" #include #include // IWYU pragma: keep #include #include #include #include #include #include class cmGeneratorTarget; class cmTarget; class cmQtAutoGenGlobalInitializer; class cmSourceFile; /// @brief Initializes the QtAutoGen generators class cmQtAutoGenInitializer : public cmQtAutoGen { public: /// @brief Rcc job information class Qrc { public: std::string LockFile; std::string QrcFile; std::string QrcName; std::string PathChecksum; std::string InfoFile; std::string SettingsFile; std::map ConfigSettingsFile; std::string RccFile; bool Generated = false; bool Unique = false; std::vector Options; std::vector Resources; }; /// @brief Moc/Uic file struct MUFile { std::string RealPath; cmSourceFile* SF = nullptr; bool Generated = false; bool SkipMoc = false; bool SkipUic = false; bool MocIt = false; bool UicIt = false; }; typedef std::unique_ptr MUFileHandle; /// @brief Abstract moc/uic/rcc generator variables base class struct GenVarsT { bool Enabled = false; // Generator type/name GenT Gen; std::string const& GenName; std::string const& GenNameUpper; // Executable std::string ExecutableTargetName; cmGeneratorTarget* ExecutableTarget = nullptr; std::string Executable; bool ExecutableExists = false; /// @brief Constructor GenVarsT(GenT gen, std::string const& genName, std::string const& genNameUpper) : Gen(gen) , GenName(genName) , GenNameUpper(genNameUpper){}; }; /// @brief Writes a CMake info file class InfoWriter { public: /// @brief Open the given file InfoWriter(std::string const& filename); /// @return True if the file is open explicit operator bool() const { return static_cast(Ofs_); } void Write(const char* text) { Ofs_ << text; } void Write(const char* key, std::string const& value); void WriteUInt(const char* key, unsigned int value); template void WriteStrings(const char* key, C const& container); void WriteConfig(const char* key, std::map const& map); template void WriteConfigStrings(const char* key, std::map const& map); void WriteNestedLists(const char* key, std::vector> const& lists); private: template static std::string ListJoin(IT it_begin, IT it_end); static std::string ConfigKey(const char* key, std::string const& config); private: cmGeneratedFileStream Ofs_; }; public: /// @return The detected Qt version and the required Qt major version static std::pair GetQtVersion( cmGeneratorTarget const* target); cmQtAutoGenInitializer(cmQtAutoGenGlobalInitializer* globalInitializer, cmGeneratorTarget* target, IntegerVersion const& qtVersion, bool mocEnabled, bool uicEnabled, bool rccEnabled, bool globalAutogenTarget, bool globalAutoRccTarget); bool InitCustomTargets(); bool SetupCustomTargets(); private: /// @brief If moc or uic is enabled, the autogen target will be generated bool MocOrUicEnabled() const { return (this->Moc.Enabled || this->Uic.Enabled); } bool InitMoc(); bool InitUic(); bool InitRcc(); bool InitScanFiles(); bool InitAutogenTarget(); bool InitRccTargets(); bool SetupWriteAutogenInfo(); bool SetupWriteRccInfo(); void RegisterGeneratedSource(std::string const& filename); bool AddGeneratedSource(std::string const& filename, GenVarsT const& genVars, bool prepend = false); bool AddToSourceGroup(std::string const& fileName, std::string const& genNameUpper); bool GetQtExecutable(GenVarsT& genVars, const std::string& executable, bool ignoreMissingTarget, std::string* output) const; bool RccListInputs(std::string const& fileName, std::vector& files, std::string& errorMessage); private: cmQtAutoGenGlobalInitializer* GlobalInitializer; cmGeneratorTarget* Target; // Configuration IntegerVersion QtVersion; bool MultiConfig = false; std::string ConfigDefault; std::vector ConfigsList; std::string Verbosity; std::string TargetsFolder; bool CMP0071Accept = false; bool CMP0071Warn = false; /// @brief Common directories struct { std::string Info; std::string Build; std::string Work; std::string Include; std::map ConfigInclude; } Dir; /// @brief Autogen target variables struct { std::string Name; bool GlobalTarget = false; // Settings std::string Parallel; // Configuration files std::string InfoFile; std::string SettingsFile; std::map ConfigSettingsFile; // Dependencies bool DependOrigin = false; std::set DependFiles; std::set DependTargets; // Sources to process std::unordered_map Headers; std::unordered_map Sources; std::vector FilesGenerated; } AutogenTarget; /// @brief Moc only variables struct MocT : public GenVarsT { std::string PredefsCmd; std::vector Includes; std::map> ConfigIncludes; std::set Defines; std::map> ConfigDefines; std::string MocsCompilation; /// @brief Constructor MocT() : GenVarsT(cmQtAutoGen::GenT::MOC, cmQtAutoGen::GenAutoMoc, cmQtAutoGen::GenAUTOMOC){}; } Moc; /// @brief Uic only variables struct UicT : public GenVarsT { std::set SkipUi; std::vector SearchPaths; std::vector Options; std::map> ConfigOptions; std::vector FileFiles; std::vector> FileOptions; /// @brief Constructor UicT() : GenVarsT(cmQtAutoGen::GenT::UIC, cmQtAutoGen::GenAutoUic, cmQtAutoGen::GenAUTOUIC){}; } Uic; /// @brief Rcc only variables struct RccT : public GenVarsT { bool GlobalTarget = false; std::vector ListOptions; std::vector Qrcs; /// @brief Constructor RccT() : GenVarsT(cmQtAutoGen::GenT::RCC, cmQtAutoGen::GenAutoRcc, cmQtAutoGen::GenAUTORCC){}; } Rcc; }; #endif