diff options
author | Jake Petroules <jake.petroules@qt.io> | 2016-05-22 15:37:18 -0700 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2016-06-27 13:13:52 +0000 |
commit | 129e7a8ab1edfb583157db6050ab3f1bd426279e (patch) | |
tree | 6f3634e0c1ce07501a1368a774ef62fe1106f065 /src/app/qbs-setup-toolchains/msvcprobe.cpp | |
parent | 2ea9e28a6963cae217923d77fd00f581306b1980 (diff) |
Determine Visual Studio architecture & build environment automatically.
This moves one step further to making the setup-toolchains tool
unnecessary and also makes the toolchainInstallPath of MSVC
profiles consistent with what Qt Creator sets.
Change-Id: I3eb11b456bf02bde8993ec0dac7e0f9950174a08
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/app/qbs-setup-toolchains/msvcprobe.cpp')
-rw-r--r-- | src/app/qbs-setup-toolchains/msvcprobe.cpp | 92 |
1 files changed, 51 insertions, 41 deletions
diff --git a/src/app/qbs-setup-toolchains/msvcprobe.cpp b/src/app/qbs-setup-toolchains/msvcprobe.cpp index 898c9d4f4..ffaaabc5a 100644 --- a/src/app/qbs-setup-toolchains/msvcprobe.cpp +++ b/src/app/qbs-setup-toolchains/msvcprobe.cpp @@ -30,18 +30,17 @@ #include "msvcprobe.h" -#include "compilerversion.h" -#include "msvcinfo.h" #include "probe.h" -#include "vsenvironmentdetector.h" #include "../shared/logging/consolelogger.h" #include <logging/translator.h> #include <tools/architectures.h> #include <tools/error.h> +#include <tools/msvcinfo.h> #include <tools/profile.h> #include <tools/settings.h> #include <tools/visualstudioversioninfo.h> +#include <tools/vsenvironmentdetector.h> #include <QDir> #include <QFileInfo> @@ -50,6 +49,7 @@ #include <QVector> using namespace qbs; +using namespace qbs::Internal; using Internal::Tr; QT_BEGIN_NAMESPACE @@ -57,46 +57,67 @@ Q_DECLARE_TYPEINFO(WinSDK, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(MSVC, Q_MOVABLE_TYPE); QT_END_NAMESPACE -static void writeEnvironment(Profile &p, const QProcessEnvironment &env) +// Not necessary but helps setup-qt automatically associate base profiles +static void setQtHelperProperties(Profile &p, const QString &architecture, + const QString &compilerFilePath) { - foreach (const QString &name, env.keys()) - p.setValue(QLatin1String("buildEnvironment.") + name, env.value(name)); + MSVC msvc(compilerFilePath); + VsEnvironmentDetector envdetector(&msvc); + if (!envdetector.start()) { + qbsWarning() << (QStringLiteral("Detecting the MSVC build environment failed: ") + + envdetector.errorString()); + return; + } + + QString targetArch = architecture.split(QLatin1Char('_')).last(); + if (targetArch.isEmpty()) + targetArch = QStringLiteral("x86"); + if (targetArch == QStringLiteral("arm")) + targetArch = QStringLiteral("armv7"); + + p.setValue(QStringLiteral("qbs.architecture"), canonicalArchitecture(targetArch)); + p.setValue(QStringLiteral("cpp.compilerVersionMajor"), + msvc.compilerDefines(compilerFilePath)[QStringLiteral("_MSC_FULL_VER")] + .toString().mid(0, 2).toInt()); } -static void addMSVCPlatform(const MSVC &msvc, Settings *settings, QList<Profile> &profiles, +static void addMSVCPlatform(Settings *settings, QList<Profile> &profiles, QString name, const QString &installPath, const QString &architecture, bool appendArchToName = true) { - if (appendArchToName) - name.append(QLatin1Char('_') + architecture); + QStringList toolchainInstallPath = QStringList() << installPath; + if (!architecture.isEmpty()) { + toolchainInstallPath.append(architecture); + if (appendArchToName) + name.append(QLatin1Char('-') + architecture); + } qbsInfo() << Tr::tr("Setting up profile '%1'.").arg(name); Profile p(name, settings); p.removeProfile(); p.setValue(QLatin1String("qbs.targetOS"), QStringList(QLatin1String("windows"))); - p.setValue(QLatin1String("cpp.toolchainInstallPath"), installPath); p.setValue(QLatin1String("qbs.toolchain"), QStringList(QLatin1String("msvc"))); - p.setValue(QLatin1String("qbs.architecture"), canonicalArchitecture(architecture)); - const QProcessEnvironment compilerEnvironment = msvc.environments.value(architecture); - setCompilerVersion(installPath + QLatin1String("/cl.exe"), QStringList(QLatin1String("msvc")), - p, compilerEnvironment); - writeEnvironment(p, compilerEnvironment); + p.setValue(QLatin1String("cpp.toolchainInstallPath"), + toolchainInstallPath.join(QDir::separator())); + setQtHelperProperties(p, architecture, + toolchainInstallPath.join(QDir::separator()) + QLatin1String("/cl.exe")); profiles << p; } static void findSupportedArchitectures(MSVC *msvc) { - if (QFile::exists(msvc->clPath()) - || QFile::exists(msvc->clPath(QLatin1String("amd64_x86")))) - msvc->architectures += QLatin1String("x86"); - if (QFile::exists(msvc->clPath(QLatin1String("amd64"))) - || QFile::exists(msvc->clPath(QLatin1String("x86_amd64")))) - msvc->architectures += QLatin1String("x86_64"); - if (QFile::exists(msvc->clPath(QLatin1String("ia64"))) - || QFile::exists(msvc->clPath(QLatin1String("x86_ia64")))) - msvc->architectures += QLatin1String("ia64"); - if (QFile::exists(msvc->clPath(QLatin1String("x86_arm"))) - || QFile::exists(msvc->clPath(QLatin1String("amd64_arm")))) - msvc->architectures += QLatin1String("armv7"); + static const QStringList knownArchitectures = QStringList() + << QString() // x86_x86 + << QStringLiteral("amd64_x86") + << QStringLiteral("amd64") + << QStringLiteral("x86_amd64") + << QStringLiteral("ia64") + << QStringLiteral("x86_ia64") + << QStringLiteral("x86_arm") + << QStringLiteral("amd64_arm"); + for (const QString &knownArchitecture : knownArchitectures) { + if (QFile::exists(msvc->clPath(knownArchitecture))) + msvc->architectures += knownArchitecture; + } } static QString wow6432Key() @@ -177,14 +198,6 @@ void msvcProbe(Settings *settings, QList<Profile> &profiles) if (!QFileInfo(vcvars32bat).isFile()) continue; - VsEnvironmentDetector envdetector(&msvc); - if (!envdetector.start()) { - qbsError() << " " - << Tr::tr("Detecting the build environment from '%1' failed.").arg( - vcvars32bat); - continue; - } - msvcs += msvc; } @@ -202,14 +215,14 @@ void msvcProbe(Settings *settings, QList<Profile> &profiles) foreach (const WinSDK &sdk, winSDKs) { foreach (const QString &arch, sdk.architectures) { - addMSVCPlatform(sdk, settings, profiles, QLatin1String("WinSDK") + sdk.version, + addMSVCPlatform(settings, profiles, QLatin1String("WinSDK") + sdk.version, sdk.installPath + QLatin1String("\\bin"), arch); } } foreach (const MSVC &msvc, msvcs) { foreach (const QString &arch, msvc.architectures) { - addMSVCPlatform(msvc, settings, profiles, QLatin1String("MSVC") + msvc.version, + addMSVCPlatform(settings, profiles, QLatin1String("MSVC") + msvc.version, msvc.installPath, arch); } } @@ -219,11 +232,8 @@ void createMsvcProfile(const QString &profileName, const QString &compilerFilePa Settings *settings) { MSVC msvc(compilerFilePath); - VsEnvironmentDetector envdetector(&msvc); - if (!envdetector.start()) - throw qbs::ErrorInfo(Tr::tr("Detecting the build environment failed.")); QList<Profile> dummy; - addMSVCPlatform(msvc, settings, dummy, profileName, msvc.installPath, + addMSVCPlatform(settings, dummy, profileName, msvc.installPath, msvc.architectures.first(), false); qbsInfo() << Tr::tr("Profile '%1' created for '%2'.") .arg(profileName, QDir::toNativeSeparators(compilerFilePath)); |