aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2019-07-26 16:57:44 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2019-07-26 16:57:44 +0200
commitd46b40d27ebc9bcbdb4430893396f066e1f2d758 (patch)
tree28f269505091363139945284ec77dd2636a12290 /src
parent7ead994c8a3e263c4cced6f54f0d959d32268454 (diff)
parent2269ddc60e47bfea459ef034ab1be112716b4764 (diff)
Merge 1.14 into master
Diffstat (limited to 'src')
-rw-r--r--src/app/qbs-setup-toolchains/clangclprobe.cpp46
-rw-r--r--src/lib/corelib/language/jsimports.h3
-rw-r--r--src/lib/corelib/language/language.cpp2
-rw-r--r--src/lib/corelib/language/resolvedfilecontext.cpp2
-rw-r--r--src/lib/corelib/tools/qttools.h15
-rw-r--r--src/plugins/scanner/cpp/cppscanner.cpp16
6 files changed, 70 insertions, 14 deletions
diff --git a/src/app/qbs-setup-toolchains/clangclprobe.cpp b/src/app/qbs-setup-toolchains/clangclprobe.cpp
index a54705510..816d28546 100644
--- a/src/app/qbs-setup-toolchains/clangclprobe.cpp
+++ b/src/app/qbs-setup-toolchains/clangclprobe.cpp
@@ -117,6 +117,46 @@ QString findCompatibleVcsarsallBat()
return {};
}
+QString wow6432Key()
+{
+#ifdef Q_OS_WIN64
+ return QStringLiteral("\\Wow6432Node");
+#else
+ return {};
+#endif
+}
+
+QString findClangCl()
+{
+ const auto compilerName = HostOsInfo::appendExecutableSuffix(QStringLiteral("clang-cl"));
+ const auto compilerFromPath = findExecutable(compilerName);
+ if (!compilerFromPath.isEmpty())
+ return compilerFromPath;
+
+ const QSettings registry(
+ QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE%1\\LLVM\\LLVM").arg(wow6432Key()),
+ QSettings::NativeFormat);
+ const auto key = QStringLiteral(".");
+ if (registry.contains(key)) {
+ const auto compilerPath = QDir::fromNativeSeparators(registry.value(key).toString())
+ + QStringLiteral("/bin/") + compilerName;
+ if (QFileInfo(compilerPath).exists())
+ return compilerPath;
+ }
+
+ // this branch can be useful in case user had two LLVM installations (e.g. 32bit & 64bit)
+ // but uninstalled one - in that case, registry will be empty
+ static const char * const envVarCandidates[] = {"ProgramFiles", "ProgramFiles(x86)"};
+ for (const auto &envVar : envVarCandidates) {
+ const auto value
+ = QDir::fromNativeSeparators(QString::fromLocal8Bit(qgetenv(envVar)));
+ const auto compilerPath = value + QStringLiteral("/LLVM/bin/") + compilerName;
+ if (QFileInfo(compilerPath).exists())
+ return compilerPath;
+ }
+ return {};
+}
+
} // namespace
void createClangClProfile(const QFileInfo &compiler, Settings *settings,
@@ -144,12 +184,12 @@ void clangClProbe(Settings *settings, QList<Profile> &profiles)
{
const auto compilerName = QStringLiteral("clang-cl");
qbsInfo() << Tr::tr("Trying to detect %1...").arg(compilerName);
- const QFileInfo compiler = findExecutable(HostOsInfo::appendExecutableSuffix(compilerName));
- if (!compiler.exists()) {
+ const QString compilerFilePath = findClangCl();
+ if (compilerFilePath.isEmpty()) {
qbsInfo() << Tr::tr("%1 was not found.").arg(compilerName);
return;
}
-
+ const QFileInfo compiler(compilerFilePath);
const auto vcvarsallPath = findCompatibleVcsarsallBat();
if (vcvarsallPath.isEmpty()) {
qbsWarning()
diff --git a/src/lib/corelib/language/jsimports.h b/src/lib/corelib/language/jsimports.h
index ebde70b7b..a892e0ec0 100644
--- a/src/lib/corelib/language/jsimports.h
+++ b/src/lib/corelib/language/jsimports.h
@@ -42,6 +42,7 @@
#include <tools/codelocation.h>
#include <tools/persistence.h>
+#include <tools/qttools.h>
#include <QtCore/qhash.h>
#include <QtCore/qstringlist.h>
@@ -79,7 +80,7 @@ inline bool operator<(const JsImport &lhs, const JsImport &rhs)
inline bool operator==(const JsImport &jsi1, const JsImport &jsi2)
{
- return jsi1.scopeName == jsi2.scopeName && jsi1.filePaths.toSet() == jsi2.filePaths.toSet();
+ return jsi1.scopeName == jsi2.scopeName && toSet(jsi1.filePaths) == toSet(jsi2.filePaths);
}
using JsImports = std::vector<JsImport>;
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp
index d888700c5..40549b836 100644
--- a/src/lib/corelib/language/language.cpp
+++ b/src/lib/corelib/language/language.cpp
@@ -241,7 +241,7 @@ bool operator==(const ResolvedModule &m1, const ResolvedModule &m2)
{
return m1.name == m2.name
&& m1.isProduct == m2.isProduct
- && m1.moduleDependencies.toSet() == m2.moduleDependencies.toSet()
+ && toSet(m1.moduleDependencies) == toSet(m2.moduleDependencies)
&& m1.setupBuildEnvironmentScript == m2.setupBuildEnvironmentScript
&& m1.setupRunEnvironmentScript == m2.setupRunEnvironmentScript;
}
diff --git a/src/lib/corelib/language/resolvedfilecontext.cpp b/src/lib/corelib/language/resolvedfilecontext.cpp
index f1151f98f..db63a8ef4 100644
--- a/src/lib/corelib/language/resolvedfilecontext.cpp
+++ b/src/lib/corelib/language/resolvedfilecontext.cpp
@@ -53,7 +53,7 @@ ResolvedFileContext::ResolvedFileContext(const FileContextBase &ctx)
bool operator==(const ResolvedFileContext &a, const ResolvedFileContext &b)
{
return a.filePath() == b.filePath()
- && a.jsExtensions().toSet() == b.jsExtensions().toSet()
+ && toSet(a.jsExtensions()) == toSet(b.jsExtensions())
&& sorted(a.jsImports()) == sorted(b.jsImports());
}
diff --git a/src/lib/corelib/tools/qttools.h b/src/lib/corelib/tools/qttools.h
index b465e3d9e..c3b4d3a9f 100644
--- a/src/lib/corelib/tools/qttools.h
+++ b/src/lib/corelib/tools/qttools.h
@@ -70,4 +70,19 @@ uint qHash(const QStringList &list);
uint qHash(const QProcessEnvironment &env);
QT_END_NAMESPACE
+namespace qbs {
+
+template <class T>
+QSet<T> toSet(const QList<T> &list)
+{
+#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
+ return list.toSet();
+#else
+ return QSet<T>(list.begin(), list.end());
+#endif
+}
+
+} // namespace qbs
+
+
#endif // QBSQTTOOLS_H
diff --git a/src/plugins/scanner/cpp/cppscanner.cpp b/src/plugins/scanner/cpp/cppscanner.cpp
index 067127d00..cbab8a012 100644
--- a/src/plugins/scanner/cpp/cppscanner.cpp
+++ b/src/plugins/scanner/cpp/cppscanner.cpp
@@ -126,7 +126,7 @@ public:
{
}
- bool equals(const Token &tk, const QLatin1Literal &literal) const
+ bool equals(const Token &tk, const QLatin1String &literal) const
{
return static_cast<int>(tk.length()) == literal.size()
&& memcmp(m_fileContent + tk.begin(), literal.data(), literal.size()) == 0;
@@ -136,13 +136,13 @@ public:
static void scanCppFile(void *opaq, CPlusPlus::Lexer &yylex, bool scanForFileTags,
bool scanForDependencies)
{
- const QLatin1Literal includeLiteral("include");
- const QLatin1Literal importLiteral("import");
- const QLatin1Literal defineLiteral("define");
- const QLatin1Literal qobjectLiteral("Q_OBJECT");
- const QLatin1Literal qgadgetLiteral("Q_GADGET");
- const QLatin1Literal qnamespaceLiteral("Q_NAMESPACE");
- const QLatin1Literal pluginMetaDataLiteral("Q_PLUGIN_METADATA");
+ const QLatin1String includeLiteral("include");
+ const QLatin1String importLiteral("import");
+ const QLatin1String defineLiteral("define");
+ const QLatin1String qobjectLiteral("Q_OBJECT");
+ const QLatin1String qgadgetLiteral("Q_GADGET");
+ const QLatin1String qnamespaceLiteral("Q_NAMESPACE");
+ const QLatin1String pluginMetaDataLiteral("Q_PLUGIN_METADATA");
const auto opaque = static_cast<Opaq *>(opaq);
const TokenComparator tc(opaque->fileContent);
Token tk;