diff --git a/src/plugins/docker/kitdetector.cpp b/src/plugins/docker/kitdetector.cpp index d25b256bb88..65565c2f3d5 100644 --- a/src/plugins/docker/kitdetector.cpp +++ b/src/plugins/docker/kitdetector.cpp @@ -262,7 +262,9 @@ Toolchains KitDetectorPrivate::autoDetectToolchains() .arg(toolchain->compilerCommand().toUserOutput())); toolchain->setDetectionSource(m_sharedId); } - ToolchainManager::registerToolchains(newToolchains); + const QList 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 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 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); diff --git a/src/plugins/projectexplorer/kitaspects.cpp b/src/plugins/projectexplorer/kitaspects.cpp index b0a99951b70..582150476f6 100644 --- a/src/plugins/projectexplorer/kitaspects.cpp +++ b/src/plugins/projectexplorer/kitaspects.cpp @@ -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([k](Toolchain &tc) { + setToolchain(k, &tc); + }); +} + /** * @brief ToolchainKitAspect::setAllToolchainsToMatch * diff --git a/src/plugins/projectexplorer/kitaspects.h b/src/plugins/projectexplorer/kitaspects.h index 840cf0af424..45111c81016 100644 --- a/src/plugins/projectexplorer/kitaspects.h +++ b/src/plugins/projectexplorer/kitaspects.h @@ -11,8 +11,8 @@ #include namespace ProjectExplorer { - class Toolchain; +class ToolchainBundle; // SysRootKitAspect @@ -36,6 +36,7 @@ public: static Toolchain *cxxToolchain(const Kit *k); static QList 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); diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index dd3459905c2..7dfe6c1a4de 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -246,7 +246,7 @@ public: std::invoke(setter, static_cast(*tc), args...); } - template void forEach(const std::function &modifier) + template void forEach(const std::function &modifier) const { for (Toolchain * const tc : std::as_const(m_toolchains)) modifier(static_cast(*tc));