diff options
Diffstat (limited to 'Source/cmQtAutoGenerator.h')
-rw-r--r-- | Source/cmQtAutoGenerator.h | 247 |
1 files changed, 33 insertions, 214 deletions
diff --git a/Source/cmQtAutoGenerator.h b/Source/cmQtAutoGenerator.h index 9956a99..ff4c4c9 100644 --- a/Source/cmQtAutoGenerator.h +++ b/Source/cmQtAutoGenerator.h @@ -5,239 +5,73 @@ #include "cmConfigure.h" // IWYU pragma: keep -#include "cmFilePathChecksum.h" +#include "cmFileTime.h" #include "cmQtAutoGen.h" -#include "cmUVHandlePtr.h" -#include "cmUVSignalHackRAII.h" // IWYU pragma: keep -#include "cm_uv.h" -#include <array> -#include <functional> #include <mutex> -#include <stddef.h> -#include <stdint.h> #include <string> #include <vector> class cmMakefile; -/// @brief Base class for QtAutoGen gernerators +/** \class cmQtAutoGenerator + * \brief Base class for QtAutoGen generators + */ class cmQtAutoGenerator : public cmQtAutoGen { public: // -- Types - /// @brief Thread safe logging + /** + * Thread safe logger + */ class Logger { public: + // -- Construction + Logger(); + ~Logger(); // -- Verbosity unsigned int Verbosity() const { return this->Verbosity_; } void SetVerbosity(unsigned int value) { this->Verbosity_ = value; } void RaiseVerbosity(std::string const& 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(GeneratorT genType, std::string const& message); + void Info(GenT genType, std::string const& message) const; // -- Log warning - void Warning(GeneratorT genType, std::string const& message); - void WarningFile(GeneratorT genType, std::string const& filename, - std::string const& message); + void Warning(GenT genType, std::string const& message) const; + void WarningFile(GenT genType, std::string const& filename, + std::string const& message) const; // -- Log error - void Error(GeneratorT genType, std::string const& message); - void ErrorFile(GeneratorT genType, std::string const& filename, - std::string const& message); - void ErrorCommand(GeneratorT genType, std::string const& message, + void Error(GenT genType, std::string const& message) const; + void ErrorFile(GenT genType, std::string const& filename, + std::string const& message) const; + void ErrorCommand(GenT genType, std::string const& message, std::vector<std::string> const& command, - std::string const& output); + std::string const& output) const; private: static std::string HeadLine(std::string const& title); private: - std::mutex Mutex_; + mutable std::mutex Mutex_; unsigned int Verbosity_ = 0; bool ColorOutput_ = false; }; - /// @brief Thread safe file system interface - class FileSystem - { - public: - FileSystem(Logger* log) - : Log_(log) - { - } - - /// @brief Logger - Logger* Log() const { return Log_; } - - // -- Paths - /// @brief Wrapper for cmSystemTools::GetRealPath - std::string GetRealPath(std::string const& filename); - /// @brief Wrapper for cmSystemTools::CollapseCombinedPath - std::string CollapseCombinedPath(std::string const& dir, - std::string const& file); - /// @brief Wrapper for cmSystemTools::SplitPath - void SplitPath(const std::string& p, std::vector<std::string>& components, - bool expand_home_dir = true); - /// @brief Wrapper for cmSystemTools::JoinPath - std::string JoinPath(const std::vector<std::string>& components); - /// @brief Wrapper for cmSystemTools::JoinPath - std::string JoinPath(std::vector<std::string>::const_iterator first, - std::vector<std::string>::const_iterator last); - /// @brief Wrapper for cmSystemTools::GetFilenameWithoutLastExtension - std::string GetFilenameWithoutLastExtension(const std::string& filename); - /// @brief Wrapper for cmQtAutoGen::SubDirPrefix - std::string SubDirPrefix(std::string const& filename); - /// @brief Wrapper for cmFilePathChecksum::setupParentDirs - void setupFilePathChecksum(std::string const& currentSrcDir, - std::string const& currentBinDir, - std::string const& projectSrcDir, - std::string const& projectBinDir); - /// @brief Wrapper for cmFilePathChecksum::getPart - std::string GetFilePathChecksum(std::string const& filename); - - // -- File access - /// @brief Wrapper for cmSystemTools::FileExists - bool FileExists(std::string const& filename); - /// @brief Wrapper for cmSystemTools::FileExists - bool FileExists(std::string const& filename, bool isFile); - /// @brief Wrapper for cmSystemTools::FileLength - unsigned long FileLength(std::string const& filename); - bool FileIsOlderThan(std::string const& buildFile, - std::string const& sourceFile, - std::string* error = nullptr); - - bool FileRead(std::string& content, std::string const& filename, - std::string* error = nullptr); - /// @brief Error logging version - bool FileRead(GeneratorT genType, std::string& content, - std::string const& filename); - - bool FileWrite(std::string const& filename, std::string const& content, - std::string* error = nullptr); - /// @brief Error logging version - bool FileWrite(GeneratorT genType, std::string const& filename, - std::string const& content); - - bool FileDiffers(std::string const& filename, std::string const& content); - - bool FileRemove(std::string const& filename); - bool Touch(std::string const& filename, bool create = false); - - // -- Directory access - bool MakeDirectory(std::string const& dirname); - /// @brief Error logging version - bool MakeDirectory(GeneratorT genType, std::string const& dirname); - - bool MakeParentDirectory(std::string const& filename); - /// @brief Error logging version - bool MakeParentDirectory(GeneratorT genType, std::string const& filename); - - private: - std::mutex Mutex_; - cmFilePathChecksum FilePathChecksum_; - Logger* Log_; - }; - - /// @brief Return value and output of an external process - struct ProcessResultT - { - void reset(); - bool error() const - { - return (ExitStatus != 0) || (TermSignal != 0) || !ErrorMessage.empty(); - } - - std::int64_t ExitStatus = 0; - int TermSignal = 0; - std::string StdOut; - std::string StdErr; - std::string ErrorMessage; - }; - - /// @brief External process management class - struct ReadOnlyProcessT - { - // -- Types - - /// @brief libuv pipe buffer class - class PipeT - { - public: - int init(uv_loop_t* uv_loop, ReadOnlyProcessT* process); - int startRead(std::string* target); - void reset(); - - // -- Libuv casts - uv_pipe_t* uv_pipe() { return UVPipe_.get(); } - uv_stream_t* uv_stream() - { - return reinterpret_cast<uv_stream_t*>(uv_pipe()); - } - uv_handle_t* uv_handle() - { - return reinterpret_cast<uv_handle_t*>(uv_pipe()); - } - - // -- Libuv callbacks - static void UVAlloc(uv_handle_t* handle, size_t suggestedSize, - uv_buf_t* buf); - static void UVData(uv_stream_t* stream, ssize_t nread, - const uv_buf_t* buf); - - private: - ReadOnlyProcessT* Process_ = nullptr; - std::string* Target_ = nullptr; - std::vector<char> Buffer_; - cm::uv_pipe_ptr UVPipe_; - }; - - /// @brief Process settings - struct SetupT - { - std::string WorkingDirectory; - std::vector<std::string> Command; - ProcessResultT* Result = nullptr; - bool MergedOutput = false; - }; - - // -- Const accessors - const SetupT& Setup() const { return Setup_; } - ProcessResultT* Result() const { return Setup_.Result; } - bool IsStarted() const { return IsStarted_; } - bool IsFinished() const { return IsFinished_; } - - // -- Runtime - void setup(ProcessResultT* result, bool mergedOutput, - std::vector<std::string> const& command, - std::string const& workingDirectory = std::string()); - bool start(uv_loop_t* uv_loop, std::function<void()>&& finishedCallback); - - private: - // -- Friends - friend class PipeT; - // -- Libuv callbacks - static void UVExit(uv_process_t* handle, int64_t exitStatus, - int termSignal); - void UVTryFinish(); - - // -- Setup - SetupT Setup_; - // -- Runtime - bool IsStarted_ = false; - bool IsFinished_ = false; - std::function<void()> FinishedCallback_; - std::vector<const char*> CommandPtr_; - std::array<uv_stdio_container_t, 3> UVOptionsStdIO_; - uv_process_options_t UVOptions_; - cm::uv_process_ptr UVProcess_; - PipeT UVPipeOut_; - PipeT UVPipeErr_; - }; + // -- 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); public: // -- Constructors @@ -250,18 +84,11 @@ public: // -- Run bool Run(std::string const& infoFile, std::string const& config); - // -- Accessors - // Logging - Logger& Log() { return Logger_; } - // File System - FileSystem& FileSys() { return FileSys_; } - // InfoFile + // -- InfoFile std::string const& InfoFile() const { return InfoFile_; } + cmFileTime const& InfoFileTime() const { return InfoFileTime_; } std::string const& InfoDir() const { return InfoDir_; } std::string const& InfoConfig() const { return InfoConfig_; } - // libuv loop - uv_loop_t* UVLoop() { return UVLoop_.get(); } - cm::uv_async_ptr& UVRequest() { return UVRequest_; } // -- Utility static std::string SettingsFind(std::string const& content, const char* key); @@ -272,19 +99,11 @@ protected: virtual bool Process() = 0; private: - // -- Logging - Logger Logger_; - FileSystem FileSys_; // -- Info settings std::string InfoFile_; + cmFileTime InfoFileTime_; std::string InfoDir_; std::string InfoConfig_; -// -- libuv loop -#ifdef CMAKE_UV_SIGNAL_HACK - std::unique_ptr<cmUVSignalHackRAII> UVHackRAII_; -#endif - std::unique_ptr<uv_loop_t> UVLoop_; - cm::uv_async_ptr UVRequest_; }; #endif |