aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/jsextensions
diff options
context:
space:
mode:
authorIvan Komissarov <ABBAPOH@gmail.com>2020-02-02 07:06:57 +0100
committerIvan Komissarov <ABBAPOH@gmail.com>2020-02-14 18:19:21 +0000
commit5adf0d5e8928c1d195d0725195fda86c21e88598 (patch)
treedefac862563935ec37ecd556a5e00e045fe6d1ca /src/lib/corelib/jsextensions
parentbc01b6cc3dc1ee77cfcc3438d8e0d8985016cb65 (diff)
Autotedect MSVC compiler by using a probe
This allows to build projects without calling "qbs setup-toolchains" first by simply calling "qbs build". Change-Id: Iba4af8bf77d0ee5d209564ea371328d3c6cf2aa2 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/lib/corelib/jsextensions')
-rw-r--r--src/lib/corelib/jsextensions/utilitiesextension.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/lib/corelib/jsextensions/utilitiesextension.cpp b/src/lib/corelib/jsextensions/utilitiesextension.cpp
index 80ff6539e..2d29cb7c5 100644
--- a/src/lib/corelib/jsextensions/utilitiesextension.cpp
+++ b/src/lib/corelib/jsextensions/utilitiesextension.cpp
@@ -110,6 +110,7 @@ public:
static QScriptValue js_signingIdentities(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_msvcCompilerInfo(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_clangClCompilerInfo(QScriptContext *context, QScriptEngine *engine);
+ static QScriptValue js_installedMSVCs(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_versionCompare(QScriptContext *context, QScriptEngine *engine);
@@ -551,6 +552,43 @@ QScriptValue UtilitiesExtension::js_clangClCompilerInfo(QScriptContext *context,
#endif
}
+QScriptValue UtilitiesExtension::js_installedMSVCs(QScriptContext *context, QScriptEngine *engine)
+{
+#ifndef Q_OS_WIN
+ Q_UNUSED(engine);
+ return context->throwError(QScriptContext::UnknownError,
+ QStringLiteral("installedMSVCs is not available on this platform"));
+#else
+ if (Q_UNLIKELY(context->argumentCount() != 1)) {
+ return context->throwError(QScriptContext::SyntaxError,
+ QStringLiteral("installedMSVCs expects 1 arguments"));
+ }
+
+ const auto value0 = context->argument(0);
+ const auto hostArch = QString::fromStdString(HostOsInfo::hostOSArchitecture());
+ const auto preferredArch = !value0.isNull() && !value0.isUndefined()
+ ? value0.toString()
+ : hostArch;
+
+ class LogSink : public ILogSink {
+ void doPrintMessage(LoggerLevel, const QString &, const QString &) override { }
+ } dummySink;
+ Logger dummyLogger(&dummySink);
+ auto msvcs = MSVC::installedCompilers(dummyLogger);
+
+ const auto predicate = [&preferredArch, &hostArch](const MSVC &msvc)
+ {
+ auto archPair = MSVC::getHostTargetArchPair(msvc.architecture);
+ return archPair.first != hostArch || preferredArch != archPair.second;
+ };
+ msvcs.erase(std::remove_if(msvcs.begin(), msvcs.end(), predicate), msvcs.end());
+ QVariantList result;
+ for (const auto &msvc: msvcs)
+ result.append(msvc.toVariantMap());
+ return engine->toScriptValue(result);
+#endif
+}
+
QScriptValue UtilitiesExtension::js_versionCompare(QScriptContext *context, QScriptEngine *engine)
{
if (context->argumentCount() == 2) {
@@ -851,6 +889,8 @@ void initializeJsExtensionUtilities(QScriptValue extensionObject)
engine->newFunction(UtilitiesExtension::js_msvcCompilerInfo, 1));
environmentObj.setProperty(QStringLiteral("clangClCompilerInfo"),
engine->newFunction(UtilitiesExtension::js_clangClCompilerInfo, 1));
+ environmentObj.setProperty(QStringLiteral("installedMSVCs"),
+ engine->newFunction(UtilitiesExtension::js_installedMSVCs, 1));
environmentObj.setProperty(QStringLiteral("versionCompare"),
engine->newFunction(UtilitiesExtension::js_versionCompare, 2));
environmentObj.setProperty(QStringLiteral("qmlTypeInfo"),