From c19d031978333013279aa9003074283f999ccb33 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 22 Oct 2021 15:00:54 +0200 Subject: [PATCH] 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 --- src/plugins/projectexplorer/kitinformation.cpp | 12 +++++++----- src/plugins/projectexplorer/msvctoolchain.cpp | 10 ++++++++++ src/plugins/projectexplorer/msvctoolchain.h | 4 ++++ src/plugins/projectexplorer/toolchain.h | 8 ++++++++ src/plugins/qtsupport/qtkitinformation.cpp | 2 +- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index dbd060cfe8d..af4a900946d 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -502,11 +502,13 @@ void ToolChainKitAspect::setup(Kit *k) [abi, l](const ToolChain *t) { return t->targetAbi().toString() == abi && t->language() == l; }); - Utils::sort(possibleTcs, [](const ToolChain *tc1, const ToolChain *tc2) { - return tc1->hostPrefersToolchain() && !tc2->hostPrefersToolchain(); - }); - if (!possibleTcs.isEmpty()) - setToolChain(k, possibleTcs.first()); + ToolChain *bestTc = nullptr; + for (ToolChain *tc : possibleTcs) { + if (!bestTc || tc->priority() > bestTc->priority()) + bestTc = tc; + } + if (bestTc) + setToolChain(k, bestTc); else clearToolChain(k, l); } diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index f2b92c55527..ca93d5582b7 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -1746,6 +1746,11 @@ bool ClangClToolChain::operator==(const ToolChain &other) const return m_clangPath == clangClTc->m_clangPath; } +int ClangClToolChain::priority() const +{ + return MsvcToolChain::priority() - 1; +} + Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags, const Utils::Environment &env) const { @@ -2050,6 +2055,11 @@ bool MsvcToolChain::operator==(const ToolChain &other) const && m_varsBatArg == msvcTc->m_varsBatArg; } +int MsvcToolChain::priority() const +{ + return hostPrefersToolchain() ? PriorityHigh : PriorityNormal; +} + void MsvcToolChain::cancelMsvcToolChainDetection() { envModThreadPool()->clear(); diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index 2e42a163da5..34894d78397 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -98,6 +98,8 @@ public: bool isJobCountSupported() const override { return false; } + int priority() const override; + static void cancelMsvcToolChainDetection(); static Utils::optional generateEnvironmentSettings(const Utils::Environment &env, const QString &batchFile, @@ -187,6 +189,8 @@ public: bool operator==(const ToolChain &) const override; + int priority() const override; + private: QString m_clangPath; }; diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 72c1b388bb9..b305bf00551 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -172,6 +172,14 @@ public: static Utils::LanguageVersion cxxLanguageVersion(const QByteArray &cplusplusMacroValue); static Utils::LanguageVersion languageVersion(const Utils::Id &language, const Macros ¯os); + enum Priority { + PriorityLow = 0, + PriorityNormal = 10, + PriorityHigh = 20, + }; + + virtual int priority() const { return PriorityNormal; } + protected: explicit ToolChain(Utils::Id typeId); diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 002c49f7fc0..79935c1c00a 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -240,7 +240,7 @@ void QtKitAspect::fix(Kit *k) return true; if (!tc1ExactMatch && tc2ExactMatch) return false; - return tc1->hostPrefersToolchain() && !tc2->hostPrefersToolchain(); + return tc1->priority() > tc2->priority(); }); const QList goodTcs = Utils::filtered(possibleTcs,