aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qtsupport/qtkitinformation.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2020-02-10 15:42:08 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2020-02-12 10:45:38 +0000
commit0d9b0f8074b4328cf5ec1141904aeff6a0a2f9f9 (patch)
tree9a18b7c9318aefc20ab54e0bcc78f417e52ff048 /src/plugins/qtsupport/qtkitinformation.cpp
parent8d0361a8c936ddd77f1fcb76f1785881c9b619f3 (diff)
QtSupport: Try harder to ensure that Qt kits have a toolchain
If we encounter a kit with a Qt version, but no toolchain, try to find a matching toolchain and set it on the kit. This is helpful if the user forgets to set the toolchain or a toolchain gets removed. Fixes: QTCREATORBUG-23564 Change-Id: I2b29ece81502b10d2a64a431a0edbcd43b1ec3a6 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Diffstat (limited to 'src/plugins/qtsupport/qtkitinformation.cpp')
-rw-r--r--src/plugins/qtsupport/qtkitinformation.cpp42
1 files changed, 39 insertions, 3 deletions
diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp
index 7d8ada64803..1e4037c4477 100644
--- a/src/plugins/qtsupport/qtkitinformation.cpp
+++ b/src/plugins/qtsupport/qtkitinformation.cpp
@@ -35,6 +35,8 @@
#include <coreplugin/icore.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/task.h>
+#include <projectexplorer/toolchain.h>
+#include <projectexplorer/toolchainmanager.h>
#include <utils/algorithm.h>
#include <utils/buildablehelperlibrary.h>
#include <utils/macroexpander.h>
@@ -207,9 +209,43 @@ void QtKitAspect::fix(ProjectExplorer::Kit *k)
{
QTC_ASSERT(QtVersionManager::isLoaded(), return);
BaseQtVersion *version = qtVersion(k);
- if (!version && qtVersionId(k) >= 0) {
- qWarning("Qt version is no longer known, removing from kit \"%s\".", qPrintable(k->displayName()));
- setQtVersionId(k, -1);
+ if (!version) {
+ if (qtVersionId(k) >= 0) {
+ qWarning("Qt version is no longer known, removing from kit \"%s\".",
+ qPrintable(k->displayName()));
+ setQtVersionId(k, -1);
+ }
+ return;
+ }
+
+ // Set a matching toolchain if we don't have one.
+ if (ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID))
+ return;
+ const QString spec = version->mkspec();
+ const QList<ToolChain *> possibleTcs = ToolChainManager::toolChains(
+ [version](const ToolChain *t) {
+ return t->isValid()
+ && t->language() == Core::Id(ProjectExplorer::Constants::CXX_LANGUAGE_ID)
+ && version->qtAbis().contains(t->targetAbi());
+ });
+ if (!possibleTcs.isEmpty()) {
+ const QList<ToolChain *> goodTcs = Utils::filtered(possibleTcs,
+ [&spec](const ToolChain *t) {
+ return t->suggestedMkspecList().contains(spec);
+ });
+ // Hack to prefer a tool chain from PATH (e.g. autodetected) over other matches.
+ // This improves the situation a bit if a cross-compilation tool chain has the
+ // same ABI as the host.
+ const Environment systemEnvironment = Environment::systemEnvironment();
+ ToolChain *bestTc = Utils::findOrDefault(goodTcs,
+ [&systemEnvironment](const ToolChain *t) {
+ return systemEnvironment.path().contains(t->compilerCommand().parentDir());
+ });
+ if (!bestTc) {
+ bestTc = goodTcs.isEmpty() ? possibleTcs.last() : goodTcs.last();
+ }
+ if (bestTc)
+ ToolChainKitAspect::setAllToolChainsToMatch(k, bestTc);
}
}