Autogen: More use of scoped lambdas

This commit is contained in:
Sebastian Holtermann
2017-09-01 09:30:57 +02:00
parent db80367c91
commit d561c1fffc
2 changed files with 96 additions and 118 deletions

View File

@@ -59,86 +59,6 @@ static std::string QuotedCommand(const std::vector<std::string>& command)
return res;
}
static void InfoGet(cmMakefile* makefile, const char* key, std::string& value)
{
value = makefile->GetSafeDefinition(key);
}
static void InfoGet(cmMakefile* makefile, const char* key, bool& value)
{
value = makefile->IsOn(key);
}
static void InfoGet(cmMakefile* makefile, const char* key,
std::vector<std::string>& list)
{
cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition(key), list);
}
static std::vector<std::string> InfoGetList(cmMakefile* makefile,
const char* key)
{
std::vector<std::string> list;
cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition(key), list);
return list;
}
static std::vector<std::vector<std::string>> InfoGetLists(cmMakefile* makefile,
const char* key)
{
std::vector<std::vector<std::string>> lists;
{
const std::string value = makefile->GetSafeDefinition(key);
std::string::size_type pos = 0;
while (pos < value.size()) {
std::string::size_type next = value.find(cmQtAutoGen::listSep, pos);
std::string::size_type length =
(next != std::string::npos) ? next - pos : value.size() - pos;
// Remove enclosing braces
if (length >= 2) {
std::string::const_iterator itBeg = value.begin() + (pos + 1);
std::string::const_iterator itEnd = itBeg + (length - 2);
{
std::string subValue(itBeg, itEnd);
std::vector<std::string> list;
cmSystemTools::ExpandListArgument(subValue, list);
lists.push_back(std::move(list));
}
}
pos += length;
pos += cmQtAutoGen::listSep.size();
}
}
return lists;
}
static void InfoGetConfig(cmMakefile* makefile, const char* key,
const std::string& config, std::string& value)
{
const char* valueConf = nullptr;
{
std::string keyConf = key;
if (!config.empty()) {
keyConf += "_";
keyConf += config;
}
valueConf = makefile->GetDefinition(keyConf);
}
if (valueConf == nullptr) {
valueConf = makefile->GetSafeDefinition(key);
}
value = valueConf;
}
static void InfoGetConfig(cmMakefile* makefile, const char* key,
const std::string& config,
std::vector<std::string>& list)
{
std::string value;
InfoGetConfig(makefile, key, config, value);
cmSystemTools::ExpandListArgument(value, list);
}
static std::string SubDirPrefix(const std::string& fileName)
{
std::string res(cmSystemTools::GetFilenamePath(fileName));
@@ -282,6 +202,67 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
cmMakefile* makefile, const std::string& targetDirectory,
const std::string& config)
{
// Lambdas
auto InfoGet = [makefile](const char* key) {
return makefile->GetSafeDefinition(key);
};
auto InfoGetBool = [makefile](const char* key) {
return makefile->IsOn(key);
};
auto InfoGetList = [makefile](const char* key) -> std::vector<std::string> {
std::vector<std::string> list;
cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition(key), list);
return list;
};
auto InfoGetLists =
[makefile](const char* key) -> std::vector<std::vector<std::string>> {
std::vector<std::vector<std::string>> lists;
{
const std::string value = makefile->GetSafeDefinition(key);
std::string::size_type pos = 0;
while (pos < value.size()) {
std::string::size_type next = value.find(cmQtAutoGen::listSep, pos);
std::string::size_type length =
(next != std::string::npos) ? next - pos : value.size() - pos;
// Remove enclosing braces
if (length >= 2) {
std::string::const_iterator itBeg = value.begin() + (pos + 1);
std::string::const_iterator itEnd = itBeg + (length - 2);
{
std::string subValue(itBeg, itEnd);
std::vector<std::string> list;
cmSystemTools::ExpandListArgument(subValue, list);
lists.push_back(std::move(list));
}
}
pos += length;
pos += cmQtAutoGen::listSep.size();
}
}
return lists;
};
auto InfoGetConfig = [makefile, &config](const char* key) -> std::string {
const char* valueConf = nullptr;
{
std::string keyConf = key;
if (!config.empty()) {
keyConf += '_';
keyConf += config;
}
valueConf = makefile->GetDefinition(keyConf);
}
if (valueConf == nullptr) {
valueConf = makefile->GetSafeDefinition(key);
}
return std::string(valueConf);
};
auto InfoGetConfigList =
[&InfoGetConfig](const char* key) -> std::vector<std::string> {
std::vector<std::string> list;
cmSystemTools::ExpandListArgument(InfoGetConfig(key), list);
return list;
};
std::string filename(cmSystemTools::CollapseFullPath(targetDirectory));
cmSystemTools::ConvertToUnixSlashes(filename);
filename += "/AutogenInfo.cmake";
@@ -292,7 +273,7 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
}
// -- Meta
InfoGetConfig(makefile, "AM_CONFIG_SUFFIX", config, this->ConfigSuffix);
this->ConfigSuffix = InfoGetConfig("AM_CONFIG_SUFFIX");
// - Old settings file
{
@@ -304,28 +285,26 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
}
// - Files and directories
InfoGet(makefile, "AM_CMAKE_SOURCE_DIR", this->ProjectSourceDir);
InfoGet(makefile, "AM_CMAKE_BINARY_DIR", this->ProjectBinaryDir);
InfoGet(makefile, "AM_CMAKE_CURRENT_SOURCE_DIR", this->CurrentSourceDir);
InfoGet(makefile, "AM_CMAKE_CURRENT_BINARY_DIR", this->CurrentBinaryDir);
InfoGet(makefile, "AM_CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE",
this->IncludeProjectDirsBefore);
InfoGet(makefile, "AM_BUILD_DIR", this->AutogenBuildDir);
this->ProjectSourceDir = InfoGet("AM_CMAKE_SOURCE_DIR");
this->ProjectBinaryDir = InfoGet("AM_CMAKE_BINARY_DIR");
this->CurrentSourceDir = InfoGet("AM_CMAKE_CURRENT_SOURCE_DIR");
this->CurrentBinaryDir = InfoGet("AM_CMAKE_CURRENT_BINARY_DIR");
this->IncludeProjectDirsBefore =
InfoGetBool("AM_CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE");
this->AutogenBuildDir = InfoGet("AM_BUILD_DIR");
if (this->AutogenBuildDir.empty()) {
this->LogError("AutoGen: Error: Missing autogen build directory ");
return false;
}
InfoGet(makefile, "AM_SOURCES", this->Sources);
InfoGet(makefile, "AM_HEADERS", this->Headers);
this->Sources = InfoGetList("AM_SOURCES");
this->Headers = InfoGetList("AM_HEADERS");
// - Qt environment
InfoGet(makefile, "AM_QT_VERSION_MAJOR", this->QtMajorVersion);
if (this->QtMajorVersion.empty()) {
InfoGet(makefile, "AM_Qt5Core_VERSION_MAJOR", this->QtMajorVersion);
}
InfoGet(makefile, "AM_QT_MOC_EXECUTABLE", this->MocExecutable);
InfoGet(makefile, "AM_QT_UIC_EXECUTABLE", this->UicExecutable);
InfoGet(makefile, "AM_QT_RCC_EXECUTABLE", this->RccExecutable);
this->QtMajorVersion = InfoGet("AM_QT_VERSION_MAJOR");
this->QtMinorVersion = InfoGet("AM_QT_VERSION_MINOR");
this->MocExecutable = InfoGet("AM_QT_MOC_EXECUTABLE");
this->UicExecutable = InfoGet("AM_QT_UIC_EXECUTABLE");
this->RccExecutable = InfoGet("AM_QT_RCC_EXECUTABLE");
// Check Qt version
if ((this->QtMajorVersion != "4") && (this->QtMajorVersion != "5")) {
@@ -336,9 +315,8 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
// - Moc
if (this->MocEnabled()) {
InfoGet(makefile, "AM_MOC_SKIP", this->MocSkipList);
InfoGetConfig(makefile, "AM_MOC_DEFINITIONS", config,
this->MocDefinitions);
this->MocSkipList = InfoGetList("AM_MOC_SKIP");
this->MocDefinitions = InfoGetConfigList("AM_MOC_DEFINITIONS");
#ifdef _WIN32
{
const std::string win32("WIN32");
@@ -347,20 +325,20 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
}
}
#endif
InfoGetConfig(makefile, "AM_MOC_INCLUDES", config, this->MocIncludePaths);
InfoGet(makefile, "AM_MOC_OPTIONS", this->MocOptions);
InfoGet(makefile, "AM_MOC_RELAXED_MODE", this->MocRelaxedMode);
this->MocIncludePaths = InfoGetConfigList("AM_MOC_INCLUDES");
this->MocOptions = InfoGetList("AM_MOC_OPTIONS");
this->MocRelaxedMode = InfoGetBool("AM_MOC_RELAXED_MODE");
{
std::vector<std::string> MocMacroNames;
InfoGet(makefile, "AM_MOC_MACRO_NAMES", MocMacroNames);
const std::vector<std::string> MocMacroNames =
InfoGetList("AM_MOC_MACRO_NAMES");
for (const std::string& item : MocMacroNames) {
this->MocMacroFilters.emplace_back(
item, ("[^a-zA-Z0-9_]" + item).append("[^a-zA-Z0-9_]"));
}
}
{
std::vector<std::string> mocDependFilters;
InfoGet(makefile, "AM_MOC_DEPEND_FILTERS", mocDependFilters);
const std::vector<std::string> mocDependFilters =
InfoGetList("AM_MOC_DEPEND_FILTERS");
// Insert Q_PLUGIN_METADATA dependency filter
if (this->QtMajorVersion != "4") {
this->MocDependFilterPush("Q_PLUGIN_METADATA",
@@ -385,18 +363,17 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
return false;
}
}
InfoGet(makefile, "AM_MOC_PREDEFS_CMD", this->MocPredefsCmd);
this->MocPredefsCmd = InfoGetList("AM_MOC_PREDEFS_CMD");
}
// - Uic
if (this->UicEnabled()) {
InfoGet(makefile, "AM_UIC_SKIP", this->UicSkipList);
InfoGet(makefile, "AM_UIC_SEARCH_PATHS", this->UicSearchPaths);
InfoGetConfig(makefile, "AM_UIC_TARGET_OPTIONS", config,
this->UicTargetOptions);
this->UicSkipList = InfoGetList("AM_UIC_SKIP");
this->UicSearchPaths = InfoGetList("AM_UIC_SEARCH_PATHS");
this->UicTargetOptions = InfoGetConfigList("AM_UIC_TARGET_OPTIONS");
{
auto uicFiles = InfoGetList(makefile, "AM_UIC_OPTIONS_FILES");
auto uicOptions = InfoGetLists(makefile, "AM_UIC_OPTIONS_OPTIONS");
auto uicFiles = InfoGetList("AM_UIC_OPTIONS_FILES");
auto uicOptions = InfoGetLists("AM_UIC_OPTIONS_OPTIONS");
// Compare list sizes
if (uicFiles.size() == uicOptions.size()) {
auto fitEnd = uicFiles.cend();
@@ -419,10 +396,10 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
// - Rcc
if (this->RccEnabled()) {
// File lists
auto sources = InfoGetList(makefile, "AM_RCC_SOURCES");
auto builds = InfoGetList(makefile, "AM_RCC_BUILDS");
auto options = InfoGetLists(makefile, "AM_RCC_OPTIONS");
auto inputs = InfoGetLists(makefile, "AM_RCC_INPUTS");
auto sources = InfoGetList("AM_RCC_SOURCES");
auto builds = InfoGetList("AM_RCC_BUILDS");
auto options = InfoGetLists("AM_RCC_OPTIONS");
auto inputs = InfoGetLists("AM_RCC_INPUTS");
if (sources.size() != builds.size()) {
std::ostringstream ost;

View File

@@ -190,6 +190,7 @@ private:
std::string AutogenIncludeDir;
// -- Qt environment
std::string QtMajorVersion;
std::string QtMinorVersion;
std::string MocExecutable;
std::string UicExecutable;
std::string RccExecutable;