diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-03-15 17:04:02 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-03-16 12:55:15 +0000 |
commit | 72463bbd87044148fcafcdc2c1189aa7a5593cf9 (patch) | |
tree | f414572521a91ce2d219967c8ece3d7ea4534beb | |
parent | 01eb6c948f13d33e1373251de7ca2262916766b8 (diff) |
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 <loaden@gmail.com>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | src/app/qbs-setup-toolchains/msvcprobe.cpp | 66 |
1 files 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<MSVC> installedMSVCs() +struct MSVCRegistryEntry { - QVector<MSVC> msvcs; + QString version; + QString installDir; +}; + +static QVector<MSVCRegistryEntry> installedMSVCsFromRegistry() +{ + QVector<MSVCRegistryEntry> 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<MSVC> installedMSVCs() +{ + QVector<MSVC> msvcs; + const QVector<MSVCRegistryEntry> ®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; } |