diff options
-rw-r--r-- | share/qbs/imports/qbs/ModUtils/utils.js | 2 | ||||
-rw-r--r-- | share/qbs/modules/cpp/GenericGCC.qbs | 3 | ||||
-rw-r--r-- | share/qbs/modules/java/utils.js | 4 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/xcodeprobe.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/jsextensions/utilitiesextension.cpp | 24 | ||||
-rw-r--r-- | src/lib/corelib/tools/architectures.cpp | 23 | ||||
-rw-r--r-- | src/lib/corelib/tools/architectures.h | 5 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/deploymentTarget/deployment.qbs | 13 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.cpp | 53 |
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() |