summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@petroules.com>2013-10-31 17:00:19 -0400
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-11-04 14:17:45 +0100
commit1ab65090c921a33b25e43609b43fc0553bd1fcef (patch)
tree3bd77cb4a2e173ad5cb9ca2189c0abe691f0e5c2
parentf60369a9cc94f934c7814fbd9fa90155434c5578 (diff)
downloadqbs-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.qbs15
-rw-r--r--src/app/detect-toolchains/msvcprobe.cpp3
-rw-r--r--src/app/detect-toolchains/osxprobe.cpp2
-rw-r--r--src/app/detect-toolchains/probe.cpp39
-rw-r--r--src/app/detect-toolchains/probe.h1
-rw-r--r--src/lib/language/builtinvalue.h3
-rw-r--r--src/lib/language/evaluatorscriptclass.cpp13
-rw-r--r--src/lib/language/evaluatorscriptclass.h2
-rw-r--r--src/lib/language/moduleloader.cpp2
-rw-r--r--src/lib/language/testdata/canonicalArchitecture.qbs3
-rw-r--r--src/lib/language/tst_language.cpp17
-rw-r--r--src/lib/language/tst_language.h1
-rw-r--r--src/lib/tools/hostosinfo.h39
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