diff options
| author | Jake Petroules <jake.petroules@petroules.com> | 2013-10-31 17:00:19 -0400 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-11-04 14:17:45 +0100 |
| commit | 1ab65090c921a33b25e43609b43fc0553bd1fcef (patch) | |
| tree | 3bd77cb4a2e173ad5cb9ca2189c0abe691f0e5c2 | |
| parent | f60369a9cc94f934c7814fbd9fa90155434c5578 (diff) | |
| download | qbs-1ab65090c921a33b25e43609b43fc0553bd1fcef.tar.gz | |
Centralize architecture canonicalization data.
Task-number: QBS-403
Change-Id: I814cdc93adafdcdbc66ec6b72fc9e98c6a7b866d
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
| -rw-r--r-- | share/qbs/modules/qbs/common.qbs | 15 | ||||
| -rw-r--r-- | src/app/detect-toolchains/msvcprobe.cpp | 3 | ||||
| -rw-r--r-- | src/app/detect-toolchains/osxprobe.cpp | 2 | ||||
| -rw-r--r-- | src/app/detect-toolchains/probe.cpp | 39 | ||||
| -rw-r--r-- | src/app/detect-toolchains/probe.h | 1 | ||||
| -rw-r--r-- | src/lib/language/builtinvalue.h | 3 | ||||
| -rw-r--r-- | src/lib/language/evaluatorscriptclass.cpp | 13 | ||||
| -rw-r--r-- | src/lib/language/evaluatorscriptclass.h | 2 | ||||
| -rw-r--r-- | src/lib/language/moduleloader.cpp | 2 | ||||
| -rw-r--r-- | src/lib/language/testdata/canonicalArchitecture.qbs | 3 | ||||
| -rw-r--r-- | src/lib/language/tst_language.cpp | 17 | ||||
| -rw-r--r-- | src/lib/language/tst_language.h | 1 | ||||
| -rw-r--r-- | src/lib/tools/hostosinfo.h | 39 |
13 files changed, 87 insertions, 53 deletions
diff --git a/share/qbs/modules/qbs/common.qbs b/share/qbs/modules/qbs/common.qbs index 94d104ac9..ee2fd49c9 100644 --- a/share/qbs/modules/qbs/common.qbs +++ b/share/qbs/modules/qbs/common.qbs @@ -59,17 +59,10 @@ Module { + "You might want to re-run 'qbs detect-toolchains'."); } - var architectureSynonyms = { - "x86": ["i386", "i486", "i586", "i686", "ia32", "ia-32", "x86_32", "x86-32", "intel32"], - "x86_64": ["x86-64", "x64", "amd64", "ia32e", "em64t", "intel64"], - "ia64": ["ia-64", "itanium"] - }; - - for (var arch in architectureSynonyms) { - if (architectureSynonyms[arch].contains(architecture.toLowerCase())) { - throw "qbs.architecture '" + architecture + "' is invalid. " + - "You must use the canonical name '" + arch + "'"; - } + var canonicalArch = canonicalArchitecture(architecture); + if (architecture !== canonicalArch) { + throw "qbs.architecture '" + architecture + "' is invalid. " + + "You must use the canonical name '" + canonicalArch + "'"; } if ((hostOS.contains("windows") || hostOS.contains("osx")) && !hostOSVersion) { diff --git a/src/app/detect-toolchains/msvcprobe.cpp b/src/app/detect-toolchains/msvcprobe.cpp index 0b894ab41..fa42d9efd 100644 --- a/src/app/detect-toolchains/msvcprobe.cpp +++ b/src/app/detect-toolchains/msvcprobe.cpp @@ -33,6 +33,7 @@ #include "../shared/logging/consolelogger.h" #include <logging/translator.h> +#include <tools/hostosinfo.h> #include <tools/profile.h> #include <tools/settings.h> @@ -75,7 +76,7 @@ static void addMSVCPlatform(Settings *settings, QList<Profile> &profiles, QStrin p.setValue("cpp.toolchainInstallPath", installPath); p.setValue("qbs.toolchain", QStringList("msvc")); p.setValue("cpp.windowsSDKPath", winSDKPath); - p.setValue("qbs.architecture", canonicalizeArchitecture(architecture)); + p.setValue("qbs.architecture", Internal::HostOsInfo::canonicalArchitecture(architecture)); profiles << p; } diff --git a/src/app/detect-toolchains/osxprobe.cpp b/src/app/detect-toolchains/osxprobe.cpp index 5aef320fd..63ff00dae 100644 --- a/src/app/detect-toolchains/osxprobe.cpp +++ b/src/app/detect-toolchains/osxprobe.cpp @@ -163,7 +163,7 @@ void OsxProbe::setArch(Profile *profile, const QString &pathToGcc, const QString architecture); profile->setValue("qbs.endianness", endianness); - profile->setValue("qbs.architecture", canonicalizeArchitecture(architecture)); + profile->setValue("qbs.architecture", HostOsInfo::canonicalArchitecture(architecture)); } void OsxProbe::setupDefaultToolchains(const QString &devPath, const QString &xCodeName) diff --git a/src/app/detect-toolchains/probe.cpp b/src/app/detect-toolchains/probe.cpp index 5f440af16..d7c1530bd 100644 --- a/src/app/detect-toolchains/probe.cpp +++ b/src/app/detect-toolchains/probe.cpp @@ -156,7 +156,7 @@ static void specific_probe(Settings *settings, QList<Profile> &profiles, QString profile.removeProfile(); profile.setValue("qbs.toolchain", toolchainTypes); - profile.setValue("qbs.architecture", canonicalizeArchitecture(architecture)); + profile.setValue("qbs.architecture", HostOsInfo::canonicalArchitecture(architecture)); profile.setValue("qbs.endianness", endianness); if (compilerName.contains('-')) { @@ -237,40 +237,3 @@ int probe(Settings *settings) } return 0; } - -QString canonicalizeArchitecture(const QString &arch) -{ - QMap<QString, QStringList> archMap; - archMap.insert(QLatin1String("x86"), QStringList() - << QLatin1String("i386") - << QLatin1String("i486") - << QLatin1String("i586") - << QLatin1String("i686") - << QLatin1String("ia32") - << QLatin1String("ia-32") - << QLatin1String("x86_32") - << QLatin1String("x86-32") - << QLatin1String("intel32")); - - archMap.insert(QLatin1String("x86_64"), QStringList() - << QLatin1String("x86-64") - << QLatin1String("x64") - << QLatin1String("amd64") - << QLatin1String("ia32e") - << QLatin1String("em64t") - << QLatin1String("intel64")); - - archMap.insert(QLatin1String("ia64"), QStringList() - << QLatin1String("ia-64") - << QLatin1String("itanium")); - - QMapIterator<QString, QStringList> i(archMap); - while (i.hasNext()) - { - i.next(); - if (i.value().contains(arch)) - return i.key(); - } - - return arch; -} diff --git a/src/app/detect-toolchains/probe.h b/src/app/detect-toolchains/probe.h index d7f6bc5ec..3c8bf745c 100644 --- a/src/app/detect-toolchains/probe.h +++ b/src/app/detect-toolchains/probe.h @@ -39,6 +39,5 @@ namespace qbs { class Settings; } int probe(qbs::Settings *settings); -QString canonicalizeArchitecture(const QString &arch); #endif // Header guard diff --git a/src/lib/language/builtinvalue.h b/src/lib/language/builtinvalue.h index 429cb276b..0fb58fbf0 100644 --- a/src/lib/language/builtinvalue.h +++ b/src/lib/language/builtinvalue.h @@ -42,7 +42,8 @@ public: { GetNativeSettingFunction, GetEnvFunction, - GetHostOSFunction + GetHostOSFunction, + CanonicalArchitectureFunction }; static BuiltinValuePtr create(Builtin builtin); diff --git a/src/lib/language/evaluatorscriptclass.cpp b/src/lib/language/evaluatorscriptclass.cpp index 55782aa53..38ca7c257 100644 --- a/src/lib/language/evaluatorscriptclass.cpp +++ b/src/lib/language/evaluatorscriptclass.cpp @@ -226,6 +226,7 @@ EvaluatorScriptClass::EvaluatorScriptClass(QScriptEngine *scriptEngine, const Lo m_getNativeSettingBuiltin = scriptEngine->newFunction(js_getNativeSetting, 3); m_getenvBuiltin = scriptEngine->newFunction(js_getenv, 1); m_getHostOSBuiltin = scriptEngine->newFunction(js_getHostOS, 1); + m_canonicalArchitectureBuiltin = scriptEngine->newFunction(js_canonicalArchitecture, 1); } QScriptClass::QueryFlags EvaluatorScriptClass::queryProperty(const QScriptValue &object, @@ -396,6 +397,8 @@ QScriptValue EvaluatorScriptClass::scriptValueForBuiltin(BuiltinValue::Builtin b return m_getenvBuiltin; case BuiltinValue::GetHostOSFunction: return m_getHostOSBuiltin; + case BuiltinValue::CanonicalArchitectureFunction: + return m_canonicalArchitectureBuiltin; } QBS_ASSERT(!"unhandled builtin", ;); return QScriptValue(); @@ -560,5 +563,15 @@ QScriptValue EvaluatorScriptClass::js_getHostOS(QScriptContext *context, QScript return engine->toScriptValue(hostSystem); } +QScriptValue EvaluatorScriptClass::js_canonicalArchitecture(QScriptContext *context, QScriptEngine *engine) +{ + if (Q_UNLIKELY(context->argumentCount() < 1)) { + return context->throwError(QScriptContext::SyntaxError, + QLatin1String("canonicalArchitecture expects 1 argument")); + } + const QString architecture = context->argument(0).toString(); + return engine->toScriptValue(HostOsInfo::canonicalArchitecture(architecture)); +} + } // namespace Internal } // namespace qbs diff --git a/src/lib/language/evaluatorscriptclass.h b/src/lib/language/evaluatorscriptclass.h index d22d2a398..20bd223bc 100644 --- a/src/lib/language/evaluatorscriptclass.h +++ b/src/lib/language/evaluatorscriptclass.h @@ -67,6 +67,7 @@ private: static QScriptValue js_getNativeSetting(QScriptContext *context, QScriptEngine *engine); static QScriptValue js_getenv(QScriptContext *context, QScriptEngine *engine); static QScriptValue js_getHostOS(QScriptContext *context, QScriptEngine *engine); + static QScriptValue js_canonicalArchitecture(QScriptContext *context, QScriptEngine *engine); struct QueryResult { @@ -88,6 +89,7 @@ private: QScriptValue m_getNativeSettingBuiltin; QScriptValue m_getenvBuiltin; QScriptValue m_getHostOSBuiltin; + QScriptValue m_canonicalArchitectureBuiltin; }; } // namespace Internal diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp index 46d5102ca..67a0bc0f6 100644 --- a/src/lib/language/moduleloader.cpp +++ b/src/lib/language/moduleloader.cpp @@ -787,6 +787,8 @@ void ModuleLoader::setupBaseModulePrototype(Item *prototype) BuiltinValue::create(BuiltinValue::GetEnvFunction)); prototype->setProperty(QLatin1String("getHostOS"), BuiltinValue::create(BuiltinValue::GetHostOSFunction)); + prototype->setProperty(QLatin1String("canonicalArchitecture"), + BuiltinValue::create(BuiltinValue::CanonicalArchitectureFunction)); } static void collectItemsWithId_impl(Item *item, QList<Item *> *result) diff --git a/src/lib/language/testdata/canonicalArchitecture.qbs b/src/lib/language/testdata/canonicalArchitecture.qbs new file mode 100644 index 000000000..94da7b276 --- /dev/null +++ b/src/lib/language/testdata/canonicalArchitecture.qbs @@ -0,0 +1,3 @@ +Product { + name: qbs.canonicalArchitecture("i386") +} diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp index 478423032..268711ab0 100644 --- a/src/lib/language/tst_language.cpp +++ b/src/lib/language/tst_language.cpp @@ -191,6 +191,23 @@ void TestLanguage::buildConfigStringListSyntax() QCOMPARE(exceptionCaught, false); } +void TestLanguage::canonicalArchitecture() +{ + bool exceptionCaught = false; + try { + defaultParameters.setProjectFilePath(testProject("canonicalArchitecture.qbs")); + project = loader->loadProject(defaultParameters); + QVERIFY(project); + QHash<QString, ResolvedProductPtr> products = productsFromProject(project); + ResolvedProductPtr product = products.value(QLatin1String("x86")); + QVERIFY(product); + } catch (const ErrorInfo &e) { + exceptionCaught = true; + qDebug() << e.toString(); + } + QCOMPARE(exceptionCaught, false); +} + void TestLanguage::conditionalDepends() { bool exceptionCaught = false; diff --git a/src/lib/language/tst_language.h b/src/lib/language/tst_language.h index 87e305282..f591a4df1 100644 --- a/src/lib/language/tst_language.h +++ b/src/lib/language/tst_language.h @@ -68,6 +68,7 @@ private slots: void baseProperty(); void buildConfigStringListSyntax(); + void canonicalArchitecture(); void conditionalDepends(); void environmentVariable(); void erroneousFiles_data(); diff --git a/src/lib/tools/hostosinfo.h b/src/lib/tools/hostosinfo.h index ad9fa5858..5704886ad 100644 --- a/src/lib/tools/hostosinfo.h +++ b/src/lib/tools/hostosinfo.h @@ -33,7 +33,9 @@ #include "qbs_export.h" #include <QtGlobal> +#include <QMap> #include <QString> +#include <QStringList> #if defined(Q_OS_WIN) #define QTC_HOST_EXE_SUFFIX ".exe" @@ -67,6 +69,7 @@ public: static bool isLinuxHost() { return hostOs() == HostOsLinux; } static bool isOsxHost() { return hostOs() == HostOsOsx; } static inline bool isAnyUnixHost(); + static inline QString canonicalArchitecture(const QString &architecture); static QString appendExecutableSuffix(const QString &executable) { @@ -127,6 +130,42 @@ bool HostOsInfo::isAnyUnixHost() #endif } +QString HostOsInfo::canonicalArchitecture(const QString &architecture) +{ + QMap<QString, QStringList> archMap; + archMap.insert(QLatin1String("x86"), QStringList() + << QLatin1String("i386") + << QLatin1String("i486") + << QLatin1String("i586") + << QLatin1String("i686") + << QLatin1String("ia32") + << QLatin1String("ia-32") + << QLatin1String("x86_32") + << QLatin1String("x86-32") + << QLatin1String("intel32")); + + archMap.insert(QLatin1String("x86_64"), QStringList() + << QLatin1String("x86-64") + << QLatin1String("x64") + << QLatin1String("amd64") + << QLatin1String("ia32e") + << QLatin1String("em64t") + << QLatin1String("intel64")); + + archMap.insert(QLatin1String("ia64"), QStringList() + << QLatin1String("ia-64") + << QLatin1String("itanium")); + + QMapIterator<QString, QStringList> i(archMap); + while (i.hasNext()) { + i.next(); + if (i.value().contains(architecture.toLower())) + return i.key(); + } + + return architecture; +} + } // namespace Internal } // namespace qbs |
