aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2017-03-15 17:04:02 +0100
committerJoerg Bornemann <joerg.bornemann@qt.io>2017-03-16 12:55:15 +0000
commit72463bbd87044148fcafcdc2c1189aa7a5593cf9 (patch)
treef414572521a91ce2d219967c8ece3d7ea4534beb
parent01eb6c948f13d33e1373251de7ca2262916766b8 (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.cpp66
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> &registryEntries = installedMSVCsFromRegistry();
+ for (const MSVCRegistryEntry &registryEntry : 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;
}