diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index cdbc7949d3502edb78560f05ae35c5ac2068d13f..b347484b51506026e82979f696fc5ef59bb7b1bc 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -40,6 +40,7 @@ #include <utils/synchronousprocess.h> #include <utils/winutils.h> #include <utils/qtcassert.h> +#include <utils/hostosinfo.h> #include <QDir> #include <QFileInfo> @@ -70,12 +71,10 @@ static QString platformName(MsvcToolChain::Platform t) return QLatin1String(" (x86)"); case MsvcToolChain::amd64: return QLatin1String(" (amd64)"); - case MsvcToolChain::x86_amd64: - return QLatin1String(" (x86_amd64)"); case MsvcToolChain::ia64: return QLatin1String(" (ia64)"); - case MsvcToolChain::x86_ia64: - return QLatin1String(" (x86_ia64)"); + case MsvcToolChain::arm: + return QLatin1String(" (arm)"); } return QString(); } @@ -92,11 +91,13 @@ 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: + arch = Abi::ArmArchitecture; + wordWidth = 32; break; }; @@ -483,15 +484,9 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect() tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::amd64), findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::amd64, version), 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), findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::ia64, version), 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. if (folder == defaultSdkPath) results = tmp + results; @@ -518,56 +513,59 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect() const QString path = vsRegistry.value(vsName).toString(); 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"); - if (QFileInfo(vcvarsAllbat).isFile()) { + const QString vcvarsAllbat = path + QLatin1String("vcvarsall.bat"); + 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), findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86, vsName), vcvarsAllbat, QLatin1String("x86"), true)); - results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64), - findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName), - vcvarsAllbat, QLatin1String("amd64"), true)); - results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86_amd64), - findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86_amd64, vsName), - vcvarsAllbat, QLatin1String("x86_amd64"), true)); - results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64), - findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName), - vcvarsAllbat, QLatin1String("ia64"), true)); - results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::x86_ia64), - findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::x86_ia64, vsName), - vcvarsAllbat, QLatin1String("x86_ia64"), true)); - } else { - qWarning("Unable to find MSVC setup script %s in version %d", qPrintable(vcvarsAllbat), version); + + 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), + findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName), + vcvarsAllbat, QLatin1String("amd64"), true)); + } else if (QFileInfo(path + QLatin1String("bin/x86_amd64/vcvarsx86_amd64.bat")).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"), 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), + findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName), + vcvarsAllbat, QLatin1String("ia64"), true)); + } else if (arch == Utils::HostOsInfo::HostArchitectureX86 + || 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)); } } else { - // Amd 64 is the preferred 64bit platform - 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)); + 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 21a0582aaa118acfbbfe06fb296f96da5f358bfa..f2075abc0d37bad3c26ae52a845c0411fea9d2a5 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -49,11 +49,10 @@ class MsvcToolChain : public AbstractMsvcToolChain { public: enum Type { WindowsSDK, VS }; - enum Platform { x86, // x86 -> x86 - amd64, // amd64 -> amd64 - ia64, // ia64 -> ia64 - x86_amd64, // x86 -> amd64 - x86_ia64, // x86 -> ia64 + enum Platform { x86, + amd64, + ia64, + arm }; MsvcToolChain(const QString &name, const Abi &abi,