/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #define cmCPack_Log(ctSelf, logType, msg) \ do { \ std::ostringstream cmCPackLog_msg; \ cmCPackLog_msg << msg; \ (ctSelf)->Log(logType, __FILE__, __LINE__, cmCPackLog_msg.str().c_str()); \ } while (false) /** \class cmCPackLog * \brief A container for CPack generators * */ class cmCPackLog { public: cmCPackLog(); ~cmCPackLog(); cmCPackLog(const cmCPackLog&) = delete; cmCPackLog& operator=(const cmCPackLog&) = delete; enum cm_log_tags { NOTAG = 0, LOG_OUTPUT = 0x1, LOG_VERBOSE = 0x2, LOG_DEBUG = 0x4, LOG_WARNING = 0x8, LOG_ERROR = 0x10 }; //! Various signatures for logging. void Log(const char* file, int line, const char* msg) { this->Log(LOG_OUTPUT, file, line, msg); } void Log(const char* file, int line, const char* msg, size_t length) { this->Log(LOG_OUTPUT, file, line, msg, length); } void Log(int tag, const char* file, int line, const char* msg) { this->Log(tag, file, line, msg, strlen(msg)); } void Log(int tag, const char* file, int line, const char* msg, size_t length); //! Set Verbose void VerboseOn() { this->SetVerbose(true); } void VerboseOff() { this->SetVerbose(true); } void SetVerbose(bool verb) { this->Verbose = verb; } bool GetVerbose() { return this->Verbose; } //! Set Debug void DebugOn() { this->SetDebug(true); } void DebugOff() { this->SetDebug(true); } void SetDebug(bool verb) { this->Debug = verb; } bool GetDebug() { return this->Debug; } //! Set Quiet void QuietOn() { this->SetQuiet(true); } void QuietOff() { this->SetQuiet(true); } void SetQuiet(bool verb) { this->Quiet = verb; } bool GetQuiet() { return this->Quiet; } //! Set the output stream void SetOutputStream(std::ostream* os) { this->DefaultOutput = os; } //! Set the error stream void SetErrorStream(std::ostream* os) { this->DefaultError = os; } //! Set the log output stream void SetLogOutputStream(std::ostream* os); //! Set the log output file. The cmCPackLog will try to create file. If it // cannot, it will report an error. bool SetLogOutputFile(const char* fname); //! Set the various prefixes for the logging. SetPrefix sets the generic // prefix that overwrites missing ones. void SetPrefix(std::string const& pfx) { this->Prefix = pfx; } void SetOutputPrefix(std::string const& pfx) { this->OutputPrefix = pfx; } void SetVerbosePrefix(std::string const& pfx) { this->VerbosePrefix = pfx; } void SetDebugPrefix(std::string const& pfx) { this->DebugPrefix = pfx; } void SetWarningPrefix(std::string const& pfx) { this->WarningPrefix = pfx; } void SetErrorPrefix(std::string const& pfx) { this->ErrorPrefix = pfx; } private: bool Verbose = false; bool Debug = false; bool Quiet = false; bool NewLine = true; int LastTag = cmCPackLog::NOTAG; std::string Prefix; std::string OutputPrefix; std::string VerbosePrefix; std::string DebugPrefix; std::string WarningPrefix; std::string ErrorPrefix; std::ostream* DefaultOutput = nullptr; std::ostream* DefaultError = nullptr; std::ostream* LogOutput = nullptr; std::unique_ptr LogOutputStream; }; class cmCPackLogWrite { public: cmCPackLogWrite(const char* data, size_t length) : Data(data) , Length(length) { } const char* Data; std::streamsize Length; }; inline std::ostream& operator<<(std::ostream& os, const cmCPackLogWrite& c) { os.write(c.Data, c.Length); os.flush(); return os; }