diff options
author | Jake Petroules <jake.petroules@qt.io> | 2017-06-26 17:04:49 -0700 |
---|---|---|
committer | Jake Petroules <jake.petroules@qt.io> | 2017-06-29 16:16:08 +0000 |
commit | 38bb125aae3ac592434446b8b02d14d4ef5618c0 (patch) | |
tree | 33e7e53253bf955e498ddfc28ff0cc031849f5ce | |
parent | 6c9aa189aa9f3a83cd1efc3b9b350a8d0be87cf6 (diff) |
Re-introduce endianness property
Now it can actually be useful, in order to select a specific endianness
when building for architectures that are bi-endian. For example, MIPS
and PowerPC.
This patch makes it possible to build for ppc64le, which is the only
variant of the PowerPC architecture that seems to be relevant today.
ppc32 and all big-endian variants seem to have fallen out of use.
Change-Id: Id1b9f9b397990136ab9aa899829345d426465824
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | share/qbs/imports/qbs/Probes/GccProbe.qbs | 10 | ||||
-rw-r--r-- | share/qbs/modules/cpp/CppModule.qbs | 2 | ||||
-rw-r--r-- | share/qbs/modules/cpp/GenericGCC.qbs | 13 | ||||
-rw-r--r-- | share/qbs/modules/cpp/android-gcc.qbs | 2 | ||||
-rw-r--r-- | share/qbs/modules/cpp/windows-msvc.qbs | 1 | ||||
-rw-r--r-- | share/qbs/modules/java/utils.js | 3 | ||||
-rw-r--r-- | src/lib/corelib/jsextensions/utilitiesextension.cpp | 19 | ||||
-rw-r--r-- | src/lib/corelib/tools/architectures.cpp | 27 | ||||
-rw-r--r-- | src/lib/corelib/tools/architectures.h | 1 |
9 files changed, 66 insertions, 12 deletions
diff --git a/share/qbs/imports/qbs/Probes/GccProbe.qbs b/share/qbs/imports/qbs/Probes/GccProbe.qbs index b153f89c0..0ffe10f4d 100644 --- a/share/qbs/imports/qbs/Probes/GccProbe.qbs +++ b/share/qbs/imports/qbs/Probes/GccProbe.qbs @@ -45,6 +45,7 @@ PathProbe { // Outputs property string architecture + property string endianness property stringList includePaths property stringList libraryPaths property stringList frameworkPaths @@ -67,5 +68,14 @@ PathProbe { // We have to dump the compiler's macros; -dumpmachine is not suitable because it is not // always complete (for example, the subarch is not included for arm architectures). architecture = ModUtils.guessArchitecture(macros); + + switch (macros["__BYTE_ORDER__"]) { + case "__ORDER_BIG_ENDIAN__": + endianness = "big"; + break; + case "__ORDER_LITTLE_ENDIAN__": + endianness = "little"; + break; + } } } diff --git a/share/qbs/modules/cpp/CppModule.qbs b/share/qbs/modules/cpp/CppModule.qbs index 75425924e..1c9f9b40e 100644 --- a/share/qbs/modules/cpp/CppModule.qbs +++ b/share/qbs/modules/cpp/CppModule.qbs @@ -45,6 +45,7 @@ Module { property bool treatWarningsAsErrors : false property bool enableSuspiciousLinkerFlagWarnings: true property string architecture: qbs.architecture + property string endianness property string machineType // undocumented property string imageFormat // undocumented property string optimization: qbs.optimization @@ -429,6 +430,7 @@ Module { return !architecture || architecture === Utilities.canonicalArchitecture(architecture); }, "'" + architecture + "' is invalid. You must use the canonical name '" + Utilities.canonicalArchitecture(architecture) + "'"); + validator.setRequiredProperty("endianness", endianness); validator.setRequiredProperty("compilerVersion", compilerVersion); validator.setRequiredProperty("compilerVersionMajor", compilerVersionMajor); validator.setRequiredProperty("compilerVersionMinor", compilerVersionMinor); diff --git a/share/qbs/modules/cpp/GenericGCC.qbs b/share/qbs/modules/cpp/GenericGCC.qbs index 228efee26..7a065702e 100644 --- a/share/qbs/modules/cpp/GenericGCC.qbs +++ b/share/qbs/modules/cpp/GenericGCC.qbs @@ -96,6 +96,7 @@ CppModule { } qbs.architecture: gccProbe.found ? gccProbe.architecture : original + endianness: gccProbe.endianness compilerVersionMajor: gccVersionProbe.versionMajor compilerVersionMinor: gccVersionProbe.versionMinor @@ -113,7 +114,8 @@ CppModule { ? [targetArch, targetVendor, targetSystem, targetAbi].join("-") : undefined property string targetArch: Utilities.canonicalTargetArchitecture( - qbs.architecture, targetVendor, targetSystem, targetAbi) + qbs.architecture, endianness, + targetVendor, targetSystem, targetAbi) property string targetVendor: "unknown" property string targetSystem: "unknown" property string targetAbi: "unknown" @@ -284,6 +286,15 @@ CppModule { "may not be supported by this compiler."); } + if (gccProbe.endianness) { + validator.addCustomValidator("endianness", endianness, function (value) { + return endianness === gccProbe.endianness; + }, "'" + endianness + "' differs from the endianness produced by this compiler (" + + gccProbe.endianness + ")"); + } else if (endianness) { + console.warn("Could not detect endianness ('" + endianness + "' given)"); + } + var validateFlagsFunction = function (value) { if (value) { for (var i = 0; i < value.length; ++i) { diff --git a/share/qbs/modules/cpp/android-gcc.qbs b/share/qbs/modules/cpp/android-gcc.qbs index 59df1cc25..5307c06a4 100644 --- a/share/qbs/modules/cpp/android-gcc.qbs +++ b/share/qbs/modules/cpp/android-gcc.qbs @@ -200,6 +200,8 @@ LinuxGCC { targetSystem: "linux" targetAbi: "android" + (["armeabi", "armeabi-v7a"].contains(Android.ndk.abi) ? "eabi" : "") + endianness: "little" + Rule { inputs: ["dynamiclibrary"] outputFileTags: ["android.nativelibrary", "android.gdbserver-info", "android.stl-info"] diff --git a/share/qbs/modules/cpp/windows-msvc.qbs b/share/qbs/modules/cpp/windows-msvc.qbs index d0d009ceb..59348bd51 100644 --- a/share/qbs/modules/cpp/windows-msvc.qbs +++ b/share/qbs/modules/cpp/windows-msvc.qbs @@ -100,6 +100,7 @@ CppModule { property string toolchainInstallPath: compilerPathProbe.found ? compilerPathProbe.path : undefined architecture: qbs.architecture + endianness: "little" staticLibraryPrefix: "" dynamicLibraryPrefix: "" executablePrefix: "" diff --git a/share/qbs/modules/java/utils.js b/share/qbs/modules/java/utils.js index ffee62372..be117d98e 100644 --- a/share/qbs/modules/java/utils.js +++ b/share/qbs/modules/java/utils.js @@ -103,7 +103,8 @@ function findJdkPath(hostOS, arch, environmentPaths, searchPaths) { if (arch) { // Hardcoding apple/macosx/macho here is fine because we know we're on macOS args.push("--arch", - Utilities.canonicalTargetArchitecture(arch, "apple", "macosx", "macho")); + Utilities.canonicalTargetArchitecture(arch, undefined, + "apple", "macosx", "macho")); } // --failfast doesn't print the default JVM if nothing matches the filter(s). diff --git a/src/lib/corelib/jsextensions/utilitiesextension.cpp b/src/lib/corelib/jsextensions/utilitiesextension.cpp index 11efc3bf3..a8e5e7c1e 100644 --- a/src/lib/corelib/jsextensions/utilitiesextension.cpp +++ b/src/lib/corelib/jsextensions/utilitiesextension.cpp @@ -140,15 +140,20 @@ QScriptValue UtilitiesExtension::js_canonicalTargetArchitecture(QScriptContext * if (arch.isUndefined() || arch.isNull()) return arch; - const QScriptValue vendor = context->argument(1); - const QScriptValue system = context->argument(2); - const QScriptValue abi = context->argument(3); - - if (!arch.isString() || !vendor.isString() || !system.isString() || !abi.isString()) + QScriptValue endianness = context->argument(1); + if (endianness.isUndefined() || endianness.isNull()) + endianness = QString(); + const QScriptValue vendor = context->argument(2); + const QScriptValue system = context->argument(3); + const QScriptValue abi = context->argument(4); + + if (!arch.isString() || !endianness.isString() + || !vendor.isString() || !system.isString() || !abi.isString()) return context->throwError(QScriptContext::SyntaxError, - QStringLiteral("canonicalTargetArchitecture expects 1 to 4 arguments of type string")); + QStringLiteral("canonicalTargetArchitecture expects 1 to 5 arguments of type string")); - return engine->toScriptValue(canonicalTargetArchitecture(arch.toString(), vendor.toString(), + return engine->toScriptValue(canonicalTargetArchitecture(arch.toString(), endianness.toString(), + vendor.toString(), system.toString(), abi.toString())); } diff --git a/src/lib/corelib/tools/architectures.cpp b/src/lib/corelib/tools/architectures.cpp index ce9a0f28f..2dbb73832 100644 --- a/src/lib/corelib/tools/architectures.cpp +++ b/src/lib/corelib/tools/architectures.cpp @@ -46,6 +46,7 @@ namespace qbs { QString canonicalTargetArchitecture(const QString &architecture, + const QString &endianness, const QString &vendor, const QString &system, const QString &abi) @@ -77,6 +78,19 @@ QString canonicalTargetArchitecture(const QString &architecture, return QStringLiteral("i386"); } + if (arch == QStringLiteral("mips") || arch == QStringLiteral("mips64")) { + if (endianness == QStringLiteral("big")) + return arch + QStringLiteral("eb"); + if (endianness == QStringLiteral("little")) + return arch + QStringLiteral("el"); + } + + if (arch == QStringLiteral("ppc")) + return QStringLiteral("powerpc"); + + if (arch == QStringLiteral("ppc64") && endianness == QStringLiteral("little")) + return arch + QStringLiteral("le"); + return arch; } @@ -115,11 +129,18 @@ QString canonicalArchitecture(const QString &architecture) << QLatin1String("powerpc")); archMap.insert(QLatin1String("ppc64"), QStringList() - << QLatin1String("powerpc64")); - - archMap.insert(QLatin1String("ppc64le"), QStringList() + << QLatin1String("ppc64le") + << QLatin1String("powerpc64") << QLatin1String("powerpc64le")); + archMap.insert(QLatin1String("mips"), QStringList() + << QLatin1String("mipseb") + << QLatin1String("mipsel")); + + archMap.insert(QLatin1String("mips64"), QStringList() + << QLatin1String("mips64eb") + << QLatin1String("mips64el")); + QMapIterator<QString, QStringList> i(archMap); while (i.hasNext()) { i.next(); diff --git a/src/lib/corelib/tools/architectures.h b/src/lib/corelib/tools/architectures.h index ef4ebb537..8b5d2a65d 100644 --- a/src/lib/corelib/tools/architectures.h +++ b/src/lib/corelib/tools/architectures.h @@ -44,6 +44,7 @@ namespace qbs { QBS_EXPORT QString canonicalTargetArchitecture(const QString &architecture, + const QString &endianness, const QString &vendor, const QString &system, const QString &abi); |