blob: 5d3ad7442b7a3d02ec63b90f42b6af370aa5a30c [file] [log] [blame]
/* 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 <set>
#include <string>
#include <vector>
class cmMakefile;
class cmQtAutoGenerators
{
CM_DISABLE_COPY(cmQtAutoGenerators)
public:
cmQtAutoGenerators();
bool Run(const std::string& targetDirectory, const std::string& 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(const std::string& key, const std::string& regExp)
: Key(key)
, RegExp(regExp)
{
}
std::string Key;
cmsys::RegularExpression RegExp;
};
/// @brief RCC job
struct RccJob
{
std::string QrcFile;
std::string RccFile;
std::vector<std::string> Options;
std::vector<std::string> Inputs;
};
// -- Configuration
bool MocDependFilterPush(const std::string& key, const std::string& regExp);
bool ReadAutogenInfoFile(cmMakefile* makefile,
const std::string& targetDirectory,
const std::string& config);
bool MocEnabled() const { return !this->MocExecutable.empty(); }
bool UicEnabled() const { return !this->UicExecutable.empty(); }
bool RccEnabled() const { return !this->RccExecutable.empty(); }
// -- Settings file
void SettingsFileRead(cmMakefile* makefile);
bool SettingsFileWrite();
bool AnySettingsChanged() const
{
return (this->MocSettingsChanged || this->RccSettingsChanged ||
this->UicSettingsChanged);
}
// -- Init and run
void Init(cmMakefile* makefile);
bool RunAutogen();
// -- Content analysis
bool MocRequired(const std::string& contentText,
std::string* macroName = nullptr);
void MocFindDepends(
const std::string& absFilename, const std::string& contentText,
std::map<std::string, std::set<std::string>>& mocDepends);
bool MocSkip(const std::string& absFilename) const;
bool UicSkip(const std::string& absFilename) const;
bool ParseSourceFile(
const std::string& absFilename,
std::map<std::string, std::string>& mocsIncluded,
std::map<std::string, std::set<std::string>>& mocDepends,
std::map<std::string, std::vector<std::string>>& includedUis,
bool relaxed);
void SearchHeadersForSourceFile(const std::string& absFilename,
std::set<std::string>& mocHeaderFiles,
std::set<std::string>& uicHeaderFiles) const;
bool ParseHeaders(
const std::set<std::string>& mocHeaderFiles,
const std::set<std::string>& uicHeaderFiles,
const std::map<std::string, std::string>& mocsIncluded,
std::map<std::string, std::string>& mocsNotIncluded,
std::map<std::string, std::set<std::string>>& mocDepends,
std::map<std::string, std::vector<std::string>>& includedUis);
void UicParseContent(
const std::string& fileName, const std::string& contentText,
std::map<std::string, std::vector<std::string>>& includedUis);
std::string MocMacroNamesString() const;
std::string MocHeaderSuffixesString() const;
bool MocParseSourceContent(
const std::string& absFilename, const std::string& contentText,
std::map<std::string, std::string>& mocsIncluded,
std::map<std::string, std::set<std::string>>& mocDepends, bool relaxed);
void MocParseHeaderContent(
const std::string& absFilename, const std::string& contentText,
std::map<std::string, std::string>& mocsNotIncluded,
std::map<std::string, std::set<std::string>>& mocDepends);
// -- Moc file generation
bool MocGenerateAll(
const std::map<std::string, std::string>& mocsIncluded,
const std::map<std::string, std::string>& mocsNotIncluded,
const std::map<std::string, std::set<std::string>>& mocDepends);
bool MocGenerateFile(
const std::string& sourceFile, const std::string& mocFileName,
const std::map<std::string, std::set<std::string>>& mocDepends,
bool included);
// -- Uic file generation
bool UicFindIncludedFile(std::string& absFile, const std::string& sourceFile,
const std::string& searchPath,
const std::string& searchFile);
bool UicGenerateAll(
const std::map<std::string, std::vector<std::string>>& includedUis);
bool UicGenerateFile(const std::string& realName,
const std::string& uiInputFile,
const std::string& uiOutputFile);
// -- Rcc file generation
bool RccGenerateAll();
bool RccGenerateFile(const RccJob& rccJob);
// -- Log info
void LogBold(const std::string& message) const;
void LogInfo(cmQtAutoGen::GeneratorType genType,
const std::string& message) const;
// -- Log warning
void LogWarning(cmQtAutoGen::GeneratorType genType,
const std::string& message) const;
void LogFileWarning(cmQtAutoGen::GeneratorType genType,
const std::string& filename,
const std::string& message) const;
// -- Log error
void LogError(cmQtAutoGen::GeneratorType genType,
const std::string& message) const;
void LogFileError(cmQtAutoGen::GeneratorType genType,
const std::string& filename,
const std::string& message) const;
void LogCommandError(cmQtAutoGen::GeneratorType genType,
const std::string& message,
const std::vector<std::string>& command,
const std::string& output) const;
void LogNameCollisionError(
cmQtAutoGen::GeneratorType genType, const std::string& message,
const std::multimap<std::string, std::string>& collisions) const;
// -- Utility
bool NameCollisionTest(
const std::map<std::string, std::string>& genFiles,
std::multimap<std::string, std::string>& collisions) const;
std::string ChecksumedPath(const std::string& sourceFile,
const std::string& basePrefix,
const std::string& baseSuffix) const;
bool MakeParentDirectory(cmQtAutoGen::GeneratorType genType,
const std::string& filename) const;
bool FileDiffers(const std::string& filename, const std::string& content);
bool FileWrite(cmQtAutoGen::GeneratorType genType,
const std::string& filename, const std::string& content);
bool RunCommand(const std::vector<std::string>& command,
std::string& output) const;
bool FindHeader(std::string& header, const std::string& testBasePath) const;
std::string MocFindHeader(const std::string& sourcePath,
const std::string& includeBase) const;
bool MocFindIncludedFile(std::string& absFile, const std::string& sourceFile,
const std::string& includeString) const;
// -- Meta
std::string ConfigSuffix;
// -- 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::vector<std::string> Sources;
std::vector<std::string> Headers;
std::vector<std::string> HeaderExtensions;
cmFilePathChecksum FPathChecksum;
// -- Settings
bool IncludeProjectDirsBefore;
bool Verbose;
bool ColorOutput;
std::string SettingsFile;
std::string SettingsStringMoc;
std::string SettingsStringUic;
std::string SettingsStringRcc;
// -- Moc
bool MocSettingsChanged;
bool MocPredefsChanged;
bool MocRelaxedMode;
bool MocRunFailed;
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> MocPredefsCmd;
std::vector<KeyRegExp> MocDependFilters;
std::vector<KeyRegExp> MocMacroFilters;
cmsys::RegularExpression MocRegExpInclude;
// -- Uic
bool UicSettingsChanged;
bool UicRunFailed;
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;
// -- Rcc
bool RccSettingsChanged;
bool RccRunFailed;
std::vector<RccJob> RccJobs;
};
#endif