aboutsummaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2016-11-29 15:42:34 +0100
committerJoerg Bornemann <joerg.bornemann@qt.io>2016-12-02 12:48:04 +0000
commitd66fe82e645fc42c00c3aef720b22691443764c1 (patch)
tree7270999778a0668dd642af58f140290b97217dc6 /src/app
parent4be3a8c2634c57589ff5521d6dbdf5e8c5f9fbcf (diff)
Add VS 2017 support
Task-number: QBS-1025 Change-Id: Ib08373b6b45fa0b728e68466d08d43a14f864d72 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/app')
-rw-r--r--src/app/qbs-setup-qt/setupqt.cpp2
-rw-r--r--src/app/qbs-setup-toolchains/msvcprobe.cpp137
2 files changed, 101 insertions, 38 deletions
diff --git a/src/app/qbs-setup-qt/setupqt.cpp b/src/app/qbs-setup-qt/setupqt.cpp
index 25dd233be..b9531566a 100644
--- a/src/app/qbs-setup-qt/setupqt.cpp
+++ b/src/app/qbs-setup-qt/setupqt.cpp
@@ -427,6 +427,8 @@ static Version msvcCompilerVersionForYear(int year)
return Version(18);
case 2015:
return Version(19);
+ case 2017:
+ return Version(19, 1);
default:
return Version();
}
diff --git a/src/app/qbs-setup-toolchains/msvcprobe.cpp b/src/app/qbs-setup-toolchains/msvcprobe.cpp
index e956b20bc..bb1838f2b 100644
--- a/src/app/qbs-setup-toolchains/msvcprobe.cpp
+++ b/src/app/qbs-setup-toolchains/msvcprobe.cpp
@@ -48,6 +48,7 @@
#include <tools/msvcinfo.h>
#include <tools/profile.h>
#include <tools/settings.h>
+#include <tools/version.h>
#include <tools/visualstudioversioninfo.h>
#include <tools/vsenvironmentdetector.h>
@@ -91,9 +92,17 @@ static void addMSVCPlatform(Settings *settings, QList<Profile> &profiles, QStrin
profiles << p;
}
-static QStringList findSupportedArchitectures(MSVC *msvc)
+struct MSVCArchInfo
{
- static const QStringList knownArchitectures = QStringList()
+ QString arch;
+ QString binPath;
+};
+
+static QVector<MSVCArchInfo> findSupportedArchitectures(const MSVC &msvc)
+{
+ QVector<MSVCArchInfo> result;
+ if (msvc.internalVsVersion.majorVersion() < 15) {
+ static const QStringList knownArchitectures = QStringList()
<< QStringLiteral("x86")
<< QStringLiteral("amd64_x86")
<< QStringLiteral("amd64")
@@ -102,10 +111,30 @@ static QStringList findSupportedArchitectures(MSVC *msvc)
<< QStringLiteral("x86_ia64")
<< QStringLiteral("x86_arm")
<< QStringLiteral("amd64_arm");
- QStringList result;
- for (const QString &knownArchitecture : knownArchitectures) {
- if (QFile::exists(msvc->clPathForArchitecture(knownArchitecture)))
- result += knownArchitecture;
+ for (const QString &knownArchitecture : knownArchitectures) {
+ MSVCArchInfo ai;
+ ai.arch = knownArchitecture;
+ ai.binPath = msvc.binPathForArchitecture(knownArchitecture);
+ if (QFile::exists(ai.binPath + QLatin1String("/cl.exe")))
+ result += ai;
+ }
+ } else {
+ QDir vcInstallDir(msvc.vcInstallPath);
+ foreach (QString hostArch, vcInstallDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
+ QDir subdir = vcInstallDir;
+ if (!subdir.cd(hostArch))
+ continue;
+ const QString shortHostArch = hostArch.mid(4).toLower();
+ foreach (const QString &arch, subdir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
+ MSVCArchInfo ai;
+ ai.binPath = subdir.absoluteFilePath(arch);
+ if (shortHostArch == arch)
+ ai.arch = arch;
+ else
+ ai.arch = shortHostArch + QLatin1Char('_') + arch;
+ result += ai;
+ }
+ }
}
return result;
}
@@ -119,6 +148,58 @@ static QString wow6432Key()
#endif
}
+static QVector<MSVC> installedMSVCs()
+{
+ QVector<MSVC> msvcs;
+ const QSettings vsRegistry(
+ QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE") + wow6432Key()
+ + QLatin1String("\\Microsoft\\VisualStudio\\SxS\\VS7"),
+ QSettings::NativeFormat);
+ foreach (const QString &vsName, vsRegistry.childKeys()) {
+ MSVC msvc;
+ msvc.internalVsVersion = Version::fromString(vsName);
+ if (!msvc.internalVsVersion.isValid())
+ continue;
+
+ QDir vsInstallDir(vsRegistry.value(vsName).toString());
+ msvc.vsInstallPath = vsInstallDir.absolutePath();
+ if (!vsInstallDir.cd(QStringLiteral("VC")))
+ continue;
+
+ msvc.version = QString::number(Internal::VisualStudioVersionInfo(
+ Internal::Version::fromString(vsName)).marketingVersion());
+ if (msvc.version.isEmpty()) {
+ qbsWarning() << Tr::tr("Unknown MSVC version %1 found.").arg(vsName);
+ continue;
+ }
+
+ if (msvc.internalVsVersion.majorVersion() < 15) {
+ QDir vcInstallDir = vsInstallDir;
+ if (!vcInstallDir.cd(QStringLiteral("bin")))
+ continue;
+ msvc.vcInstallPath = vcInstallDir.absolutePath();
+ msvcs.append(msvc);
+ } else {
+ QDir vcInstallDir = vsInstallDir;
+ vcInstallDir.cd(QStringLiteral("Tools/MSVC"));
+ foreach (const QString &vcVersionStr,
+ vcInstallDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
+ const Version vcVersion = Version::fromString(vcVersionStr);
+ if (!vcVersion.isValid())
+ continue;
+ QDir specificVcInstallDir = vcInstallDir;
+ if (!specificVcInstallDir.cd(vcVersionStr)
+ || !specificVcInstallDir.cd(QStringLiteral("bin"))) {
+ continue;
+ }
+ msvc.vcInstallPath = specificVcInstallDir.absolutePath();
+ msvcs.append(msvc);
+ }
+ }
+ }
+ return msvcs;
+}
+
void msvcProbe(Settings *settings, QList<Profile> &profiles)
{
qbsInfo() << Tr::tr("Detecting MSVC toolchains...");
@@ -143,10 +224,10 @@ void msvcProbe(Settings *settings, QList<Profile> &profiles)
sdk.vcInstallPath.chop(1);
if (sdk.isDefault)
defaultWinSDK = sdk;
- foreach (const QString &arch, findSupportedArchitectures(&sdk)) {
+ foreach (const MSVCArchInfo &ai, findSupportedArchitectures(sdk)) {
WinSDK specificSDK = sdk;
- specificSDK.architecture = arch;
- specificSDK.binPath = specificSDK.binPathForArchitecture(arch);
+ specificSDK.architecture = ai.arch;
+ specificSDK.binPath = ai.binPath;
winSDKs += specificSDK;
}
}
@@ -161,38 +242,18 @@ void msvcProbe(Settings *settings, QList<Profile> &profiles)
// 2) Installed MSVCs
QVector<MSVC> msvcs;
- const QSettings vsRegistry(
- QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE") + wow6432Key()
- + QLatin1String("\\Microsoft\\VisualStudio\\SxS\\VC7"),
- QSettings::NativeFormat);
- foreach (const QString &vsName, vsRegistry.allKeys()) {
- // Scan for version major.minor
- const int dotPos = vsName.indexOf(QLatin1Char('.'));
- if (dotPos == -1)
- continue;
-
- MSVC msvc;
- msvc.vcInstallPath = vsRegistry.value(vsName).toString();
- if (!msvc.vcInstallPath.endsWith(QLatin1Char('\\')))
- msvc.vcInstallPath += QLatin1Char('\\');
- msvc.vcInstallPath += QLatin1String("bin");
-
- msvc.version = QString::number(Internal::VisualStudioVersionInfo(
- Internal::Version::fromString(vsName)).marketingVersion());
- if (msvc.version.isEmpty()) {
- qbsWarning() << Tr::tr("Unknown MSVC version %1 found.").arg(vsName);
- continue;
+ foreach (MSVC msvc, installedMSVCs()) {
+ if (msvc.internalVsVersion.majorVersion() < 15) {
+ // Check existence of various install scripts
+ const QString vcvars32bat = msvc.vcInstallPath + QLatin1String("/vcvars32.bat");
+ if (!QFileInfo(vcvars32bat).isFile())
+ continue;
}
- // Check existence of various install scripts
- const QString vcvars32bat = msvc.vcInstallPath + QLatin1String("/vcvars32.bat");
- if (!QFileInfo(vcvars32bat).isFile())
- continue;
-
- foreach (const QString &arch, findSupportedArchitectures(&msvc)) {
+ foreach (const MSVCArchInfo &ai, findSupportedArchitectures(msvc)) {
MSVC specificMSVC = msvc;
- specificMSVC.architecture = arch;
- specificMSVC.binPath = specificMSVC.binPathForArchitecture(arch);
+ specificMSVC.architecture = ai.arch;
+ specificMSVC.binPath = ai.binPath;
msvcs += specificMSVC;
}
}