Docker: Improve Kit setup

- Use toolchain bundles, ensuring compatible C/C++ toolchains
- Try harder to match Qt and toolchains

Change-Id: I8739a5e1e75d08df4346d51cb0ee7704ca072489
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
Christian Kandeler
2024-07-31 13:03:57 +02:00
parent 84cd248eb1
commit 676a462d5d
4 changed files with 40 additions and 16 deletions

View File

@@ -262,7 +262,9 @@ Toolchains KitDetectorPrivate::autoDetectToolchains()
.arg(toolchain->compilerCommand().toUserOutput()));
toolchain->setDetectionSource(m_sharedId);
}
ToolchainManager::registerToolchains(newToolchains);
const QList<ToolchainBundle> bundles = ToolchainBundle::collectBundles(newToolchains);
for (const ToolchainBundle &b : bundles)
ToolchainManager::registerToolchains(b.toolchains());
alreadyKnown.append(newToolchains);
allNewToolchains.append(newToolchains);
}
@@ -332,7 +334,7 @@ void KitDetectorPrivate::autoDetect()
emit q->logOutput(ProjectExplorer::Tr::tr("Starting auto-detection. This will take a while..."));
const Toolchains toolchains = autoDetectToolchains();
autoDetectToolchains();
const QtVersions qtVersions = autoDetectQtVersions();
const QList<Id> cmakeIds = autoDetectCMake();
@@ -340,7 +342,7 @@ void KitDetectorPrivate::autoDetect()
autoDetectDebugger();
autoDetectPython();
const auto initializeKit = [this, toolchains, qtVersions, cmakeId](Kit *k) {
const auto initializeKit = [this, qtVersions, cmakeId](Kit *k) {
k->setAutoDetected(false);
k->setAutoDetectionSource(m_sharedId);
k->setUnexpandedDisplayName("%{Device:Name}");
@@ -352,18 +354,32 @@ void KitDetectorPrivate::autoDetect()
DeviceKitAspect::setDevice(k, m_device);
BuildDeviceKitAspect::setDevice(k, m_device);
QtVersion *qt = nullptr;
if (!qtVersions.isEmpty()) {
qt = qtVersions.at(0);
QtSupport::QtKitAspect::setQtVersion(k, qt);
const Toolchains toolchainCandidates = ToolchainManager::toolchains(
[this](const Toolchain *tc) { return tc->detectionSource() == m_sharedId; });
const QList<ToolchainBundle> bundles = ToolchainBundle::collectBundles(toolchainCandidates);
for (const ToolchainBundle &b : bundles)
ToolchainManager::registerToolchains(b.createdToolchains());
// Try to find a matching Qt/Toolchain pair.
bool match = false;
for (const ToolchainBundle &bundle : bundles) {
if (match)
break;
for (QtVersion * const qt : qtVersions) {
if (Utils::contains(qt->qtAbis(), [&bundle](const Abi &abi) {
return bundle.targetAbi().isCompatibleWith(abi);
})) {
match = true;
ToolchainKitAspect::setBundle(k, bundle);
QtKitAspect::setQtVersion(k, qt);
break;
}
}
}
Toolchains toolchainsToSet;
toolchainsToSet = ToolchainManager::toolchains([qt, this](const Toolchain *tc) {
return tc->detectionSource() == m_sharedId
&& (!qt || qt->qtAbis().contains(tc->targetAbi()));
});
for (Toolchain *toolchain : toolchainsToSet)
ToolchainKitAspect::setToolchain(k, toolchain);
// Otherwise, just set a random toolchain.
if (!match && !bundles.isEmpty())
ToolchainKitAspect::setBundle(k, bundles.first());
if (cmakeId.isValid())
k->setSticky(CMakeProjectManager::Constants::TOOL_ID, true);

View File

@@ -620,6 +620,13 @@ void ToolchainKitAspect::setToolchain(Kit *k, Toolchain *tc)
k->setValue(id(), variantFromStore(result));
}
void ToolchainKitAspect::setBundle(Kit *k, const ToolchainBundle &bundle)
{
bundle.forEach<Toolchain>([k](Toolchain &tc) {
setToolchain(k, &tc);
});
}
/**
* @brief ToolchainKitAspect::setAllToolchainsToMatch
*

View File

@@ -11,8 +11,8 @@
#include <utils/environment.h>
namespace ProjectExplorer {
class Toolchain;
class ToolchainBundle;
// SysRootKitAspect
@@ -36,6 +36,7 @@ public:
static Toolchain *cxxToolchain(const Kit *k);
static QList<Toolchain *> toolChains(const Kit *k);
static void setToolchain(Kit *k, Toolchain *tc);
static void setBundle(Kit *k, const ToolchainBundle &bundle);
static void setAllToolchainsToMatch(Kit *k, Toolchain *tc);
static void clearToolchain(Kit *k, Utils::Id language);
static Abi targetAbi(const Kit *k);

View File

@@ -246,7 +246,7 @@ public:
std::invoke(setter, static_cast<T &>(*tc), args...);
}
template<typename T> void forEach(const std::function<void(T &toolchain)> &modifier)
template<typename T> void forEach(const std::function<void(T &toolchain)> &modifier) const
{
for (Toolchain * const tc : std::as_const(m_toolchains))
modifier(static_cast<T &>(*tc));