summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@petroules.com>2015-01-12 08:52:14 -0800
committerJake Petroules <jake.petroules@petroules.com>2015-07-20 20:55:19 +0000
commitd9cfbbb82d2f8da7850ca5a5eacc595239ad244e (patch)
tree2385a49f53d5a233ece76e6f86b683fcb026ff79
parentecb3643ce3c0fcfb1fb3a0369f81066f65e11172 (diff)
downloadqbs-d9cfbbb82d2f8da7850ca5a5eacc595239ad244e.tar.gz
Make toolchain version in Android NDK flexible.
This paves the way for Clang-based toolchain support. Change-Id: I426ea434c562a03cd96ece6a3f19e86a2480de07 Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
-rw-r--r--share/qbs/modules/Android/ndk/ndk.qbs15
-rw-r--r--src/app/qbs-setup-android/android-setup.cpp88
2 files changed, 74 insertions, 29 deletions
diff --git a/share/qbs/modules/Android/ndk/ndk.qbs b/share/qbs/modules/Android/ndk/ndk.qbs
index 64bc94862..78c13e0b5 100644
--- a/share/qbs/modules/Android/ndk/ndk.qbs
+++ b/share/qbs/modules/Android/ndk/ndk.qbs
@@ -51,6 +51,14 @@ Module {
]
}
+ property string toolchainVersion: "4.9"
+ PropertyOptions {
+ name: "toolchainVersion"
+ description: "Corresponds to the 'NDK_TOOLCHAIN_VERSION' variable in an Android.mk file."
+ }
+
+ property string hostArch // E.g. darwin-x86_64
+ property string toolchainDirPrefix // E.g. arm-linux-androideabi-
property string buildProfile // E.g. "armeabi-v7a-hard"
property bool enableExceptions: appStl !== "system"
property bool enableRtti: appStl !== "system"
@@ -65,7 +73,8 @@ Module {
property string cxxStlBaseDir: FileInfo.joinPaths(ndkDir, "sources/cxx-stl")
property string gabiBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "gabi++")
property string stlPortBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "stlport")
- property string gnuStlBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "gnu-libstdc++/4.9")
+ property string gnuStlBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "gnu-libstdc++",
+ toolchainVersion)
property string llvmStlBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "llvm-libc++")
property string stlBaseDir: {
if (appStl.startsWith("gabi++_"))
@@ -106,6 +115,10 @@ Module {
allowedValues: ["arm", "thumb"]
}
+ cpp.toolchainInstallPath: FileInfo.joinPaths(ndkDir, "toolchains",
+ toolchainDirPrefix + toolchainVersion,
+ "prebuilt", hostArch, "bin")
+
cpp.commonCompilerFlags: {
var flags = qbs.buildVariant === "debug"
? compilerFlagsDebug : compilerFlagsRelease;
diff --git a/src/app/qbs-setup-android/android-setup.cpp b/src/app/qbs-setup-android/android-setup.cpp
index 4e97138e6..9eb7927bb 100644
--- a/src/app/qbs-setup-android/android-setup.cpp
+++ b/src/app/qbs-setup-android/android-setup.cpp
@@ -32,6 +32,7 @@
#include <logging/translator.h>
#include <tools/error.h>
+#include <tools/hostosinfo.h>
#include <tools/profile.h>
#include <tools/version.h>
@@ -237,8 +238,7 @@ public:
QString profileSuffix;
QString abi;
QString qbsArchName;
- QString toolchainDirName;
- QString toolchainInstallPath;
+ QString toolchainDirPrefix;
QString toolchainPrefix;
QStringList compilerFlagsDebug;
QStringList compilerFlagsRelease;
@@ -261,7 +261,7 @@ static BuildProfileMap createArchMap()
aarch64.abi = qls("arm64-v8a");
aarch64.profileSuffix = aarch64.abi;
aarch64.qbsArchName = qls("arm64");
- aarch64.toolchainDirName = qls("aarch64-linux-android-4.9");
+ aarch64.toolchainDirPrefix = qls("aarch64-linux-android-");
aarch64.toolchainPrefix = qls("aarch64-linux-android-");
aarch64.compilerFlagsDebug = arm64FlagsDebug();
aarch64.compilerFlagsRelease = arm64FlagsRelease();
@@ -271,7 +271,7 @@ static BuildProfileMap createArchMap()
armeabi.abi = qls("armeabi");
armeabi.profileSuffix = armeabi.abi;
armeabi.qbsArchName = qls("arm");
- armeabi.toolchainDirName = qls("arm-linux-androideabi-4.9");
+ armeabi.toolchainDirPrefix = qls("arm-linux-androideabi-");
armeabi.toolchainPrefix = qls("arm-linux-androideabi-");
armeabi.compilerFlagsDebug = armeabiFlagsDebug();
armeabi.compilerFlagsRelease = armeabiFlagsRelease();
@@ -297,7 +297,7 @@ static BuildProfileMap createArchMap()
mips.abi = qls("mips");
mips.profileSuffix = mips.abi;
mips.qbsArchName = qls("mipsel");
- mips.toolchainDirName = qls("mipsel-linux-android-4.9");
+ mips.toolchainDirPrefix = qls("mipsel-linux-android-");
mips.toolchainPrefix = qls("mipsel-linux-android-");
mips.compilerFlagsDebug = mipsFlagsDebug();
mips.compilerFlagsRelease = mipsFlagsRelease();
@@ -307,7 +307,7 @@ static BuildProfileMap createArchMap()
mips64.abi = qls("mips64");
mips64.profileSuffix = mips64.abi;
mips64.qbsArchName = qls("mips64el");
- mips64.toolchainDirName = qls("mips64el-linux-android-4.9");
+ mips64.toolchainDirPrefix = qls("mips64el-linux-android-");
mips64.toolchainPrefix = qls("mips64el-linux-android-");
mips64.compilerFlagsDebug = mipsFlagsDebug();
mips64.compilerFlagsRelease = mipsFlagsRelease();
@@ -317,7 +317,7 @@ static BuildProfileMap createArchMap()
x86.abi = qls("x86");
x86.profileSuffix = x86.abi;
x86.qbsArchName = x86.abi;
- x86.toolchainDirName = qls("x86-4.9");
+ x86.toolchainDirPrefix = qls("x86-");
x86.toolchainPrefix = qls("i686-linux-android-");
x86.compilerFlagsDebug = x86FlagsDebug();
x86.compilerFlagsRelease = x86FlagsRelease();
@@ -327,7 +327,7 @@ static BuildProfileMap createArchMap()
x86_64.abi = qls("x86_64");
x86_64.profileSuffix = x86_64.abi;
x86_64.qbsArchName = x86_64.abi;
- x86_64.toolchainDirName = qls("x86_64-4.9");
+ x86_64.toolchainDirPrefix = qls("x86_64-");
x86_64.toolchainPrefix = qls("x86_64-linux-android-");
x86_64.compilerFlagsDebug = x86FlagsDebug();
x86_64.compilerFlagsRelease = x86FlagsRelease();
@@ -342,20 +342,57 @@ static QString subProfileName(const QString &mainProfileName, const BuildProfile
return mainProfileName + QLatin1Char('_') + arch.profileSuffix;
}
-static QString detectToolchainHostArch(const QString &ndkDirPath, const QString &toolchainName)
+static QString detectToolchainHostArch(const QString &ndkDirPath)
{
- const QDir tcDir(ndkDirPath + qls("/toolchains/") + toolchainName
- + qls("/prebuilt"));
- if (!QDir(tcDir).exists()) {
- throw ErrorInfo(Tr::tr("Expected directory '%1' to be present, but it is not.")
- .arg(QDir::toNativeSeparators(tcDir.path())));
+ QStringList candidates;
+ if (Internal::HostOsInfo::isWindowsHost()) {
+#ifdef Q_PROCESSOR_X86_64
+ candidates << qls("windows-x86_64");
+#endif
+#ifdef Q_PROCESSOR_X86
+ candidates << qls("windows"); // no -x86 suffix for Windows 32-bit
+#endif
+ }
+ if (Internal::HostOsInfo::isOsxHost()) {
+#ifdef Q_PROCESSOR_X86_64
+ candidates << qls("darwin-x86_64");
+#endif
+#ifdef Q_PROCESSOR_X86
+ candidates << qls("darwin-x86");
+#endif
+ }
+ if (Internal::HostOsInfo::isLinuxHost()) {
+#ifdef Q_PROCESSOR_X86_64
+ candidates << qls("linux-x86_64");
+#endif
+#ifdef Q_PROCESSOR_X86
+ candidates << qls("linux-x86");
+#endif
}
- const QStringList hostArchList = tcDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
- if (hostArchList.isEmpty()) {
- throw ErrorInfo(Tr::tr("Directory '%1' is unexpectedly empty.")
- .arg(QDir::toNativeSeparators(tcDir.path())));
+
+ if (candidates.isEmpty()) {
+ throw ErrorInfo(Tr::tr("Unsupported host platform for Android NDK."));
}
- return hostArchList.first();
+
+ QStringList checkedPaths;
+ QString hostArch;
+ Q_FOREACH (const QString &candidate, candidates) {
+ const QDir tcDir(ndkDirPath + qls("/prebuilt/") + candidate);
+ if (QDir(tcDir).exists() && hostArch.isEmpty()) {
+ hostArch = candidate;
+ }
+
+ checkedPaths << qls("'")
+ + QDir::toNativeSeparators(QDir::cleanPath(tcDir.absolutePath()))
+ + qls("'");
+ }
+
+ if (hostArch.isEmpty()) {
+ throw ErrorInfo(Tr::tr("None of the following paths are present:\n%1")
+ .arg(checkedPaths.join(qls("\n"))));
+ }
+
+ return hostArch;
}
void setupSdk(qbs::Settings *settings, const QString &profileName, const QString &sdkDirPath)
@@ -395,8 +432,6 @@ void setupNdk(qbs::Settings *settings, const QString &profileName, const QString
}
const BuildProfileMap archMap = createArchMap();
- const QString tcHostArchName = detectToolchainHostArch(ndkDirPath,
- archMap.value(archList.first()).toolchainDirName);
QList<BuildProfile> architectures;
foreach (const QString &archName, archList) {
const BuildProfileMap::ConstIterator it = archMap.find(archName);
@@ -404,11 +439,7 @@ void setupNdk(qbs::Settings *settings, const QString &profileName, const QString
qDebug("Ignoring unknown architecture '%s'.", qPrintable(archName));
continue;
}
- BuildProfile arch = it.value();
- arch.toolchainInstallPath = ndkDirPath + qls("/toolchains/")
- + arch.toolchainDirName + qls("/prebuilt/") + tcHostArchName
- + qls("/bin");
- architectures << arch;
+ architectures << it.value();
}
for (BuildProfileMap::ConstIterator it = archMap.constBegin();
@@ -417,7 +448,7 @@ void setupNdk(qbs::Settings *settings, const QString &profileName, const QString
}
Profile mainProfile(profileName, settings);
- mainProfile.setValue(qls("Android.sdk.ndkDir"), ndkDirPath);
+ mainProfile.setValue(qls("Android.sdk.ndkDir"), QDir::cleanPath(ndkDirPath));
foreach (const BuildProfile &arch, architectures) {
Profile p(subProfileName(profileName, arch), settings);
p.setValue(qls("Android.ndk.abi"), arch.abi);
@@ -425,12 +456,13 @@ void setupNdk(qbs::Settings *settings, const QString &profileName, const QString
p.setValue(qls("Android.ndk.compilerFlagsDebug"), arch.compilerFlagsDebug);
p.setValue(qls("Android.ndk.compilerFlagsRelease"), arch.compilerFlagsRelease);
p.setValue(qls("Android.ndk.hardFp"), arch.hardFp);
+ p.setValue(qls("Android.ndk.hostArch"), detectToolchainHostArch(ndkDirPath));
p.setValue(qls("Android.ndk.ndkDir"), QDir::cleanPath(ndkDirPath));
+ p.setValue(qls("Android.ndk.toolchainDirPrefix"), arch.toolchainDirPrefix);
p.setValue(qls("cpp.compilerName"), qls("gcc"));
p.setValue(qls("cpp.debugInformation"), true);
p.setValue(qls("cpp.linkerFlags"), arch.linkerFlags);
p.setValue(qls("cpp.linkerName"), qls("g++"));
- p.setValue(qls("cpp.toolchainInstallPath"), arch.toolchainInstallPath);
p.setValue(qls("cpp.toolchainPrefix"), arch.toolchainPrefix);
p.setValue(qls("qbs.architecture"), arch.qbsArchName);
p.setValue(qls("qbs.targetOS"), QStringList() << qls("android") << qls("linux")