aboutsummaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-04-05 13:56:38 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2017-05-26 12:50:21 +0000
commitc434bed2676150a70d0f34e934ea2c19e0bd42a6 (patch)
tree1774b35e5e103716420d5d42e19479a172ec726a /src/app
parent6a6cf82b8eb9040b8b6b51b8b6cfd9c94be34e1f (diff)
Android: Multiplex over architectures instead of profiles
The extra per-architecture profiles are gone now. Change-Id: I78017d0840f46ee3654dadc4cf9402c63bfc7883 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/app')
-rw-r--r--src/app/qbs-setup-android/android-setup.cpp82
1 files changed, 56 insertions, 26 deletions
diff --git a/src/app/qbs-setup-android/android-setup.cpp b/src/app/qbs-setup-android/android-setup.cpp
index c5ff47254..99866be9a 100644
--- a/src/app/qbs-setup-android/android-setup.cpp
+++ b/src/app/qbs-setup-android/android-setup.cpp
@@ -43,6 +43,7 @@
#include <tools/error.h>
#include <tools/hostosinfo.h>
#include <tools/profile.h>
+#include <tools/settings.h>
#include <tools/version.h>
#include <QtCore/qcoreapplication.h>
@@ -53,6 +54,8 @@
#include <QtCore/qprocess.h>
#include <QtCore/qstring.h>
+#include <algorithm>
+
using namespace qbs;
using qbs::Internal::Tr;
@@ -156,6 +159,29 @@ static QtInfoPerArch getQtAndroidInfo(const QString &qtSdkDir)
return archs;
}
+static QString maximumPlatform(const QString &platform1, const QString &platform2)
+{
+ if (platform1.isEmpty())
+ return platform2;
+ if (platform2.isEmpty())
+ return platform1;
+ static const QString prefix = qls("android-");
+ const QString numberString1 = platform1.mid(prefix.count());
+ const QString numberString2 = platform2.mid(prefix.count());
+ bool ok;
+ const int value1 = numberString1.toInt(&ok);
+ if (!ok) {
+ qWarning("Ignoring malformed Android platform string '%s'.", qPrintable(platform1));
+ return platform2;
+ }
+ const int value2 = numberString2.toInt(&ok);
+ if (!ok) {
+ qWarning("Ignoring malformed Android platform string '%s'.", qPrintable(platform2));
+ return platform1;
+ }
+ return prefix + QString::number(std::max(value1, value2));
+}
+
static void setupNdk(qbs::Settings *settings, const QString &profileName, const QString &ndkDirPath,
const QString &qtSdkDirPath)
{
@@ -170,37 +196,41 @@ static void setupNdk(qbs::Settings *settings, const QString &profileName, const
mainProfile.setValue(qls("Android.sdk.ndkDir"), QDir::cleanPath(ndkDirPath));
}
mainProfile.setValue(qls("qbs.toolchain"), QStringList() << qls("gcc"));
+ const QStringList archs = expectedArchs();
const QtInfoPerArch infoPerArch = getQtAndroidInfo(qtSdkDirPath);
- foreach (const QString &arch, expectedArchs()) {
- const QString subProName = subProfileName(profileName, arch);
+ mainProfile.setValue(qls("qbs.architectures"), infoPerArch.isEmpty()
+ ? archs : QStringList(infoPerArch.keys()));
+ QStringList searchPaths;
+ QString platform;
+ for (const QString &arch : archs) {
const QtAndroidInfo qtAndroidInfo = infoPerArch.value(arch);
- if (qtAndroidInfo.isValid()) {
- const QString setupQtPath = qApp->applicationDirPath() + qls("/qbs-setup-qt");
- QProcess setupQt;
- setupQt.start(setupQtPath, QStringList() << qtAndroidInfo.qmakePath << subProName);
- if (!setupQt.waitForStarted()) {
- throw ErrorInfo(Tr::tr("Setting up Qt profile failed: '%1' "
- "could not be started.").arg(setupQtPath));
- }
- if (!setupQt.waitForFinished()) {
- throw ErrorInfo(Tr::tr("Setting up Qt profile failed: Error running '%1' (%2)")
- .arg(setupQtPath, setupQt.errorString()));
- }
- if (setupQt.exitCode() != 0) {
- throw ErrorInfo(Tr::tr("Setting up Qt profile failed: '%1' returned with "
- "exit code %2.").arg(setupQtPath).arg(setupQt.exitCode()));
- }
+ if (!qtAndroidInfo.isValid())
+ continue;
+ const QString subProName = subProfileName(profileName, arch);
+ const QString setupQtPath = qApp->applicationDirPath() + qls("/qbs-setup-qt");
+ QProcess setupQt;
+ setupQt.start(setupQtPath, QStringList({ qtAndroidInfo.qmakePath, subProName }));
+ if (!setupQt.waitForStarted()) {
+ throw ErrorInfo(Tr::tr("Setting up Qt profile failed: '%1' "
+ "could not be started.").arg(setupQtPath));
+ }
+ if (!setupQt.waitForFinished()) {
+ throw ErrorInfo(Tr::tr("Setting up Qt profile failed: Error running '%1' (%2)")
+ .arg(setupQtPath, setupQt.errorString()));
}
- Profile p(subProName, settings);
- if (qtAndroidInfo.isValid()) {
- if (!qtAndroidInfo.platform.isEmpty())
- p.setValue(qls("Android.ndk.platform"), qtAndroidInfo.platform);
- } else {
- p.removeProfile();
+ if (setupQt.exitCode() != 0) {
+ throw ErrorInfo(Tr::tr("Setting up Qt profile failed: '%1' returned with "
+ "exit code %2.").arg(setupQtPath).arg(setupQt.exitCode()));
}
- p.setBaseProfile(mainProfile.name());
- p.setValue(qls("qbs.architecture"), arch);
+ settings->sync();
+ qbs::Internal::TemporaryProfile p(subProName, settings);
+ searchPaths << p.p.value(qls("preferences.qbsSearchPaths")).toStringList();
+ platform = maximumPlatform(platform, qtAndroidInfo.platform);
}
+ if (!searchPaths.isEmpty())
+ mainProfile.setValue(qls("preferences.qbsSearchPaths"), searchPaths);
+ if (!platform.isEmpty())
+ mainProfile.setValue(qls("Android.ndk.platform"), platform);
}
void setupAndroid(Settings *settings, const QString &profileName, const QString &sdkDirPath,