diff options
author | Sebastian Holtermann <sebholt@xwmw.org> | 2019-09-27 13:57:29 (GMT) |
---|---|---|
committer | Sebastian Holtermann <sebholt@xwmw.org> | 2019-09-28 22:07:32 (GMT) |
commit | 6bd40ccf8424a6e8c3a77857d48600ed7c624a07 (patch) | |
tree | 11e7a03ae5b43dcf699ca15ef2d3acbcb4293361 /Source/cmQtAutoMocUic.h | |
parent | e0e9be3d575a255add19169d174c869fdebebbeb (diff) | |
download | CMake-6bd40ccf8424a6e8c3a77857d48600ed7c624a07.zip CMake-6bd40ccf8424a6e8c3a77857d48600ed7c624a07.tar.gz CMake-6bd40ccf8424a6e8c3a77857d48600ed7c624a07.tar.bz2 |
Autogen: Make cmQtAutoMocUic a free function
Diffstat (limited to 'Source/cmQtAutoMocUic.h')
-rw-r--r-- | Source/cmQtAutoMocUic.h | 551 |
1 files changed, 4 insertions, 547 deletions
diff --git a/Source/cmQtAutoMocUic.h b/Source/cmQtAutoMocUic.h index 53946ef..ffcc2db 100644 --- a/Source/cmQtAutoMocUic.h +++ b/Source/cmQtAutoMocUic.h @@ -5,555 +5,12 @@ #include "cmConfigure.h" // IWYU pragma: keep -#include "cmFileTime.h" -#include "cmQtAutoGen.h" -#include "cmQtAutoGenerator.h" -#include "cmWorkerPool.h" -#include "cmsys/RegularExpression.hxx" - #include <cm/string_view> -#include <atomic> -#include <cstddef> -#include <map> -#include <memory> -#include <mutex> -#include <set> -#include <string> -#include <unordered_map> -#include <unordered_set> -#include <utility> -#include <vector> - -/** \class cmQtAutoMocUic - * \brief AUTOMOC and AUTOUIC generator +/** + * Process AUTOMOC and AUTOUIC + * @return true on success */ -class cmQtAutoMocUic : public cmQtAutoGenerator -{ -public: - cmQtAutoMocUic(); - ~cmQtAutoMocUic() override; - - cmQtAutoMocUic(cmQtAutoMocUic const&) = delete; - cmQtAutoMocUic& operator=(cmQtAutoMocUic const&) = delete; - -public: - // -- Types - - /** Include string with sub parts. */ - struct IncludeKeyT - { - IncludeKeyT(std::string const& key, std::size_t basePrefixLength); - - std::string Key; // Full include string - std::string Dir; // Include directory - std::string Base; // Base part of the include file name - }; - - /** Search key plus regular expression pair. */ - struct KeyExpT - { - KeyExpT() = default; - - KeyExpT(std::string key, std::string const& exp) - : Key(std::move(key)) - , Exp(exp) - { - } - - std::string Key; - cmsys::RegularExpression Exp; - }; - - /** Source file parsing cache. */ - class ParseCacheT - { - public: - // -- Types - - /** Entry of the file parsing cache. */ - struct FileT - { - void Clear(); - - struct MocT - { - std::string Macro; - struct IncludeT - { - std::vector<IncludeKeyT> Underscore; - std::vector<IncludeKeyT> Dot; - } Include; - std::vector<std::string> Depends; - } Moc; - - struct UicT - { - std::vector<IncludeKeyT> Include; - std::vector<std::string> Depends; - } Uic; - }; - using FileHandleT = std::shared_ptr<FileT>; - using GetOrInsertT = std::pair<FileHandleT, bool>; - - public: - ParseCacheT(); - ~ParseCacheT(); - - void Clear(); - - bool ReadFromFile(std::string const& fileName); - bool WriteToFile(std::string const& fileName); - - //! Might return an invalid handle - FileHandleT Get(std::string const& fileName) const; - //! Always returns a valid handle - GetOrInsertT GetOrInsert(std::string const& fileName); - - private: - std::unordered_map<std::string, FileHandleT> Map_; - }; - - /** Source file data. */ - class SourceFileT - { - public: - SourceFileT(std::string fileName) - : FileName(std::move(fileName)) - { - } - - public: - std::string FileName; - cmFileTime FileTime; - ParseCacheT::FileHandleT ParseData; - std::string BuildPath; - bool IsHeader = false; - bool Moc = false; - bool Uic = false; - }; - using SourceFileHandleT = std::shared_ptr<SourceFileT>; - using SourceFileMapT = std::map<std::string, SourceFileHandleT>; - - /** Meta compiler file mapping information. */ - struct MappingT - { - SourceFileHandleT SourceFile; - std::string OutputFile; - std::string IncludeString; - std::vector<SourceFileHandleT> IncluderFiles; - }; - using MappingHandleT = std::shared_ptr<MappingT>; - using MappingMapT = std::map<std::string, MappingHandleT>; - - /** Common settings. */ - class BaseSettingsT - { - public: - // -- Constructors - BaseSettingsT(); - ~BaseSettingsT(); - - BaseSettingsT(BaseSettingsT const&) = delete; - BaseSettingsT& operator=(BaseSettingsT const&) = delete; - - // -- Attributes - // - Config - bool MultiConfig = false; - unsigned int QtVersionMajor = 4; - unsigned int ThreadCount = 0; - // - Directories - std::string AutogenBuildDir; - std::string AutogenIncludeDir; - // - Files - std::string CMakeExecutable; - cmFileTime CMakeExecutableTime; - std::string ParseCacheFile; - std::vector<std::string> HeaderExtensions; - }; - - /** Shared common variables. */ - class BaseEvalT - { - public: - // -- Parse Cache - bool ParseCacheChanged = false; - cmFileTime ParseCacheTime; - ParseCacheT ParseCache; - - // -- Sources - SourceFileMapT Headers; - SourceFileMapT Sources; - }; - - /** Moc settings. */ - class MocSettingsT - { - public: - // -- Constructors - MocSettingsT(); - ~MocSettingsT(); - - MocSettingsT(MocSettingsT const&) = delete; - MocSettingsT& operator=(MocSettingsT const&) = delete; - - // -- Const methods - bool skipped(std::string const& fileName) const; - std::string MacrosString() const; - - // -- Attributes - bool Enabled = false; - bool SettingsChanged = false; - bool RelaxedMode = false; - bool PathPrefix = false; - cmFileTime ExecutableTime; - std::string Executable; - std::string CompFileAbs; - std::string PredefsFileAbs; - std::unordered_set<std::string> SkipList; - std::vector<std::string> IncludePaths; - std::vector<std::string> Definitions; - std::vector<std::string> OptionsIncludes; - std::vector<std::string> OptionsDefinitions; - std::vector<std::string> OptionsExtra; - std::vector<std::string> PredefsCmd; - std::vector<KeyExpT> DependFilters; - std::vector<KeyExpT> MacroFilters; - cmsys::RegularExpression RegExpInclude; - }; - - /** Moc shared variables. */ - class MocEvalT - { - public: - // -- predefines file - cmFileTime PredefsTime; - // -- Mappings - MappingMapT HeaderMappings; - MappingMapT SourceMappings; - MappingMapT Includes; - // -- Discovered files - SourceFileMapT HeadersDiscovered; - // -- Output directories - std::unordered_set<std::string> OutputDirs; - // -- Mocs compilation - bool CompUpdated = false; - std::vector<std::string> CompFiles; - }; - - /** Uic settings. */ - class UicSettingsT - { - public: - struct UiFile - { - std::vector<std::string> Options; - }; - - public: - UicSettingsT(); - ~UicSettingsT(); - - UicSettingsT(UicSettingsT const&) = delete; - UicSettingsT& operator=(UicSettingsT const&) = delete; - - // -- Const methods - bool skipped(std::string const& fileName) const; - - // -- Attributes - bool Enabled = false; - bool SettingsChanged = false; - cmFileTime ExecutableTime; - std::string Executable; - std::unordered_set<std::string> SkipList; - std::vector<std::string> Options; - std::unordered_map<std::string, UiFile> UiFiles; - std::vector<std::string> SearchPaths; - cmsys::RegularExpression RegExpInclude; - }; - - /** Uic shared variables. */ - class UicEvalT - { - public: - // -- Discovered files - SourceFileMapT UiFiles; - // -- Mappings - MappingMapT Includes; - // -- Output directories - std::unordered_set<std::string> OutputDirs; - }; - - /** Abstract job class for concurrent job processing. */ - class JobT : public cmWorkerPool::JobT - { - protected: - /** Protected default constructor. */ - JobT(bool fence = false) - : cmWorkerPool::JobT(fence) - { - } - - //! Get the generator. Only valid during Process() call! - cmQtAutoMocUic* Gen() const - { - return static_cast<cmQtAutoMocUic*>(UserData()); - }; - - // -- Accessors. Only valid during Process() call! - Logger const& Log() const { return Gen()->Log(); } - BaseSettingsT const& BaseConst() const { return Gen()->BaseConst(); } - BaseEvalT& BaseEval() const { return Gen()->BaseEval(); } - MocSettingsT const& MocConst() const { return Gen()->MocConst(); } - MocEvalT& MocEval() const { return Gen()->MocEval(); } - UicSettingsT const& UicConst() const { return Gen()->UicConst(); } - UicEvalT& UicEval() const { return Gen()->UicEval(); } - - // -- Logging - std::string MessagePath(cm::string_view path) const - { - return Gen()->MessagePath(path); - } - // - Error logging with automatic abort - void LogError(GenT genType, cm::string_view message) const; - void LogCommandError(GenT genType, cm::string_view message, - std::vector<std::string> const& command, - std::string const& output) const; - - /** @brief Run an external process. Use only during Process() call! */ - bool RunProcess(GenT genType, cmWorkerPool::ProcessResultT& result, - std::vector<std::string> const& command, - std::string* infoMessage = nullptr); - }; - - /** Fence job utility class. */ - class JobFenceT : public JobT - { - public: - JobFenceT() - : JobT(true) - { - } - void Process() override{}; - }; - - /** Generate moc_predefs.h. */ - class JobMocPredefsT : public JobFenceT - { - void Process() override; - bool Update(std::string* reason) const; - }; - - /** File parse job base class. */ - class JobParseT : public JobT - { - public: - JobParseT(SourceFileHandleT fileHandle) - : FileHandle(std::move(fileHandle)) - { - } - - protected: - bool ReadFile(); - void CreateKeys(std::vector<IncludeKeyT>& container, - std::set<std::string> const& source, - std::size_t basePrefixLength); - void MocMacro(); - void MocDependecies(); - void MocIncludes(); - void UicIncludes(); - - protected: - SourceFileHandleT FileHandle; - std::string Content; - }; - - /** Header file parse job. */ - class JobParseHeaderT : public JobParseT - { - public: - using JobParseT::JobParseT; - void Process() override; - }; - - /** Source file parse job. */ - class JobParseSourceT : public JobParseT - { - public: - using JobParseT::JobParseT; - void Process() override; - }; - - /** Evaluate cached file parse data - moc. */ - class JobEvalCacheT : public JobT - { - protected: - std::string MessageSearchLocations() const; - std::vector<std::string> SearchLocations; - }; - - /** Evaluate cached file parse data - moc. */ - class JobEvalCacheMocT : public JobEvalCacheT - { - void Process() override; - bool EvalHeader(SourceFileHandleT source); - bool EvalSource(SourceFileHandleT const& source); - bool FindIncludedHeader(SourceFileHandleT& headerHandle, - cm::string_view includerDir, - cm::string_view includeBase); - bool RegisterIncluded(std::string const& includeString, - SourceFileHandleT includerFileHandle, - SourceFileHandleT sourceFileHandle) const; - void RegisterMapping(MappingHandleT mappingHandle) const; - std::string MessageHeader(cm::string_view headerBase) const; - }; - - /** Evaluate cached file parse data - uic. */ - class JobEvalCacheUicT : public JobEvalCacheT - { - void Process() override; - bool EvalFile(SourceFileHandleT const& sourceFileHandle); - bool FindIncludedUi(cm::string_view sourceDirPrefix, - cm::string_view includePrefix); - bool RegisterMapping(std::string const& includeString, - SourceFileHandleT includerFileHandle); - - std::string UiName; - SourceFileHandleT UiFileHandle; - }; - - /** Evaluate cached file parse data - finish */ - class JobEvalCacheFinishT : public JobFenceT - { - void Process() override; - }; - - /** Dependency probing base job. */ - class JobProbeDepsT : public JobT - { - }; - - /** Probes file dependencies and generates moc compile jobs. */ - class JobProbeDepsMocT : public JobProbeDepsT - { - void Process() override; - bool Generate(MappingHandleT const& mapping, bool compFile) const; - bool Probe(MappingT const& mapping, std::string* reason) const; - std::pair<std::string, cmFileTime> FindDependency( - std::string const& sourceDir, std::string const& includeString) const; - }; - - /** Probes file dependencies and generates uic compile jobs. */ - class JobProbeDepsUicT : public JobProbeDepsT - { - void Process() override; - bool Probe(MappingT const& mapping, std::string* reason) const; - }; - - /** Dependency probing finish job. */ - class JobProbeDepsFinishT : public JobFenceT - { - void Process() override; - }; - - /** Meta compiler base job. */ - class JobCompileT : public JobT - { - public: - JobCompileT(MappingHandleT uicMapping, std::unique_ptr<std::string> reason) - : Mapping(std::move(uicMapping)) - , Reason(std::move(reason)) - { - } - - protected: - MappingHandleT Mapping; - std::unique_ptr<std::string> Reason; - }; - - /** moc compiles a file. */ - class JobCompileMocT : public JobCompileT - { - public: - using JobCompileT::JobCompileT; - void Process() override; - }; - - /** uic compiles a file. */ - class JobCompileUicT : public JobCompileT - { - public: - using JobCompileT::JobCompileT; - void Process() override; - }; - - /** Generate mocs_compilation.cpp. */ - class JobMocsCompilationT : public JobFenceT - { - private: - void Process() override; - }; - - /** @brief The last job. */ - class JobFinishT : public JobFenceT - { - private: - void Process() override; - }; - - // -- Const settings interface - BaseSettingsT const& BaseConst() const { return this->BaseConst_; } - BaseEvalT& BaseEval() { return this->BaseEval_; } - MocSettingsT const& MocConst() const { return this->MocConst_; } - MocEvalT& MocEval() { return this->MocEval_; } - UicSettingsT const& UicConst() const { return this->UicConst_; } - UicEvalT& UicEval() { return this->UicEval_; } - - // -- Parallel job processing interface - cmWorkerPool& WorkerPool() { return WorkerPool_; } - void AbortError() { Abort(true); } - void AbortSuccess() { Abort(false); } - - // -- Utility - std::string AbsoluteBuildPath(cm::string_view relativePath) const; - std::string AbsoluteIncludePath(cm::string_view relativePath) const; - template <class JOBTYPE> - void CreateParseJobs(SourceFileMapT const& sourceMap); - std::string CollapseFullPathTS(std::string const& path) const; - -private: - // -- Abstract processing interface - bool InitFromInfo(InfoT const& info) override; - void InitJobs(); - bool Process() override; - // -- Settings file - void SettingsFileRead(); - bool SettingsFileWrite(); - // -- Parse cache - void ParseCacheRead(); - bool ParseCacheWrite(); - // -- Thread processing - void Abort(bool error); - // -- Generation - bool CreateDirectories(); - -private: - // -- Settings - BaseSettingsT BaseConst_; - BaseEvalT BaseEval_; - MocSettingsT MocConst_; - MocEvalT MocEval_; - UicSettingsT UicConst_; - UicEvalT UicEval_; - // -- Settings file - std::string SettingsFile_; - std::string SettingsStringMoc_; - std::string SettingsStringUic_; - // -- Worker thread pool - std::atomic<bool> JobError_ = ATOMIC_VAR_INIT(false); - cmWorkerPool WorkerPool_; - // -- Concurrent processing - mutable std::mutex CMakeLibMutex_; -}; +bool cmQtAutoMocUic(cm::string_view infoFile, cm::string_view config); #endif |