From 72463bbd87044148fcafcdc2c1189aa7a5593cf9 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Wed, 15 Mar 2017 17:04:02 +0100 Subject: Fix setup-toolchains for Visual C++ Build Tools The VC Build Tools can be found in a slightly different location than the Visual Studio registry entries. Task-number: QBS-1114 Change-Id: Ib7dea5e5883271f55371383996e0641e270f3585 Reviewed-by: Yuchen Deng Reviewed-by: Christian Kandeler --- src/app/qbs-setup-toolchains/msvcprobe.cpp | 66 ++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/src/app/qbs-setup-toolchains/msvcprobe.cpp b/src/app/qbs-setup-toolchains/msvcprobe.cpp index 993e12377..0f0849852 100644 --- a/src/app/qbs-setup-toolchains/msvcprobe.cpp +++ b/src/app/qbs-setup-toolchains/msvcprobe.cpp @@ -148,28 +148,76 @@ static QString wow6432Key() #endif } -static QVector installedMSVCs() +struct MSVCRegistryEntry { - QVector msvcs; + QString version; + QString installDir; +}; + +static QVector installedMSVCsFromRegistry() +{ + QVector result; + + // Detect Visual Studio const QSettings vsRegistry( - QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE") + wow6432Key() - + QLatin1String("\\Microsoft\\VisualStudio\\SxS\\VS7"), + QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE") + wow6432Key() + + QStringLiteral("\\Microsoft\\VisualStudio\\SxS\\VS7"), QSettings::NativeFormat); foreach (const QString &vsName, vsRegistry.childKeys()) { + MSVCRegistryEntry entry; + entry.version = vsName; + entry.installDir = vsRegistry.value(vsName).toString(); + result.append(entry); + } + + // Detect Visual C++ Build Tools + QSettings vcbtRegistry( + QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE") + wow6432Key() + + QStringLiteral("\\Microsoft\\VisualCppBuildTools"), + QSettings::NativeFormat); + const QStringList &vcbtRegistryChildGroups = vcbtRegistry.childGroups(); + for (const QString &childGroup : vcbtRegistryChildGroups) { + vcbtRegistry.beginGroup(childGroup); + bool ok; + int installed = vcbtRegistry.value(QStringLiteral("Installed")).toInt(&ok); + if (ok && installed) { + MSVCRegistryEntry entry; + entry.version = childGroup; + const QSettings vsRegistry( + QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE") + wow6432Key() + + QStringLiteral("\\Microsoft\\VisualStudio\\") + childGroup + + QStringLiteral("\\Setup\\VC"), + QSettings::NativeFormat); + entry.installDir = vsRegistry.value(QStringLiteral("ProductDir")).toString(); + result.append(entry); + } + vcbtRegistry.endGroup(); + } + + return result; +} + +static QVector installedMSVCs() +{ + QVector msvcs; + const QVector ®istryEntries = installedMSVCsFromRegistry(); + for (const MSVCRegistryEntry ®istryEntry : registryEntries) { MSVC msvc; - msvc.internalVsVersion = Version::fromString(vsName); + msvc.internalVsVersion = Version::fromString(registryEntry.version); if (!msvc.internalVsVersion.isValid()) continue; - QDir vsInstallDir(vsRegistry.value(vsName).toString()); + QDir vsInstallDir(registryEntry.installDir); msvc.vsInstallPath = vsInstallDir.absolutePath(); - if (!vsInstallDir.cd(QStringLiteral("VC"))) + if (vsInstallDir.dirName() != QStringLiteral("VC") + && !vsInstallDir.cd(QStringLiteral("VC"))) { continue; + } msvc.version = QString::number(Internal::VisualStudioVersionInfo( - Internal::Version::fromString(vsName)).marketingVersion()); + Internal::Version::fromString(registryEntry.version)).marketingVersion()); if (msvc.version.isEmpty()) { - qbsWarning() << Tr::tr("Unknown MSVC version %1 found.").arg(vsName); + qbsWarning() << Tr::tr("Unknown MSVC version %1 found.").arg(registryEntry.version); continue; } -- cgit v1.2.3