1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 02:08:27 +08:00
Files
CMake/Source/cmQtAutoGenerator.h
Kitware Robot bdca8b01d2 Modernize: Use #pragma once in all header files
#pragma once is a widely supported compiler pragma, even though it is
not part of the C++ standard. Many of the issues keeping #pragma once
from being standardized (distributed filesystems, build farms, hard
links, etc.) do not apply to CMake - it is easy to build CMake on a
single machine. CMake also does not install any header files which can
be consumed by other projects (though cmCPluginAPI.h has been
deliberately omitted from this conversion in case anyone is still using
it.) Finally, #pragma once has been required to build CMake since at
least August 2017 (7f29bbe6 enabled server mode unconditionally, which
had been using #pragma once since September 2016 (b13d3e0d)). The fact
that we now require C++11 filters out old compilers, and it is unlikely
that there is a compiler which supports C++11 but does not support
#pragma once.
2020-09-03 09:30:21 -04:00

179 lines
5.4 KiB
C++

/* 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 <istream>
#include <mutex>
#include <string>
#include <unordered_set>
#include <vector>
#include <cm/string_view>
#include <cm3p/json/value.h>
#include "cmFileTime.h"
#include "cmQtAutoGen.h"
/** \class cmQtAutoGenerator
* \brief Base class for QtAutoGen generators
*/
class cmQtAutoGenerator : public cmQtAutoGen
{
public:
// -- Types
/** 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(unsigned int 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(GenT genType, cm::string_view message) const;
// -- Log warning
void Warning(GenT genType, cm::string_view message) const;
// -- Log error
void Error(GenT genType, cm::string_view message) const;
void ErrorCommand(GenT genType, cm::string_view message,
std::vector<std::string> const& command,
std::string const& output) const;
private:
static std::string HeadLine(cm::string_view title);
private:
mutable std::mutex Mutex_;
unsigned int Verbosity_ = 0;
bool ColorOutput_ = false;
};
/** Project directories. */
struct ProjectDirsT
{
std::string Source;
std::string Binary;
std::string CurrentSource;
std::string CurrentBinary;
};
// -- 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
cmQtAutoGenerator(GenT genType);
virtual ~cmQtAutoGenerator();
cmQtAutoGenerator(cmQtAutoGenerator const&) = delete;
cmQtAutoGenerator& operator=(cmQtAutoGenerator const&) = delete;
// -- Info options
std::string const& InfoFile() const { return InfoFile_; }
std::string const& InfoDir() const { return InfoDir_; }
cmFileTime const& InfoFileTime() const { return InfoFileTime_; }
std::string const& InfoConfig() const { return InfoConfig_; }
// -- Info file parsing
/** Info file reader class. */
class InfoT
{
public:
InfoT(cmQtAutoGenerator& gen)
: Gen_(gen)
{
}
/** Read json data from a stream. */
bool Read(std::istream& istr);
/** Returns false if the JSON value isn't a string. */
bool GetString(std::string const& key, std::string& value,
bool required) const;
bool GetStringConfig(std::string const& key, std::string& value,
bool required) const;
bool GetBool(std::string const& key, bool& value, bool required) const;
bool GetUInt(std::string const& key, unsigned int& value,
bool required) const;
/** Returns false if the JSON value isn't an array. */
bool GetArray(std::string const& key, std::vector<std::string>& list,
bool required) const;
bool GetArray(std::string const& key,
std::unordered_set<std::string>& list, bool required) const;
bool GetArrayConfig(std::string const& key, std::vector<std::string>& list,
bool required) const;
Json::Value const& GetValue(std::string const& key) const
{
return Json_[key];
}
/** Returns true if strings were appended to the list. */
static bool GetJsonArray(std::vector<std::string>& list,
Json::Value const& jval);
/** Returns true if strings were found in the JSON array. */
static bool GetJsonArray(std::unordered_set<std::string>& list,
Json::Value const& jval);
bool LogError(GenT genType, cm::string_view message) const;
bool LogError(cm::string_view message) const;
private:
std::string ConfigKey(cm::string_view key) const;
private:
Json::Value Json_;
cmQtAutoGenerator& Gen_;
};
// -- Settings file
static std::string SettingsFind(cm::string_view content,
cm::string_view key);
// -- Directories
ProjectDirsT const& ProjectDirs() const { return ProjectDirs_; }
std::string MessagePath(cm::string_view path) const;
// -- Run
bool Run(cm::string_view infoFile, cm::string_view config);
protected:
// -- Abstract processing interface
virtual bool InitFromInfo(InfoT const& info) = 0;
virtual bool Process() = 0;
// - Utility classes
Logger const& Log() const { return Logger_; }
private:
// -- Generator type
GenT GenType_;
// -- Logging
Logger Logger_;
// -- Info file
std::string InfoFile_;
std::string InfoDir_;
cmFileTime InfoFileTime_;
std::string InfoConfig_;
// -- Directories
ProjectDirsT ProjectDirs_;
};