MsvcToolChain: Add supportedAbis functionality

This list of "natively supported" Abis will be shown to the user when he
wants to configure his own MSVC toolchain with a followup patch.

Change-Id: I449b2520420c6a0e6385784c6934312e3ff745d4
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Oliver Wolff
2019-05-07 13:18:44 +02:00
parent 0370d8024e
commit 9912a409da
2 changed files with 49 additions and 0 deletions

View File

@@ -64,6 +64,7 @@
static const char varsBatKeyC[] = KEY_ROOT "VarsBat"; static const char varsBatKeyC[] = KEY_ROOT "VarsBat";
static const char varsBatArgKeyC[] = KEY_ROOT "VarsBatArg"; static const char varsBatArgKeyC[] = KEY_ROOT "VarsBatArg";
static const char supportedAbiKeyC[] = KEY_ROOT "SupportedAbi"; static const char supportedAbiKeyC[] = KEY_ROOT "SupportedAbi";
static const char supportedAbisKeyC[] = KEY_ROOT "SupportedAbis";
static const char environModsKeyC[] = KEY_ROOT "environmentModifications"; static const char environModsKeyC[] = KEY_ROOT "environmentModifications";
enum { debug = 0 }; enum { debug = 0 };
@@ -771,6 +772,33 @@ void MsvcToolChain::updateEnvironmentModifications(QList<Utils::EnvironmentItem>
} }
} }
void MsvcToolChain::detectInstalledAbis()
{
m_supportedAbis.clear();
Abi baseAbi = targetAbi();
const QString vcVarsBase = m_vcvarsBat.left(m_vcvarsBat.lastIndexOf('/'));
for (MsvcPlatform platform : platforms) {
bool toolchainInstalled = false;
QString perhapsVcVarsPath = vcVarsBase + QLatin1Char('/') + QLatin1String(platform.bat);
const Platform p = platform.platform;
if (QFileInfo(perhapsVcVarsPath).isFile()) {
toolchainInstalled = true;
} else {
// MSVC 2015 and below had various versions of vcvars scripts in subfolders. Try these
// as fallbacks.
perhapsVcVarsPath = vcVarsBase + platform.prefix + QLatin1Char('/')
+ QLatin1String(platform.bat);
toolchainInstalled = QFileInfo(perhapsVcVarsPath).isFile();
}
if (hostSupportsPlatform(platform.platform) && toolchainInstalled) {
Abi newAbi(archForPlatform(p), baseAbi.os(), baseAbi.osFlavor(), baseAbi.binaryFormat(),
wordWidthForPlatform(p));
if (!m_supportedAbis.contains(newAbi))
m_supportedAbis.append(newAbi);
}
}
}
Utils::Environment MsvcToolChain::readEnvironmentSetting(const Utils::Environment &env) const Utils::Environment MsvcToolChain::readEnvironmentSetting(const Utils::Environment &env) const
{ {
Utils::Environment resultEnv = env; Utils::Environment resultEnv = env;
@@ -811,6 +839,7 @@ MsvcToolChain::MsvcToolChain(const MsvcToolChain &other)
, m_lastEnvironment(other.m_lastEnvironment) , m_lastEnvironment(other.m_lastEnvironment)
, m_resultEnvironment(other.m_resultEnvironment) , m_resultEnvironment(other.m_resultEnvironment)
, m_abi(other.m_abi) , m_abi(other.m_abi)
, m_supportedAbis(other.m_supportedAbis)
, m_vcvarsBat(other.m_vcvarsBat) , m_vcvarsBat(other.m_vcvarsBat)
, m_varsBatArg(other.m_varsBatArg) , m_varsBatArg(other.m_varsBatArg)
{ {
@@ -851,6 +880,7 @@ MsvcToolChain::MsvcToolChain(Core::Id typeId,
, m_vcvarsBat(varsBat) , m_vcvarsBat(varsBat)
, m_varsBatArg(varsBatArg) , m_varsBatArg(varsBatArg)
{ {
detectInstalledAbis();
addToAvailableMsvcToolchains(this); addToAvailableMsvcToolchains(this);
initEnvModWatcher(Utils::runAsync(envModThreadPool(), initEnvModWatcher(Utils::runAsync(envModThreadPool(),
@@ -901,6 +931,11 @@ Abi MsvcToolChain::targetAbi() const
return m_abi; return m_abi;
} }
QList<Abi> MsvcToolChain::supportedAbis() const
{
return m_supportedAbis;
}
bool MsvcToolChain::isValid() const bool MsvcToolChain::isValid() const
{ {
if (m_vcvarsBat.isEmpty()) if (m_vcvarsBat.isEmpty())
@@ -982,6 +1017,8 @@ QVariantMap MsvcToolChain::toMap() const
if (!m_varsBatArg.isEmpty()) if (!m_varsBatArg.isEmpty())
data.insert(QLatin1String(varsBatArgKeyC), m_varsBatArg); data.insert(QLatin1String(varsBatArgKeyC), m_varsBatArg);
data.insert(QLatin1String(supportedAbiKeyC), m_abi.toString()); data.insert(QLatin1String(supportedAbiKeyC), m_abi.toString());
const QStringList abiList = Utils::transform(m_supportedAbis, &Abi::toString);
data.insert(supportedAbisKeyC, abiList);
Utils::EnvironmentItem::sort(&m_environmentModifications); Utils::EnvironmentItem::sort(&m_environmentModifications);
data.insert(QLatin1String(environModsKeyC), data.insert(QLatin1String(environModsKeyC),
Utils::EnvironmentItem::toVariantList(m_environmentModifications)); Utils::EnvironmentItem::toVariantList(m_environmentModifications));
@@ -998,6 +1035,14 @@ bool MsvcToolChain::fromMap(const QVariantMap &data)
const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString(); const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString();
m_abi = Abi::fromString(abiString); m_abi = Abi::fromString(abiString);
const QStringList abiList = data.value(supportedAbisKeyC).toStringList();
m_supportedAbis.clear();
for (const QString &a : abiList) {
Abi abi = Abi::fromString(a);
if (!abi.isValid())
continue;
m_supportedAbis.append(abi);
}
m_environmentModifications = Utils::EnvironmentItem::itemsFromVariantList( m_environmentModifications = Utils::EnvironmentItem::itemsFromVariantList(
data.value(QLatin1String(environModsKeyC)).toList()); data.value(QLatin1String(environModsKeyC)).toList());
rescanForCompiler(); rescanForCompiler();
@@ -1239,6 +1284,7 @@ void MsvcToolChain::changeVcVarsCall(const QString &varsBat, const QString &vars
m_varsBatArg = varsBatArg; m_varsBatArg = varsBatArg;
if (!varsBat.isEmpty()) { if (!varsBat.isEmpty()) {
detectInstalledAbis();
initEnvModWatcher(Utils::runAsync(envModThreadPool(), initEnvModWatcher(Utils::runAsync(envModThreadPool(),
&ClangClToolChain::environmentModifications, &ClangClToolChain::environmentModifications,
m_vcvarsBat, m_vcvarsBat,

View File

@@ -64,6 +64,7 @@ public:
~MsvcToolChain() override; ~MsvcToolChain() override;
Abi targetAbi() const override; Abi targetAbi() const override;
QList<Abi> supportedAbis() const override;
bool isValid() const override; bool isValid() const override;
@@ -156,6 +157,7 @@ protected:
private: private:
void updateEnvironmentModifications(QList<Utils::EnvironmentItem> modifications); void updateEnvironmentModifications(QList<Utils::EnvironmentItem> modifications);
void rescanForCompiler(); void rescanForCompiler();
void detectInstalledAbis();
mutable QList<Utils::EnvironmentItem> m_environmentModifications; mutable QList<Utils::EnvironmentItem> m_environmentModifications;
mutable QFutureWatcher<GenerateEnvResult> m_envModWatcher; mutable QFutureWatcher<GenerateEnvResult> m_envModWatcher;
@@ -169,6 +171,7 @@ private:
protected: protected:
Abi m_abi; Abi m_abi;
QList<Abi> m_supportedAbis;
QString m_vcvarsBat; QString m_vcvarsBat;
QString m_varsBatArg; // Argument QString m_varsBatArg; // Argument