You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cmake/Source/cmQtAutoGenerators.h

249 lines
7.7 KiB

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmQtAutoGenerators_h
#define cmQtAutoGenerators_h
#include "cmConfigure.h" // IWYU pragma: keep
#include "cmFilePathChecksum.h"
#include "cmQtAutoGen.h"
#include "cmsys/RegularExpression.hxx"
#include <map>
#include <memory> // IWYU pragma: keep
#include <set>
#include <string>
#include <vector>
class cmMakefile;
class cmQtAutoGenerators
{
CM_DISABLE_COPY(cmQtAutoGenerators)
public:
cmQtAutoGenerators();
bool Run(std::string const& targetDirectory, std::string const& config);
private:
// -- Types
/// @brief Search key plus regular expression pair
struct KeyRegExp
{
KeyRegExp() = default;
KeyRegExp(const char* key, const char* regExp)
: Key(key)
, RegExp(regExp)
{
}
KeyRegExp(std::string const& key, std::string const& regExp)
: Key(key)
, RegExp(regExp)
{
}
std::string Key;
cmsys::RegularExpression RegExp;
};
/// @brief Source file job
struct SourceJob
{
bool Moc = false;
bool Uic = false;
};
/// @brief MOC job
struct MocJobAuto
{
std::string SourceFile;
std::string BuildFileRel;
std::set<std::string> Depends;
};
/// @brief MOC job
struct MocJobIncluded : MocJobAuto
{
bool DependsValid = false;
std::string Includer;
std::string IncludeString;
};
/// @brief UIC job
struct UicJob
{
std::string SourceFile;
std::string BuildFileRel;
std::string Includer;
std::string IncludeString;
};
/// @brief RCC job
struct RccJob
{
std::string QrcFile;
std::string RccFile;
std::vector<std::string> Options;
std::vector<std::string> Inputs;
};
// -- Initialization
bool InitInfoFile(cmMakefile* makefile, std::string const& targetDirectory,
std::string const& config);
// -- Settings file
void SettingsFileRead(cmMakefile* makefile);
bool SettingsFileWrite();
bool SettingsChanged() const
{
return (this->MocSettingsChanged || this->RccSettingsChanged ||
this->UicSettingsChanged);
}
// -- Central processing
bool Process();
// -- Source parsing
bool ParseSourceFile(std::string const& absFilename, const SourceJob& job);
bool ParseHeaderFile(std::string const& absFilename, const SourceJob& job);
bool ParsePostprocess();
// -- Moc
bool MocEnabled() const { return !this->MocExecutable.empty(); }
bool MocSkip(std::string const& absFilename) const;
bool MocRequired(std::string const& contentText,
std::string* macroName = nullptr);
// Moc strings
std::string MocStringMacros() const;
std::string MocStringHeaders(std::string const& fileBase) const;
std::string MocFindIncludedHeader(std::string const& sourcePath,
std::string const& includeBase) const;
bool MocFindIncludedFile(std::string& absFile, std::string const& sourceFile,
std::string const& includeString) const;
// Moc depends
bool MocDependFilterPush(std::string const& key, std::string const& regExp);
void MocFindDepends(std::string const& absFilename,
std::string const& contentText,
std::set<std::string>& depends);
// Moc
bool MocParseSourceContent(std::string const& absFilename,
std::string const& contentText);
void MocParseHeaderContent(std::string const& absFilename,
std::string const& contentText);
bool MocGenerateAll();
bool MocGenerateFile(const MocJobAuto& mocJob, bool* generated = nullptr);
// -- Uic
bool UicEnabled() const { return !this->UicExecutable.empty(); }
bool UicSkip(std::string const& absFilename) const;
bool UicParseContent(std::string const& fileName,
std::string const& contentText);
bool UicFindIncludedFile(std::string& absFile, std::string const& sourceFile,
std::string const& includeString);
bool UicGenerateAll();
bool UicGenerateFile(const UicJob& uicJob);
// -- Rcc
bool RccEnabled() const { return !this->RccExecutable.empty(); }
bool RccGenerateAll();
bool RccGenerateFile(const RccJob& rccJob);
// -- Log info
void LogBold(std::string const& message) const;
void LogInfo(cmQtAutoGen::Generator genType,
std::string const& message) const;
// -- Log warning
void LogWarning(cmQtAutoGen::Generator genType,
std::string const& message) const;
void LogFileWarning(cmQtAutoGen::Generator genType,
std::string const& filename,
std::string const& message) const;
// -- Log error
void LogError(cmQtAutoGen::Generator genType,
std::string const& message) const;
void LogFileError(cmQtAutoGen::Generator genType,
std::string const& filename,
std::string const& message) const;
void LogCommandError(cmQtAutoGen::Generator genType,
std::string const& message,
std::vector<std::string> const& command,
std::string const& output) const;
// -- Utility
bool MakeParentDirectory(cmQtAutoGen::Generator genType,
std::string const& filename) const;
bool FileDiffers(std::string const& filename, std::string const& content);
bool FileWrite(cmQtAutoGen::Generator genType, std::string const& filename,
std::string const& content);
bool FindHeader(std::string& header, std::string const& testBasePath) const;
bool RunCommand(std::vector<std::string> const& command,
std::string& output) const;
// -- Meta
std::string InfoFile;
std::string ConfigSuffix;
cmQtAutoGen::MultiConfig MultiConfig;
// -- Settings
bool IncludeProjectDirsBefore;
bool Verbose;
bool ColorOutput;
std::string SettingsFile;
std::string SettingsStringMoc;
std::string SettingsStringUic;
std::string SettingsStringRcc;
// -- Directories
std::string ProjectSourceDir;
std::string ProjectBinaryDir;
std::string CurrentSourceDir;
std::string CurrentBinaryDir;
std::string AutogenBuildDir;
std::string AutogenIncludeDir;
// -- Qt environment
std::string QtMajorVersion;
std::string QtMinorVersion;
std::string MocExecutable;
std::string UicExecutable;
std::string RccExecutable;
// -- File lists
std::map<std::string, SourceJob> HeaderJobs;
std::map<std::string, SourceJob> SourceJobs;
std::vector<std::string> HeaderExtensions;
cmFilePathChecksum FilePathChecksum;
// -- Moc
bool MocSettingsChanged;
bool MocPredefsChanged;
bool MocRelaxedMode;
std::string MocCompFileRel;
std::string MocCompFileAbs;
std::string MocPredefsFileRel;
std::string MocPredefsFileAbs;
std::vector<std::string> MocSkipList;
std::vector<std::string> MocIncludePaths;
std::vector<std::string> MocIncludes;
std::vector<std::string> MocDefinitions;
std::vector<std::string> MocOptions;
std::vector<std::string> MocAllOptions;
std::vector<std::string> MocPredefsCmd;
std::vector<KeyRegExp> MocDependFilters;
std::vector<KeyRegExp> MocMacroFilters;
cmsys::RegularExpression MocRegExpInclude;
std::vector<std::unique_ptr<MocJobIncluded>> MocJobsIncluded;
std::vector<std::unique_ptr<MocJobAuto>> MocJobsAuto;
// -- Uic
bool UicSettingsChanged;
std::vector<std::string> UicSkipList;
std::vector<std::string> UicTargetOptions;
std::map<std::string, std::vector<std::string>> UicOptions;
std::vector<std::string> UicSearchPaths;
cmsys::RegularExpression UicRegExpInclude;
std::vector<std::unique_ptr<UicJob>> UicJobs;
// -- Rcc
bool RccSettingsChanged;
std::vector<RccJob> RccJobs;
};
#endif