aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/jsextensions
diff options
context:
space:
mode:
authorIvan Komissarov <ABBAPOH@gmail.com>2020-02-12 16:53:00 +0100
committerIvan Komissarov <ABBAPOH@gmail.com>2020-02-17 10:26:13 +0000
commitff53ff1fda2689e71b9d0d8ec73e55f414a78f79 (patch)
tree767c915f21e88e10efe7e427ab01d6c3a600692a /src/lib/corelib/jsextensions
parentab2dd5f1b20f07f2734267095af9b9deaede7079 (diff)
Autodetect clang-cl by using Probe
This allows to build projects without calling "qbs setup-toolchains" first by simply calling "qbs build qbs.toolchainType:clang-cl" Change-Id: I86d135ddf2cb588f322709e4e7a265cb6fd7772f Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/lib/corelib/jsextensions')
-rw-r--r--src/lib/corelib/jsextensions/utilitiesextension.cpp44
1 files changed, 40 insertions, 4 deletions
diff --git a/src/lib/corelib/jsextensions/utilitiesextension.cpp b/src/lib/corelib/jsextensions/utilitiesextension.cpp
index 2d29cb7c5..6c693cb61 100644
--- a/src/lib/corelib/jsextensions/utilitiesextension.cpp
+++ b/src/lib/corelib/jsextensions/utilitiesextension.cpp
@@ -72,6 +72,7 @@ struct fat_arch_64 {
#ifdef Q_OS_WIN
+#include <tools/clangclinfo.h>
#include <tools/msvcinfo.h>
#include <tools/vsenvironmentdetector.h>
#endif
@@ -88,6 +89,10 @@ struct fat_arch_64 {
namespace qbs {
namespace Internal {
+class DummyLogSink : public ILogSink {
+ void doPrintMessage(LoggerLevel, const QString &, const QString &) override { }
+};
+
class UtilitiesExtension : public QObject, QScriptable
{
Q_OBJECT
@@ -111,6 +116,7 @@ public:
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_installedClangCls(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_versionCompare(QScriptContext *context, QScriptEngine *engine);
@@ -530,7 +536,11 @@ QScriptValue UtilitiesExtension::js_clangClCompilerInfo(QScriptContext *context,
QStringLiteral("clangClCompilerInfo expects 4 arguments"));
const QString compilerFilePath = context->argument(0).toString();
- QString arch = context->argument(1).toString();
+ // architecture cannot be empty as vcvarsall.bat requires at least 1 arg, so fallback
+ // to host architecture if none is present
+ QString arch = !context->argument(1).isNull() && !context->argument(1).isUndefined()
+ ? context->argument(1).toString()
+ : QString::fromStdString(HostOsInfo::hostOSArchitecture());
QString vcvarsallPath = context->argument(2).toString();
const QString compilerLanguage = context->argumentCount() > 3
? context->argument(3).toString()
@@ -570,9 +580,7 @@ QScriptValue UtilitiesExtension::js_installedMSVCs(QScriptContext *context, QScr
? value0.toString()
: hostArch;
- class LogSink : public ILogSink {
- void doPrintMessage(LoggerLevel, const QString &, const QString &) override { }
- } dummySink;
+ DummyLogSink dummySink;
Logger dummyLogger(&dummySink);
auto msvcs = MSVC::installedCompilers(dummyLogger);
@@ -589,6 +597,32 @@ QScriptValue UtilitiesExtension::js_installedMSVCs(QScriptContext *context, QScr
#endif
}
+QScriptValue UtilitiesExtension::js_installedClangCls(
+ QScriptContext *context, QScriptEngine *engine)
+{
+#ifndef Q_OS_WIN
+ Q_UNUSED(engine);
+ return context->throwError(QScriptContext::UnknownError,
+ QStringLiteral("installedClangCls is not available on this platform"));
+#else
+ if (Q_UNLIKELY(context->argumentCount() != 1)) {
+ return context->throwError(QScriptContext::SyntaxError,
+ QStringLiteral("installedClangCls expects 1 arguments"));
+ }
+
+ const auto value0 = context->argument(0);
+ const auto path = !value0.isNull() && !value0.isUndefined() ? value0.toString() : QString();
+
+ DummyLogSink dummySink;
+ Logger dummyLogger(&dummySink);
+ auto compilers = ClangClInfo::installedCompilers({path}, dummyLogger);
+ QVariantList result;
+ for (const auto &compiler: compilers)
+ result.append(compiler.toVariantMap());
+ return engine->toScriptValue(result);
+#endif
+}
+
QScriptValue UtilitiesExtension::js_versionCompare(QScriptContext *context, QScriptEngine *engine)
{
if (context->argumentCount() == 2) {
@@ -891,6 +925,8 @@ void initializeJsExtensionUtilities(QScriptValue extensionObject)
engine->newFunction(UtilitiesExtension::js_clangClCompilerInfo, 1));
environmentObj.setProperty(QStringLiteral("installedMSVCs"),
engine->newFunction(UtilitiesExtension::js_installedMSVCs, 1));
+ environmentObj.setProperty(QStringLiteral("installedClangCls"),
+ engine->newFunction(UtilitiesExtension::js_installedClangCls, 1));
environmentObj.setProperty(QStringLiteral("versionCompare"),
engine->newFunction(UtilitiesExtension::js_versionCompare, 2));
environmentObj.setProperty(QStringLiteral("qmlTypeInfo"),