diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2020-02-10 15:42:08 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2020-02-12 10:45:38 +0000 |
commit | 0d9b0f8074b4328cf5ec1141904aeff6a0a2f9f9 (patch) | |
tree | 9a18b7c9318aefc20ab54e0bcc78f417e52ff048 /src/plugins | |
parent | 8d0361a8c936ddd77f1fcb76f1785881c9b619f3 (diff) | |
download | qt-creator-0d9b0f8074b4328cf5ec1141904aeff6a0a2f9f9.tar.gz |
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')
-rw-r--r-- | src/plugins/qtsupport/qtkitinformation.cpp | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 7d8ada6480..1e4037c447 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); } } |