aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/qbs
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2013-04-08 15:32:21 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-04-09 11:59:35 +0200
commit79646f5e81e70ab04aed374398a2e9aeb913b537 (patch)
treec495308a1b63c8063d55ef0acc3c040940fdfe4f /src/app/qbs
parent94c022ef81bc0e5f749e5691cae027214a03a67d (diff)
Fix building for more than one configuration at once.
Was broken due to a bug in command line parsing. Change-Id: Ice6f5ce057a157f3d740a069ac567d75cfd38ba0 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/app/qbs')
-rw-r--r--src/app/qbs/parser/commandlineparser.cpp79
1 files changed, 60 insertions, 19 deletions
diff --git a/src/app/qbs/parser/commandlineparser.cpp b/src/app/qbs/parser/commandlineparser.cpp
index 18b45336c..0ac6210ec 100644
--- a/src/app/qbs/parser/commandlineparser.cpp
+++ b/src/app/qbs/parser/commandlineparser.cpp
@@ -43,10 +43,12 @@
#include <tools/hostosinfo.h>
#include <tools/installoptions.h>
#include <tools/preferences.h>
+#include <tools/settings.h>
#include <QCoreApplication>
#include <QDir>
#include <QMap>
+#include <QPair>
#include <QTextStream>
#ifdef Q_OS_UNIX
@@ -197,20 +199,54 @@ QString CommandLineParser::commandDescription() const
return d->command->longDescription();
}
+static bool isSameProfile(const QString &profile1, const QString &profile2,
+ const Settings *settings)
+{
+ if (profile1 == profile2)
+ return true;
+ if (profile1.isEmpty())
+ return profile2.isEmpty() || profile2 == settings->defaultProfile();
+ if (profile2.isEmpty())
+ return profile1 == settings->defaultProfile();
+ return false;
+}
+
+static QString getBuildVariant(const QVariantMap &buildConfig)
+{
+ return buildConfig.value(QLatin1String("qbs.buildVariant")).toString();
+}
+
+static QString getProfile(const QVariantMap &buildConfig)
+{
+ return buildConfig.value(QLatin1String("qbs.profile")).toString();
+}
+
+static bool checkForExistingBuildConfiguration(const QList<QVariantMap> &buildConfigs,
+ const QString &buildVariant, const QString &profile, const Settings *settings)
+{
+ foreach (const QVariantMap &buildConfig, buildConfigs) {
+ if (buildVariant == getBuildVariant(buildConfig)
+ && isSameProfile(profile, getProfile(buildConfig), settings)) {
+ return true;
+ }
+ }
+ return false;
+}
+
QList<QVariantMap> CommandLineParser::buildConfigurations() const
{
- // Key: build variant, value: properties. Empty key used for global properties.
- typedef QMap<QString, QVariantMap> PropertyMaps;
- PropertyMaps properties;
+ // first: build variant, second: properties. Empty variant name used for global properties.
+ typedef QPair<QString, QVariantMap> PropertyListItem;
+ QList<PropertyListItem> propertiesPerBuildVariant;
const QString buildVariantKey = QLatin1String("qbs.buildVariant");
- QString currentKey;
+ QString currentBuildVariant;
QVariantMap currentProperties;
foreach (const QString &arg, d->command->additionalArguments()) {
const int sepPos = arg.indexOf(QLatin1Char(':'));
if (sepPos == -1) { // New build variant found.
- properties.insert(currentKey, currentProperties);
- currentKey = arg;
+ propertiesPerBuildVariant << qMakePair(currentBuildVariant, currentProperties);
+ currentBuildVariant = arg;
currentProperties.clear();
continue;
}
@@ -222,25 +258,30 @@ QList<QVariantMap> CommandLineParser::buildConfigurations() const
else
currentProperties.insert(property, arg.mid(sepPos + 1));
}
- properties.insert(currentKey, currentProperties);
+ propertiesPerBuildVariant << qMakePair(currentBuildVariant, currentProperties);
- if (properties.count() == 1) // No build variant specified on command line.
- properties.insert(QLatin1String("debug"), QVariantMap());
-
- const PropertyMaps::Iterator globalMapIt = properties.find(QString());
- Q_ASSERT(globalMapIt != properties.end());
- const QVariantMap globalProperties = globalMapIt.value();
- properties.erase(globalMapIt);
+ if (propertiesPerBuildVariant.count() == 1) // No build variant specified on command line.
+ propertiesPerBuildVariant << PropertyListItem(QLatin1String("debug"), QVariantMap());
+ const QVariantMap globalProperties = propertiesPerBuildVariant.takeFirst().second;
QList<QVariantMap> buildConfigs;
- for (PropertyMaps::ConstIterator mapsIt = properties.constBegin();
- mapsIt != properties.constEnd(); ++mapsIt) {
- QVariantMap properties = mapsIt.value();
+ foreach (const PropertyListItem &item, propertiesPerBuildVariant) {
+ QVariantMap properties = item.second;
for (QVariantMap::ConstIterator globalPropIt = globalProperties.constBegin();
globalPropIt != globalProperties.constEnd(); ++globalPropIt) {
- properties.insert(globalPropIt.key(), globalPropIt.value());
+ if (!properties.contains(globalPropIt.key()))
+ properties.insert(globalPropIt.key(), globalPropIt.value());
}
- properties.insert(buildVariantKey, mapsIt.key());
+
+ const QString buildVariant = item.first;
+ const QString profile = getProfile(properties);
+ if (checkForExistingBuildConfiguration(buildConfigs, buildVariant, profile, d->settings)) {
+ qbsWarning() << Tr::tr("Ignoring redundant request to build for variant '%1' and "
+ "profile '%2'.").arg(buildVariant, profile);
+ continue;
+ }
+
+ properties.insert(buildVariantKey, buildVariant);
buildConfigs << properties;
}