diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-03-17 10:42:18 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-03-17 10:47:28 +0100 |
commit | 16aead876c46b934acb4c3832a930cac539b36bd (patch) | |
tree | 02f1f7656ec3b036ea6e535af88c746bbdb17384 /src | |
parent | f7993a1a8f7318a737d7d41b18b644b889c3b0df (diff) | |
parent | 72463bbd87044148fcafcdc2c1189aa7a5593cf9 (diff) |
Merge remote-tracking branch 'origin/1.7'
Change-Id: I93ba9e1596e57f35295771054a2f2ac02055a203
Diffstat (limited to 'src')
-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 fed152e10..9618f0c39 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; } |