diff options
| author | Jake Petroules <jake.petroules@petroules.com> | 2015-01-12 08:52:14 -0800 |
|---|---|---|
| committer | Jake Petroules <jake.petroules@petroules.com> | 2015-07-20 20:55:19 +0000 |
| commit | d9cfbbb82d2f8da7850ca5a5eacc595239ad244e (patch) | |
| tree | 2385a49f53d5a233ece76e6f86b683fcb026ff79 | |
| parent | ecb3643ce3c0fcfb1fb3a0369f81066f65e11172 (diff) | |
| download | qbs-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.qbs | 15 | ||||
| -rw-r--r-- | src/app/qbs-setup-android/android-setup.cpp | 88 |
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") |
