diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2019-09-26 14:53:18 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-09-26 15:00:16 +0200 |
commit | fd88c40291275032f730693facee6f7758bf5992 (patch) | |
tree | 55269b9ab504ae7b7835232dd67aef1ce1deffea /src/app | |
parent | e86375117120f8c7b06afa573d9772d3c783f737 (diff) | |
parent | 94fe404a5a6d7cf91926bcfbd026953994b25815 (diff) |
Merge 1.14 into master
Change-Id: Ie432987ee2d3ccaa6e881b1b01f142185eddabd8
Diffstat (limited to 'src/app')
-rw-r--r-- | src/app/qbs-setup-toolchains/sdccprobe.cpp | 60 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/sdccprobe.h | 14 |
2 files changed, 56 insertions, 18 deletions
diff --git a/src/app/qbs-setup-toolchains/sdccprobe.cpp b/src/app/qbs-setup-toolchains/sdccprobe.cpp index e916a405b..eccd3ccae 100644 --- a/src/app/qbs-setup-toolchains/sdccprobe.cpp +++ b/src/app/qbs-setup-toolchains/sdccprobe.cpp @@ -192,26 +192,50 @@ static std::vector<ToolchainInstallInfo> installedSdccsFromRegistry() std::vector<ToolchainInstallInfo> infos; if (HostOsInfo::isWindowsHost()) { - -#ifdef Q_OS_WIN64 - static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\SDCC"; -#else - static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\SDCC"; -#endif - - QSettings registry(QLatin1String(kRegistryNode), QSettings::NativeFormat); - QString rootPath = registry.value(QStringLiteral("Default")).toString(); - if (!rootPath.isEmpty()) { + // Tries to detect the candidate from the 32-bit + // or 64-bit system registry format. + auto probeSdccToolchainInfo = [](QSettings::Format format) { + SdccInstallInfo info; + QSettings registry(QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\SDCC"), + format); + const QString rootPath = registry.value(QStringLiteral("Default")) + .toString(); + if (rootPath.isEmpty()) + return info; // Build full compiler path. const QFileInfo sdccPath(rootPath + QLatin1String("\\bin\\sdcc.exe")); - if (sdccPath.exists()) { - // Build compiler version. - const QString version = QStringLiteral("%1.%2.%3").arg( - registry.value(QStringLiteral("VersionMajor")).toString(), - registry.value(QStringLiteral("VersionMinor")).toString(), - registry.value(QStringLiteral("VersionRevision")).toString()); - infos.push_back({sdccPath, Version::fromString(version)}); - } + if (!sdccPath.exists()) + return info; + info.compilerPath = sdccPath.filePath(); + // Build compiler version. + const QString version = QStringLiteral("%1.%2.%3").arg( + registry.value(QStringLiteral("VersionMajor")).toString(), + registry.value(QStringLiteral("VersionMinor")).toString(), + registry.value(QStringLiteral("VersionRevision")).toString()); + info.version = version; + return info; + }; + + static constexpr QSettings::Format allowedFormats[] = { + QSettings::NativeFormat, +#ifdef Q_OS_WIN + QSettings::Registry32Format, + QSettings::Registry64Format, +#endif + }; + + for (const QSettings::Format format : allowedFormats) { + const SdccInstallInfo candidate = probeSdccToolchainInfo(format); + if (candidate.compilerPath.isEmpty()) + continue; + const auto infosEnd = infos.cend(); + const auto infosIt = std::find_if(infos.cbegin(), infosEnd, + [candidate](const ToolchainInstallInfo &info) { + return candidate == SdccInstallInfo{ + info.compilerPath.filePath(), info.compilerVersion.toString()}; + }); + if (infosIt == infosEnd) + infos.push_back({candidate.compilerPath, Version::fromString(candidate.version)}); } } diff --git a/src/app/qbs-setup-toolchains/sdccprobe.h b/src/app/qbs-setup-toolchains/sdccprobe.h index 5fad90e96..aa2c613f3 100644 --- a/src/app/qbs-setup-toolchains/sdccprobe.h +++ b/src/app/qbs-setup-toolchains/sdccprobe.h @@ -42,6 +42,8 @@ #include <QtCore/qlist.h> +#include <tuple> + QT_BEGIN_NAMESPACE class QFileInfo; QT_END_NAMESPACE @@ -51,6 +53,18 @@ class Profile; class Settings; } +struct SdccInstallInfo +{ + QString compilerPath; + QString version; +}; + +inline bool operator==(const SdccInstallInfo &lhs, const SdccInstallInfo &rhs) +{ + return std::tie(lhs.compilerPath, lhs.version) + == std::tie(rhs.compilerPath, rhs.version); +} + bool isSdccCompiler(const QString &compilerName); void createSdccProfile(const QFileInfo &compiler, qbs::Settings *settings, |