ProjectExplorer: introduce Toolchain::priority

Can be used to prefer certain toolchain types over other if different
toolchains matches the same abi.

Change-Id: Ie1c62e8abfc98e8cda7f999c4df487799c8d4f13
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2021-10-22 15:00:54 +02:00
parent afda00f1fa
commit c19d031978
5 changed files with 30 additions and 6 deletions

View File

@@ -502,11 +502,13 @@ void ToolChainKitAspect::setup(Kit *k)
[abi, l](const ToolChain *t) { [abi, l](const ToolChain *t) {
return t->targetAbi().toString() == abi && t->language() == l; return t->targetAbi().toString() == abi && t->language() == l;
}); });
Utils::sort(possibleTcs, [](const ToolChain *tc1, const ToolChain *tc2) { ToolChain *bestTc = nullptr;
return tc1->hostPrefersToolchain() && !tc2->hostPrefersToolchain(); for (ToolChain *tc : possibleTcs) {
}); if (!bestTc || tc->priority() > bestTc->priority())
if (!possibleTcs.isEmpty()) bestTc = tc;
setToolChain(k, possibleTcs.first()); }
if (bestTc)
setToolChain(k, bestTc);
else else
clearToolChain(k, l); clearToolChain(k, l);
} }

View File

@@ -1746,6 +1746,11 @@ bool ClangClToolChain::operator==(const ToolChain &other) const
return m_clangPath == clangClTc->m_clangPath; return m_clangPath == clangClTc->m_clangPath;
} }
int ClangClToolChain::priority() const
{
return MsvcToolChain::priority() - 1;
}
Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags, Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags,
const Utils::Environment &env) const const Utils::Environment &env) const
{ {
@@ -2050,6 +2055,11 @@ bool MsvcToolChain::operator==(const ToolChain &other) const
&& m_varsBatArg == msvcTc->m_varsBatArg; && m_varsBatArg == msvcTc->m_varsBatArg;
} }
int MsvcToolChain::priority() const
{
return hostPrefersToolchain() ? PriorityHigh : PriorityNormal;
}
void MsvcToolChain::cancelMsvcToolChainDetection() void MsvcToolChain::cancelMsvcToolChainDetection()
{ {
envModThreadPool()->clear(); envModThreadPool()->clear();

View File

@@ -98,6 +98,8 @@ public:
bool isJobCountSupported() const override { return false; } bool isJobCountSupported() const override { return false; }
int priority() const override;
static void cancelMsvcToolChainDetection(); static void cancelMsvcToolChainDetection();
static Utils::optional<QString> generateEnvironmentSettings(const Utils::Environment &env, static Utils::optional<QString> generateEnvironmentSettings(const Utils::Environment &env,
const QString &batchFile, const QString &batchFile,
@@ -187,6 +189,8 @@ public:
bool operator==(const ToolChain &) const override; bool operator==(const ToolChain &) const override;
int priority() const override;
private: private:
QString m_clangPath; QString m_clangPath;
}; };

View File

@@ -172,6 +172,14 @@ public:
static Utils::LanguageVersion cxxLanguageVersion(const QByteArray &cplusplusMacroValue); static Utils::LanguageVersion cxxLanguageVersion(const QByteArray &cplusplusMacroValue);
static Utils::LanguageVersion languageVersion(const Utils::Id &language, const Macros &macros); static Utils::LanguageVersion languageVersion(const Utils::Id &language, const Macros &macros);
enum Priority {
PriorityLow = 0,
PriorityNormal = 10,
PriorityHigh = 20,
};
virtual int priority() const { return PriorityNormal; }
protected: protected:
explicit ToolChain(Utils::Id typeId); explicit ToolChain(Utils::Id typeId);

View File

@@ -240,7 +240,7 @@ void QtKitAspect::fix(Kit *k)
return true; return true;
if (!tc1ExactMatch && tc2ExactMatch) if (!tc1ExactMatch && tc2ExactMatch)
return false; return false;
return tc1->hostPrefersToolchain() && !tc2->hostPrefersToolchain(); return tc1->priority() > tc2->priority();
}); });
const QList<ToolChain *> goodTcs = Utils::filtered(possibleTcs, const QList<ToolChain *> goodTcs = Utils::filtered(possibleTcs,