aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@qt.io>2016-12-08 13:10:04 -0800
committerJake Petroules <jake.petroules@qt.io>2016-12-09 19:21:06 +0000
commit574d4ef812f9dcbb54ce659d2c6f247be773d0de (patch)
tree0b95cc4b4409fba6ee8f27e2e2cdf312e7604b69
parentbabbf2156579e6e0bbdac973aa5fc8c30d00b806 (diff)
Fix passing -arch x86_64h or -arch armv7 to Clang for Apple targets
This fixes a regression `clang: error: invalid arch name '-arch armv7a'` when building for iOS armv7, which affects Qt Creator in particular. Expand the scope of the deploymentTarget autotest to verify it does not happen again. Change-Id: Ic2689ec4474f74642d3de641b57a52854d2a8bdc Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--share/qbs/imports/qbs/ModUtils/utils.js2
-rw-r--r--share/qbs/modules/cpp/GenericGCC.qbs3
-rw-r--r--share/qbs/modules/java/utils.js4
-rw-r--r--src/app/qbs-setup-toolchains/xcodeprobe.cpp2
-rw-r--r--src/lib/corelib/jsextensions/utilitiesextension.cpp24
-rw-r--r--src/lib/corelib/tools/architectures.cpp23
-rw-r--r--src/lib/corelib/tools/architectures.h5
-rw-r--r--tests/auto/blackbox/testdata/deploymentTarget/deployment.qbs13
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp53
9 files changed, 116 insertions, 13 deletions
diff --git a/share/qbs/imports/qbs/ModUtils/utils.js b/share/qbs/imports/qbs/ModUtils/utils.js
index 800a58bc0..36d34dadb 100644
--- a/share/qbs/imports/qbs/ModUtils/utils.js
+++ b/share/qbs/imports/qbs/ModUtils/utils.js
@@ -554,6 +554,8 @@ function guessArchitecture(m) {
architecture = "x86";
} else if (hasAnyOf(m, ["__x86_64", "__x86_64__", "__amd64", "_M_X64", "_M_AMD64"])) {
architecture = "x86_64";
+ if (hasAnyOf(m, ["__x86_64h", "__x86_64h__"]))
+ architecture = "x86_64h";
} else if (hasAnyOf(m, ["__ia64", "__ia64__", "_M_IA64"])) {
architecture = "ia64";
} else if (hasAnyOf(m, ["__mips", "__mips__", "_M_MRX000"])) {
diff --git a/share/qbs/modules/cpp/GenericGCC.qbs b/share/qbs/modules/cpp/GenericGCC.qbs
index edf1a3fbe..0ad21fa96 100644
--- a/share/qbs/modules/cpp/GenericGCC.qbs
+++ b/share/qbs/modules/cpp/GenericGCC.qbs
@@ -61,7 +61,8 @@ CppModule {
compilerLibraryPaths: gccProbe.libraryPaths
property string target: [targetArch, targetVendor, targetSystem, targetAbi].join("-")
- property string targetArch: qbs.architecture === "x86" ? "i386" : qbs.architecture
+ property string targetArch: Utilities.canonicalTargetArchitecture(
+ qbs.architecture, targetVendor, targetSystem, targetAbi)
property string targetVendor: "unknown"
property string targetSystem: "unknown"
property string targetAbi: "unknown"
diff --git a/share/qbs/modules/java/utils.js b/share/qbs/modules/java/utils.js
index 632fc8102..aebe9c617 100644
--- a/share/qbs/modules/java/utils.js
+++ b/share/qbs/modules/java/utils.js
@@ -101,7 +101,9 @@ function findJdkPath(hostOS, arch, environmentPaths, searchPaths) {
// We filter by architecture here so that we'll get a compatible JVM for JNI use.
var args = [];
if (arch) {
- args.push("--arch", arch === "x86" ? "i386" : arch);
+ // Hardcoding apple/macosx/macho here is fine because we know we're on macOS
+ args.push("--arch",
+ Utilities.canonicalTargetArchitecture(arch, "apple", "macosx", "macho"));
}
// --failfast doesn't print the default JVM if nothing matches the filter(s).
diff --git a/src/app/qbs-setup-toolchains/xcodeprobe.cpp b/src/app/qbs-setup-toolchains/xcodeprobe.cpp
index 0f2ebd1b2..1e9abe73e 100644
--- a/src/app/qbs-setup-toolchains/xcodeprobe.cpp
+++ b/src/app/qbs-setup-toolchains/xcodeprobe.cpp
@@ -159,7 +159,7 @@ static QStringList archList(const QString &applePlatformName)
} else if (applePlatformName == QStringLiteral("iphoneos")
|| applePlatformName == QStringLiteral("appletvos")) {
if (applePlatformName != QStringLiteral("appletvos"))
- archs << QStringLiteral("armv7");
+ archs << QStringLiteral("armv7a");
archs << QStringLiteral("arm64");
} else if (applePlatformName == QStringLiteral("watchos")) {
archs << QStringLiteral("armv7k");
diff --git a/src/lib/corelib/jsextensions/utilitiesextension.cpp b/src/lib/corelib/jsextensions/utilitiesextension.cpp
index 1463438fc..5155545f2 100644
--- a/src/lib/corelib/jsextensions/utilitiesextension.cpp
+++ b/src/lib/corelib/jsextensions/utilitiesextension.cpp
@@ -71,6 +71,8 @@ class UtilitiesExtension : public QObject, QScriptable
public:
static QScriptValue js_ctor(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_canonicalArchitecture(QScriptContext *context, QScriptEngine *engine);
+ static QScriptValue js_canonicalTargetArchitecture(QScriptContext *context,
+ QScriptEngine *engine);
static QScriptValue js_canonicalToolchain(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_getHash(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_getNativeSetting(QScriptContext *context, QScriptEngine *engine);
@@ -92,6 +94,9 @@ void initializeJsExtensionUtilities(QScriptValue extensionObject)
engine->newFunction(&UtilitiesExtension::js_ctor));
environmentObj.setProperty(QStringLiteral("canonicalArchitecture"),
engine->newFunction(UtilitiesExtension::js_canonicalArchitecture, 1));
+ environmentObj.setProperty(QStringLiteral("canonicalTargetArchitecture"),
+ engine->newFunction(
+ UtilitiesExtension::js_canonicalTargetArchitecture, 4));
environmentObj.setProperty(QStringLiteral("canonicalToolchain"),
engine->newFunction(UtilitiesExtension::js_canonicalToolchain));
environmentObj.setProperty(QStringLiteral("getHash"),
@@ -121,6 +126,25 @@ QScriptValue UtilitiesExtension::js_ctor(QScriptContext *context, QScriptEngine
return context->throwError(Tr::tr("'Utilities' cannot be instantiated."));
}
+QScriptValue UtilitiesExtension::js_canonicalTargetArchitecture(QScriptContext *context,
+ QScriptEngine *engine)
+{
+ const QScriptValue arch = context->argument(0);
+ 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())
+ return context->throwError(QScriptContext::SyntaxError,
+ QStringLiteral("canonicalTargetArchitecture expects 1 to 4 arguments of type string"));
+
+ return engine->toScriptValue(canonicalTargetArchitecture(arch.toString(), vendor.toString(),
+ system.toString(), abi.toString()));
+}
+
QScriptValue UtilitiesExtension::js_canonicalArchitecture(QScriptContext *context,
QScriptEngine *engine)
{
diff --git a/src/lib/corelib/tools/architectures.cpp b/src/lib/corelib/tools/architectures.cpp
index ca43b90c7..02f0fc868 100644
--- a/src/lib/corelib/tools/architectures.cpp
+++ b/src/lib/corelib/tools/architectures.cpp
@@ -46,6 +46,29 @@
namespace qbs {
+QString canonicalTargetArchitecture(const QString &architecture,
+ const QString &vendor,
+ const QString &system,
+ const QString &abi)
+{
+ const QString arch = canonicalArchitecture(architecture);
+ const bool isApple = (vendor == QStringLiteral("apple")
+ || system == QStringLiteral("darwin")
+ || system == QStringLiteral("macosx")
+ || system == QStringLiteral("ios")
+ || system == QStringLiteral("tvos")
+ || system == QStringLiteral("watchos")
+ || abi == QStringLiteral("macho"));
+
+ if (arch == QStringLiteral("armv7a") && isApple)
+ return QStringLiteral("armv7");
+
+ if (arch == QStringLiteral("x86"))
+ return QStringLiteral("i386");
+
+ return arch;
+}
+
QString canonicalArchitecture(const QString &architecture)
{
QMap<QString, QStringList> archMap;
diff --git a/src/lib/corelib/tools/architectures.h b/src/lib/corelib/tools/architectures.h
index bb7f0d21e..ef4ebb537 100644
--- a/src/lib/corelib/tools/architectures.h
+++ b/src/lib/corelib/tools/architectures.h
@@ -43,6 +43,11 @@
namespace qbs {
+QBS_EXPORT QString canonicalTargetArchitecture(const QString &architecture,
+ const QString &vendor,
+ const QString &system,
+ const QString &abi);
+
QBS_EXPORT QString canonicalArchitecture(const QString &architecture);
} // namespace qbs
diff --git a/tests/auto/blackbox/testdata/deploymentTarget/deployment.qbs b/tests/auto/blackbox/testdata/deploymentTarget/deployment.qbs
index 2abdaeaff..f805de67c 100644
--- a/tests/auto/blackbox/testdata/deploymentTarget/deployment.qbs
+++ b/tests/auto/blackbox/testdata/deploymentTarget/deployment.qbs
@@ -2,8 +2,15 @@ import qbs
CppApplication {
files: ["main.c"]
- cpp.minimumMacosVersion: "10.4"
- cpp.minimumIosVersion: "5.0"
- cpp.cFlags: ["-v"]
+
+ // Minimum deployment targets that:
+ // - will actually link (as of Xcode 8.1)
+ // - exist for the given architecture(s)
+ cpp.minimumMacosVersion: qbs.architecture === "x86_64h" ? "10.12" : "10.4"
+ cpp.minimumIosVersion: ["armv7s", "arm64", "x86_64"].contains(qbs.architecture) ? "7.0" : "6.0"
+ cpp.minimumTvosVersion: "9.0"
+ cpp.minimumWatchosVersion: "2.0"
+
+ cpp.driverFlags: ["-v"]
cpp.linkerFlags: ["-v"]
}
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index 7453944c6..79f5105ec 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -739,19 +739,58 @@ void TestBlackbox::deploymentTarget()
void TestBlackbox::deploymentTarget_data()
{
+ static const QString macos = QStringLiteral("macos,darwin,bsd,unix");
+ static const QString ios = QStringLiteral("ios,darwin,bsd,unix");
+ static const QString ios_sim = QStringLiteral("ios-simulator,") + ios;
+ static const QString tvos = QStringLiteral("tvos,darwin,bsd,unix");
+ static const QString tvos_sim = QStringLiteral("tvos-simulator,") + tvos;
+ static const QString watchos = QStringLiteral("watchos,darwin,bsd,unix");
+ static const QString watchos_sim = QStringLiteral("watchos-simulator,") + watchos;
+
QTest::addColumn<QString>("os");
QTest::addColumn<QString>("arch");
QTest::addColumn<QString>("cflags");
QTest::addColumn<QString>("lflags");
- QTest::newRow("macos") << "macos,darwin,bsd,unix" << "x86_64"
+
+ QTest::newRow("macos x86") << macos << "x86"
+ << "-triple i386-apple-macosx10.4"
+ << "-macosx_version_min 10.4";
+ QTest::newRow("macos x86_64") << macos << "x86_64"
<< "-triple x86_64-apple-macosx10.4"
<< "-macosx_version_min 10.4";
- QTest::newRow("ios") << "ios,darwin,bsd,unix" << "arm64"
- << "-triple arm64-apple-ios5.0"
- << "-iphoneos_version_min 5.0";
- QTest::newRow("ios-sim") << "ios-simulator,ios,darwin,bsd,unix" << "x86_64"
- << "-triple x86_64-apple-ios5.0"
- << "-ios_simulator_version_min 5.0";
+ QTest::newRow("macos x86_64h") << macos << "x86_64h"
+ << "-triple x86_64h-apple-macosx10.12"
+ << "-macosx_version_min 10.12";
+
+ QTest::newRow("ios armv7a") << ios << "armv7a"
+ << "-triple thumbv7-apple-ios6.0"
+ << "-iphoneos_version_min 6.0";
+ QTest::newRow("ios armv7s") << ios << "armv7s"
+ << "-triple thumbv7s-apple-ios7.0"
+ << "-iphoneos_version_min 7.0";
+ QTest::newRow("ios arm64") << ios << "arm64"
+ << "-triple arm64-apple-ios7.0"
+ << "-iphoneos_version_min 7.0";
+ QTest::newRow("ios-simulator x86") << ios_sim << "x86"
+ << "-triple i386-apple-ios6.0"
+ << "-ios_simulator_version_min 6.0";
+ QTest::newRow("ios-simulator x86_64") << ios_sim << "x86_64"
+ << "-triple x86_64-apple-ios7.0"
+ << "-ios_simulator_version_min 7.0";
+
+ QTest::newRow("tvos arm64") << tvos << "arm64"
+ << "-triple arm64-apple-tvos9.0"
+ << "-tvos_version_min 9.0";
+ QTest::newRow("tvos-simulator x86_64") << tvos_sim << "x86_64"
+ << "-triple x86_64-apple-tvos9.0"
+ << "-tvos_simulator_version_min 9.0";
+
+ QTest::newRow("watchos armv7k") << watchos << "armv7k"
+ << "-triple thumbv7k-apple-watchos2.0"
+ << "-watchos_version_min 2.0";
+ QTest::newRow("watchos-simulator x86") << watchos_sim << "x86"
+ << "-triple i386-apple-watchos2.0"
+ << "-watchos_simulator_version_min 2.0";
}
void TestBlackbox::deprecatedProperty()