From 877e87206387dbc8974f65fab5600f44a72d7fde Mon Sep 17 00:00:00 2001 From: "Tomasz Siekierda (sierdzio)" Date: Fri, 22 Jun 2018 21:19:52 +0200 Subject: [PATCH] WIP: add feature parsing to command line. --- README.md | 4 ++-- gibs/src/gibs.cpp | 36 ++++++++++++++++++++++++++++++++++++ gibs/src/gibs.h | 8 ++++++++ gibs/src/main.cpp | 13 +++++++++++++ gibs/src/scope.cpp | 18 +++++++++++++++++- gibs/src/scope.h | 3 +++ 6 files changed, 79 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7e821a8..c01e5d4 100644 --- a/README.md +++ b/README.md @@ -198,11 +198,11 @@ To define a feature, use this syntax: Then you can select the feature next time you build your project, like this: - gibs main.cpp --tts-support + gibs main.cpp -- --tts-support Or unselect it using: - gibs main.cpp --no-tts-support + gibs main.cpp -- --no-tts-support # Recommendations diff --git a/gibs/src/gibs.cpp b/gibs/src/gibs.cpp index 4347c48..9292848 100644 --- a/gibs/src/gibs.cpp +++ b/gibs/src/gibs.cpp @@ -1,5 +1,7 @@ #include "gibs.h" +#include + void Gibs::removeFile(const QString &path) { if (QFile::exists(path)) { qInfo() << "Removing:" << path; @@ -17,3 +19,37 @@ QString Gibs::normalizeFeatureName(const QString &name) result = result.replace('-', '_'); return result; } + +/*! + * Converts a \a command line flag into Feature and returns it. + * + * For example: + * $ gibs main.cpp -- --tts-support --no-opengl + * + * If you call this function for boths flags, it will enable TTS support, but + * keep OpenGL turned off. + */ +Gibs::Feature Gibs::commandLineToFeature(const QString &command) +{ + Gibs::Feature result; + const QString negative("--no-"); + + if (command.length() < 2 or !command.startsWith("--")) { + qFatal("Invalid feature name: %s", qPrintable(command)); + } + + if (command.startsWith(negative)) { + result.name = command.mid(negative.length()); + result.enabled = false; + } else { + // Cut '--' from beginning of the string: + result.name = command.mid(2); + result.enabled = true; + } + + result.define = Gibs::normalizeFeatureName(result.name); + // result.defined is intentionally left out. Scope is responsible for setting + // it. + + return result; +} diff --git a/gibs/src/gibs.h b/gibs/src/gibs.h index 4891ae1..635068a 100644 --- a/gibs/src/gibs.h +++ b/gibs/src/gibs.h @@ -6,6 +6,14 @@ #include namespace Gibs { +struct Feature { + QString name; + QString define; + bool defined = false; + bool enabled = false; +}; + void removeFile(const QString &path); QString normalizeFeatureName(const QString &name); +Feature commandLineToFeature(const QString &command); } diff --git a/gibs/src/main.cpp b/gibs/src/main.cpp index 806e757..58eaec0 100644 --- a/gibs/src/main.cpp +++ b/gibs/src/main.cpp @@ -142,9 +142,22 @@ int main(int argc, char *argv[]) { qInfo() << "Maximum number of jobs:" << flags.jobs(); } + // Extract features: + if (args.length() > 1) { + const auto commands = args.mid(1); + qDebug() << "Features:" << commands; + QHash features; + for (const auto &command: commands) { + const auto &feature = Gibs::commandLineToFeature(command); + features.insert(feature.name, feature); + qDebug() << "Feature:" << feature.name << feature.define << feature.defined << feature.enabled; + } + } + ProjectManager manager(flags); manager.loadCache(); manager.loadCommands(); + // TODO: pass features to manager QObject::connect(&manager, &ProjectManager::finished, &app, &QCoreApplication::exit); if (flags.clean()) { diff --git a/gibs/src/scope.cpp b/gibs/src/scope.cpp index f5a5076..8e18b07 100644 --- a/gibs/src/scope.cpp +++ b/gibs/src/scope.cpp @@ -609,7 +609,23 @@ void Scope::onRunTool(const QString &tool, const QStringList &args) void Scope::onFeature(const QString &name, const bool isOn) { - if (isOn) { + Gibs::Feature result; + if (mFeatures.contains(name)) { + auto feat = mFeatures.value(name); + feat.defined = true; + mFeatures.insert(name, feat); + result = feat; + } else { + Gibs::Feature feat; + feat.enabled = isOn; + feat.defined = true; + feat.name = name; + feat.define = Gibs::normalizeFeatureName(name); + result = feat; + emit feature(name, isOn); + } + + if (result.enabled) { addDefines(QStringList {name}); } } diff --git a/gibs/src/scope.h b/gibs/src/scope.h index f8f86cf..cfc2aa6 100644 --- a/gibs/src/scope.h +++ b/gibs/src/scope.h @@ -13,6 +13,7 @@ #include "fileinfo.h" #include "tags.h" #include "metaprocess.h" +#include "gibs.h" class Scope; @@ -149,6 +150,8 @@ protected slots: QStringList mCustomIncludes; QStringList mCustomIncludeFlags; QHash mParsedFiles; + // Name, Feature + QHash mFeatures; QVector mScopeDependencyIds; QVector mScopeDependencies; // TODO: change into QStringList and use only file names here.