aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@qt.io>2017-06-26 17:04:49 -0700
committerJake Petroules <jake.petroules@qt.io>2017-06-29 16:16:08 +0000
commit38bb125aae3ac592434446b8b02d14d4ef5618c0 (patch)
tree33e7e53253bf955e498ddfc28ff0cc031849f5ce
parent6c9aa189aa9f3a83cd1efc3b9b350a8d0be87cf6 (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.qbs10
-rw-r--r--share/qbs/modules/cpp/CppModule.qbs2
-rw-r--r--share/qbs/modules/cpp/GenericGCC.qbs13
-rw-r--r--share/qbs/modules/cpp/android-gcc.qbs2
-rw-r--r--share/qbs/modules/cpp/windows-msvc.qbs1
-rw-r--r--share/qbs/modules/java/utils.js3
-rw-r--r--src/lib/corelib/jsextensions/utilitiesextension.cpp19
-rw-r--r--src/lib/corelib/tools/architectures.cpp27
-rw-r--r--src/lib/corelib/tools/architectures.h1
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);