MsvcToolChain: Simplify logic

Remove special code dealing with msvc < 10, those did also ship a
vcvarsall.bat. Add code checking for host bitness to only show
those compilers that make sense. Also check if the batch file that
vcvarsall.bat will call actually exists, so that only installed cross
compilers are shown.

Task-number: QTCREATORBUG-8292
Change-Id: I420a0004632f02cd8a6388f2e12ba59f719909e3
Reviewed-by: Peter Kümmel <syntheticpp@gmx.net>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
Daniel Teske
2013-01-15 17:03:17 +01:00
parent 028fc3dd8c
commit 5e7cf3f062
2 changed files with 59 additions and 62 deletions

View File

@@ -40,6 +40,7 @@
#include <utils/synchronousprocess.h> #include <utils/synchronousprocess.h>
#include <utils/winutils.h> #include <utils/winutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/hostosinfo.h>
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
@@ -70,12 +71,10 @@ static QString platformName(MsvcToolChain::Platform t)
return QLatin1String(" (x86)"); return QLatin1String(" (x86)");
case MsvcToolChain::amd64: case MsvcToolChain::amd64:
return QLatin1String(" (amd64)"); return QLatin1String(" (amd64)");
case MsvcToolChain::x86_amd64:
return QLatin1String(" (x86_amd64)");
case MsvcToolChain::ia64: case MsvcToolChain::ia64:
return QLatin1String(" (ia64)"); return QLatin1String(" (ia64)");
case MsvcToolChain::x86_ia64: case MsvcToolChain::arm:
return QLatin1String(" (x86_ia64)"); return QLatin1String(" (arm)");
} }
return QString(); return QString();
} }
@@ -92,11 +91,13 @@ static Abi findAbiOfMsvc(MsvcToolChain::Type type, MsvcToolChain::Platform platf
wordWidth = 32; wordWidth = 32;
break; break;
case ProjectExplorer::Internal::MsvcToolChain::ia64: case ProjectExplorer::Internal::MsvcToolChain::ia64:
case ProjectExplorer::Internal::MsvcToolChain::x86_ia64:
arch = Abi::ItaniumArchitecture; arch = Abi::ItaniumArchitecture;
break; break;
case ProjectExplorer::Internal::MsvcToolChain::amd64: case ProjectExplorer::Internal::MsvcToolChain::amd64:
case ProjectExplorer::Internal::MsvcToolChain::x86_amd64: break;
case ProjectExplorer::Internal::MsvcToolChain::arm:
arch = Abi::ArmArchitecture;
wordWidth = 32;
break; break;
}; };
@@ -483,15 +484,9 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect()
tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::amd64), tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::amd64),
findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::amd64, version), findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::amd64, version),
fi.absoluteFilePath(), QLatin1String("/x64"), true)); fi.absoluteFilePath(), QLatin1String("/x64"), true));
tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::x86_amd64),
findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::x86_amd64, version),
fi.absoluteFilePath(), QLatin1String("/x64"), true));
tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::ia64), tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::ia64),
findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::ia64, version), findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::ia64, version),
fi.absoluteFilePath(), QLatin1String("/ia64"), true)); fi.absoluteFilePath(), QLatin1String("/ia64"), true));
tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::x86_ia64),
findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::x86_ia64, version),
fi.absoluteFilePath(), QLatin1String("/ia64"), true));
// Make sure the default is front. // Make sure the default is front.
if (folder == defaultSdkPath) if (folder == defaultSdkPath)
results = tmp + results; results = tmp + results;
@@ -518,56 +513,59 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect()
const QString path = vsRegistry.value(vsName).toString(); const QString path = vsRegistry.value(vsName).toString();
const int version = vsName.left(dotPos).toInt(); const int version = vsName.left(dotPos).toInt();
// Check existence of various install scripts
const QString vcvars32bat = path + QLatin1String("bin\\vcvars32.bat");
if (QFileInfo(vcvars32bat).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86, vsName),
vcvars32bat, QString(), true));
if (version >= 10) {
// Just one common file
const QString vcvarsAllbat = path + QLatin1String("vcvarsall.bat"); const QString vcvarsAllbat = path + QLatin1String("vcvarsall.bat");
if (QFileInfo(vcvarsAllbat).isFile()) { if (QFileInfo(vcvarsAllbat).isFile()) {
Utils::HostOsInfo::HostArchitecture arch = Utils::HostOsInfo::hostArchitecture();
if (QFileInfo(path + QLatin1String("bin/vcvars32.bat")).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86), results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86, vsName), findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86, vsName),
vcvarsAllbat, QLatin1String("x86"), true)); vcvarsAllbat, QLatin1String("x86"), true));
if (arch == Utils::HostOsInfo::HostArchitectureX86) {
if (QFileInfo(path + QLatin1String("bin/x86_amd64/vcvarsx86_amd64.bat")).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
vcvarsAllbat, QLatin1String("x86_amd64"), true));
} else if (arch == Utils::HostOsInfo::HostArchitectureAMD64) {
if (QFileInfo(path + QLatin1String("bin/amd64/vcvars64.bat")).isFile()) {
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64), results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName), findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
vcvarsAllbat, QLatin1String("amd64"), true)); vcvarsAllbat, QLatin1String("amd64"), true));
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86_amd64), } else if (QFileInfo(path + QLatin1String("bin/x86_amd64/vcvarsx86_amd64.bat")).isFile()) {
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86_amd64, vsName), // Fall back to 32 bit to 4 bit
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
vcvarsAllbat, QLatin1String("x86_amd64"), true)); vcvarsAllbat, QLatin1String("x86_amd64"), true));
}
}
if (arch == Utils::HostOsInfo::HostArchitectureX86
|| arch == Utils::HostOsInfo::HostArchitectureAMD64) {
if (QFileInfo(path + QLatin1String("bin/x86_arm/vcvarsx86_arm.bat")).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::arm),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::arm, vsName),
vcvarsAllbat, QLatin1String("x86_arm"), true));
} else if (arch == Utils::HostOsInfo::HostArchitectureArm) {
if (QFileInfo(path + QLatin1String("bin/arm/vcvarsarm.bat")).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::arm),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::arm, vsName),
vcvarsAllbat, QLatin1String("arm"), true));
}
if (arch == Utils::HostOsInfo::HostArchitectureItanium) {
if (QFileInfo(path + QLatin1String("bin/ia64/vcvars64.bat")).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64), results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName), findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName),
vcvarsAllbat, QLatin1String("ia64"), true)); vcvarsAllbat, QLatin1String("ia64"), true));
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86_ia64), } else if (arch == Utils::HostOsInfo::HostArchitectureX86
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86_ia64, vsName), || arch == Utils::HostOsInfo::HostArchitectureAMD64) {
if (QFileInfo(path + QLatin1String("bin/x86_ia64/vcvarsx86_ia64.bat")).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName),
vcvarsAllbat, QLatin1String("x86_ia64"), true)); vcvarsAllbat, QLatin1String("x86_ia64"), true));
} else {
qWarning("Unable to find MSVC setup script %s in version %d", qPrintable(vcvarsAllbat), version);
} }
} else { } else {
// Amd 64 is the preferred 64bit platform qWarning("Unable to find MSVC setup script %s in version %d", qPrintable(vcvarsAllbat), version);
const QString vcvarsAmd64bat = path + QLatin1String("bin\\amd64\\vcvarsamd64.bat");
if (QFileInfo(vcvarsAmd64bat).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
vcvarsAmd64bat, QString(), true));
const QString vcvarsX86_amd64bat = path + QLatin1String("bin\\vcvarsx86_amd64.bat");
if (QFileInfo(vcvarsX86_amd64bat).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86_amd64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86_amd64, vsName),
vcvarsX86_amd64bat, QString(), true));
const QString vcvars64bat = path + QLatin1String("bin\\vcvars64.bat");
if (QFileInfo(vcvars64bat).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
vcvars64bat, QString(), true));
const QString vcvarsX86_ia64bat = path + QLatin1String("bin\\vcvarsx86_ia64.bat");
if (QFileInfo(vcvarsX86_ia64bat).isFile())
results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86_ia64),
findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86_ia64, vsName),
vcvarsX86_ia64bat, QString(), true));
} }
} }

View File

@@ -49,11 +49,10 @@ class MsvcToolChain : public AbstractMsvcToolChain
{ {
public: public:
enum Type { WindowsSDK, VS }; enum Type { WindowsSDK, VS };
enum Platform { x86, // x86 -> x86 enum Platform { x86,
amd64, // amd64 -> amd64 amd64,
ia64, // ia64 -> ia64 ia64,
x86_amd64, // x86 -> amd64 arm
x86_ia64, // x86 -> ia64
}; };
MsvcToolChain(const QString &name, const Abi &abi, MsvcToolChain(const QString &name, const Abi &abi,