aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2019-09-23 16:21:47 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2019-09-23 19:55:56 +0000
commita1ab897a8be63af3de3f97724ee6fede6ba2bc3a (patch)
tree4609551912dcd77f0784afc53dda4b0c47081d7a
parent713c9d8b5dfec9548fb89e1d45b063b7250bdf4f (diff)
baremetal: Fix auto detection of SDCC toolchain on Windows
The SDCC toolchain package can be provided as 32-bit or as 64-bit installer. If the SDCC 64-bit package will be installed on the 32-bit Windows, then it will not be found in the system registry, because we use the QSettings::NativeFormat. So, we need to check the data for the 32-bit and 64-bit registry sequentially. Change-Id: I15981f39274308e3690cf072396cf1ae82b6743d Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--src/app/qbs-setup-toolchains/sdccprobe.cpp59
-rw-r--r--src/app/qbs-setup-toolchains/sdccprobe.h8
2 files changed, 49 insertions, 18 deletions
diff --git a/src/app/qbs-setup-toolchains/sdccprobe.cpp b/src/app/qbs-setup-toolchains/sdccprobe.cpp
index 751e872ee..87c616ff0 100644
--- a/src/app/qbs-setup-toolchains/sdccprobe.cpp
+++ b/src/app/qbs-setup-toolchains/sdccprobe.cpp
@@ -108,26 +108,49 @@ static std::vector<SdccInstallInfo> installedSdccsFromRegistry()
std::vector<SdccInstallInfo> 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.absoluteFilePath(), 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 SdccInstallInfo &info) {
+ return candidate == info;
+ });
+ if (infosIt == infosEnd)
+ infos.push_back(candidate);
}
}
diff --git a/src/app/qbs-setup-toolchains/sdccprobe.h b/src/app/qbs-setup-toolchains/sdccprobe.h
index 7f4219b5a..55062ff19 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
@@ -57,6 +59,12 @@ struct SdccInstallInfo
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,