summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@digia.com>2014-04-08 13:31:57 +0200
committerDavid Schulz <david.schulz@digia.com>2014-04-10 08:02:20 +0200
commitd33e66c895a7eb682abb936e14db9cc2583c8ae1 (patch)
treefb22c8209b076fc793bd820a0b49e388571470ba
parent52b7505b6817fcbaaa0ae4f30bd3eb370a6c66e3 (diff)
downloadqt-creator-d33e66c895a7eb682abb936e14db9cc2583c8ae1.tar.gz
ProjectExplorer: Detect all msvc toolchains.
The host system will not be taken into account, so the cross build toolchains are also detected. Task-number: QTCREATORBUG-10998 Change-Id: I04a410bbf368898b70d9560d2c2a4a6c60ed0b61 Reviewed-by: Daniel Teske <daniel.teske@digia.com>
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.cpp118
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.h7
-rw-r--r--src/plugins/projectexplorer/toolchainmanager.cpp2
-rw-r--r--src/plugins/qtsupport/qtoptionspage.cpp18
4 files changed, 75 insertions, 70 deletions
diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp
index 80613b7d1f..265532887a 100644
--- a/src/plugins/projectexplorer/msvctoolchain.cpp
+++ b/src/plugins/projectexplorer/msvctoolchain.cpp
@@ -63,17 +63,44 @@ static QString platformName(MsvcToolChain::Platform t)
{
switch (t) {
case MsvcToolChain::x86:
- return QLatin1String(" (x86)");
+ return QLatin1String("x86");
case MsvcToolChain::amd64:
- return QLatin1String(" (amd64)");
+ return QLatin1String("amd64");
+ case MsvcToolChain::x86_amd64:
+ return QLatin1String("x86_amd64");
case MsvcToolChain::ia64:
- return QLatin1String(" (ia64)");
+ return QLatin1String("ia64");
+ case MsvcToolChain::x86_ia64:
+ return QLatin1String("x86_ia64");
case MsvcToolChain::arm:
- return QLatin1String(" (arm)");
+ return QLatin1String("arm");
+ case MsvcToolChain::x86_arm:
+ return QLatin1String("x86_arm");
+ case MsvcToolChain::amd64_arm:
+ return QLatin1String("amd64_arm");
}
return QString();
}
+static bool hostSupportsPlatform(MsvcToolChain::Platform platform)
+{
+ switch (Utils::HostOsInfo::hostArchitecture()) {
+ case Utils::HostOsInfo::HostArchitectureAMD64:
+ if (platform == MsvcToolChain::amd64 || platform == MsvcToolChain::amd64_arm)
+ return true;
+ // fall through (all x86 toolchains are also working on an amd64 host)
+ case Utils::HostOsInfo::HostArchitectureX86:
+ return platform == MsvcToolChain::x86 || platform == MsvcToolChain::x86_amd64
+ || platform == MsvcToolChain::x86_ia64 || platform == MsvcToolChain::x86_arm;
+ case Utils::HostOsInfo::HostArchitectureArm:
+ return platform == MsvcToolChain::arm;
+ case Utils::HostOsInfo::HostArchitectureItanium:
+ return platform == MsvcToolChain::ia64;
+ default:
+ return false;
+ }
+}
+
static Abi findAbiOfMsvc(MsvcToolChain::Type type, MsvcToolChain::Platform platform, const QString &version)
{
Abi::Architecture arch = Abi::X86Architecture;
@@ -86,11 +113,15 @@ static Abi findAbiOfMsvc(MsvcToolChain::Type type, MsvcToolChain::Platform platf
wordWidth = 32;
break;
case ProjectExplorer::Internal::MsvcToolChain::ia64:
+ case ProjectExplorer::Internal::MsvcToolChain::x86_ia64:
arch = Abi::ItaniumArchitecture;
break;
case ProjectExplorer::Internal::MsvcToolChain::amd64:
+ case ProjectExplorer::Internal::MsvcToolChain::x86_amd64:
break;
case ProjectExplorer::Internal::MsvcToolChain::arm:
+ case ProjectExplorer::Internal::MsvcToolChain::x86_arm:
+ case ProjectExplorer::Internal::MsvcToolChain::amd64_arm:
arch = Abi::ArmArchitecture;
wordWidth = 32;
break;
@@ -126,13 +157,13 @@ static QString generateDisplayName(const QString &name,
{
if (t == MsvcToolChain::WindowsSDK) {
QString sdkName = name;
- sdkName += platformName(p);
+ sdkName += QString::fromLatin1(" (%1)").arg(platformName(p));
return sdkName;
}
// Comes as "9.0" from the registry
QString vcName = QLatin1String("Microsoft Visual C++ Compiler ");
vcName += name;
- vcName += platformName(p);
+ vcName += QString::fromLatin1(" (%1)").arg(platformName(p));
return vcName;
}
@@ -482,6 +513,11 @@ QString MsvcToolChainFactory::vcVarsBatFor(const QString &basePath, const QStrin
return QString();
}
+QString MsvcToolChainFactory::vcVarsBatFor(const QString &basePath, MsvcToolChain::Platform platform)
+{
+ return vcVarsBatFor(basePath, platformName(platform));
+}
+
QList<ToolChain *> MsvcToolChainFactory::autoDetect()
{
QList<ToolChain *> results;
@@ -545,64 +581,22 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect()
const int version = vsName.left(dotPos).toInt();
const QString vcvarsAllbat = path + QLatin1String("/vcvarsall.bat");
if (QFileInfo(vcvarsAllbat).isFile()) {
- Utils::HostOsInfo::HostArchitecture arch = Utils::HostOsInfo::hostArchitecture();
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("x86"))).isFile())
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86, vsName),
- vcvarsAllbat, QLatin1String("x86"), ToolChain::AutoDetection));
-
- if (arch == Utils::HostOsInfo::HostArchitectureX86) {
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("x86_amd64"))).isFile())
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
- vcvarsAllbat, QLatin1String("x86_amd64"), ToolChain::AutoDetection));
- } else if (arch == Utils::HostOsInfo::HostArchitectureAMD64) {
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("amd64"))).isFile()) {
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
- vcvarsAllbat, QLatin1String("amd64"), ToolChain::AutoDetection));
- } else if (QFileInfo(vcVarsBatFor(path, QLatin1String("x86_amd64"))).isFile()) {
- // 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"), ToolChain::AutoDetection));
+ QList<MsvcToolChain::Platform> platforms; // prioritized list
+ platforms << MsvcToolChain::x86
+ << MsvcToolChain::amd64 << MsvcToolChain::x86_amd64
+ << MsvcToolChain::arm << MsvcToolChain::amd64_arm << MsvcToolChain::x86_arm
+ << MsvcToolChain::ia64 << MsvcToolChain::x86_ia64;
+ foreach (const MsvcToolChain::Platform &platform, platforms) {
+ if (hostSupportsPlatform(platform)
+ && QFileInfo(vcVarsBatFor(path, platform)).isFile()) {
+ results.append(new MsvcToolChain(
+ generateDisplayName(vsName, MsvcToolChain::VS, platform),
+ findAbiOfMsvc(MsvcToolChain::VS, platform, vsName),
+ vcvarsAllbat,
+ platformName(platform),
+ ToolChain::AutoDetection));
}
}
-
- if (arch == Utils::HostOsInfo::HostArchitectureX86) {
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("x86_arm"))).isFile())
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::arm),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::arm, vsName),
- vcvarsAllbat, QLatin1String("x86_arm"), ToolChain::AutoDetection));
- } else if (arch == Utils::HostOsInfo::HostArchitectureAMD64) {
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("amd64_arm"))).isFile()) {
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::arm),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::arm, vsName),
- vcvarsAllbat, QLatin1String("amd64_arm"), ToolChain::AutoDetection));
- } else if (QFileInfo(vcVarsBatFor(path, QLatin1String("x86_arm"))).isFile()) {
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::arm),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::arm, vsName),
- vcvarsAllbat, QLatin1String("x86_arm"), ToolChain::AutoDetection));
- }
- } else if (arch == Utils::HostOsInfo::HostArchitectureArm) {
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("arm"))).isFile())
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::arm),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::arm, vsName),
- vcvarsAllbat, QLatin1String("arm"), ToolChain::AutoDetection));
- }
-
- if (arch == Utils::HostOsInfo::HostArchitectureItanium) {
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("ia64"))).isFile())
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName),
- vcvarsAllbat, QLatin1String("ia64"), ToolChain::AutoDetection));
- } else if (arch == Utils::HostOsInfo::HostArchitectureX86
- || arch == Utils::HostOsInfo::HostArchitectureAMD64) {
- if (QFileInfo(vcVarsBatFor(path, QLatin1String("x86_ia64"))).isFile())
- results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64),
- findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName),
- vcvarsAllbat, QLatin1String("x86_ia64"), ToolChain::AutoDetection));
- }
} else {
qWarning("Unable to find MSVC setup script %s in version %d", qPrintable(vcvarsAllbat), version);
}
diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h
index f65b2c806d..8a642aceee 100644
--- a/src/plugins/projectexplorer/msvctoolchain.h
+++ b/src/plugins/projectexplorer/msvctoolchain.h
@@ -49,8 +49,12 @@ public:
enum Type { WindowsSDK, VS };
enum Platform { x86,
amd64,
+ x86_amd64,
ia64,
- arm
+ x86_ia64,
+ arm,
+ x86_arm,
+ amd64_arm
};
MsvcToolChain(const QString &name, const Abi &abi,
@@ -104,6 +108,7 @@ public:
ToolChainConfigWidget *configurationWidget(ToolChain *);
static QString vcVarsBatFor(const QString &basePath, const QString &toolchainName);
+ static QString vcVarsBatFor(const QString &basePath, MsvcToolChain::Platform platform);
private:
static bool checkForVisualStudioInstallation(const QString &vsName);
};
diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp
index 461ae04268..aeb04af22c 100644
--- a/src/plugins/projectexplorer/toolchainmanager.cpp
+++ b/src/plugins/projectexplorer/toolchainmanager.cpp
@@ -77,7 +77,7 @@ public:
QMap<QString, FileName> m_abiToDebugger;
PersistentSettingsWriter *m_writer;
- QList<ToolChain *> m_toolChains;
+ QList<ToolChain *> m_toolChains; // prioritized List
};
ToolChainManagerPrivate::~ToolChainManagerPrivate()
diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp
index 6c6477469c..935f405cfb 100644
--- a/src/plugins/qtsupport/qtoptionspage.cpp
+++ b/src/plugins/qtsupport/qtoptionspage.cpp
@@ -386,15 +386,21 @@ QtOptionsPageWidget::ValidityInfo QtOptionsPageWidget::validInformation(const Ba
QList<ToolChain*> QtOptionsPageWidget::toolChains(const BaseQtVersion *version)
{
- QHash<QString,ToolChain*> toolChains;
+ QList<ToolChain*> toolChains;
if (!version)
- return toolChains.values();
+ return toolChains;
- foreach (const Abi &a, version->qtAbis())
- foreach (ToolChain *tc, ToolChainManager::findToolChains(a))
- toolChains.insert(tc->id(), tc);
+ QSet<QString> ids;
+ foreach (const Abi &a, version->qtAbis()) {
+ foreach (ToolChain *tc, ToolChainManager::findToolChains(a)) {
+ if (ids.contains(tc->id()))
+ continue;
+ ids.insert(tc->id());
+ toolChains.append(tc);
+ }
+ }
- return toolChains.values();
+ return toolChains;
}
QString QtOptionsPageWidget::defaultToolChainId(const BaseQtVersion *version)