diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2019-07-26 16:57:44 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-07-26 16:57:44 +0200 |
commit | d46b40d27ebc9bcbdb4430893396f066e1f2d758 (patch) | |
tree | 28f269505091363139945284ec77dd2636a12290 /src | |
parent | 7ead994c8a3e263c4cced6f54f0d959d32268454 (diff) | |
parent | 2269ddc60e47bfea459ef034ab1be112716b4764 (diff) |
Merge 1.14 into master
Change-Id: Ic632b377bf10e2b320956011e9a7d4eea99f560b
Diffstat (limited to 'src')
-rw-r--r-- | src/app/qbs-setup-toolchains/clangclprobe.cpp | 46 | ||||
-rw-r--r-- | src/lib/corelib/language/jsimports.h | 3 | ||||
-rw-r--r-- | src/lib/corelib/language/language.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/resolvedfilecontext.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/tools/qttools.h | 15 | ||||
-rw-r--r-- | src/plugins/scanner/cpp/cppscanner.cpp | 16 |
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; |