diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 31e355d8108..fe433605e25 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1190,18 +1190,17 @@ void AndroidConfigurations::applyConfig() emit m_instance->updated(); } -static bool matchToolchain(const Toolchain *atc, const Toolchain *btc) +static bool matchKit(const ToolchainBundle &bundle, const Kit &kit) { - if (atc == btc) - return true; - - if (!atc || !btc) - return false; - - if (atc->typeId() != Constants::ANDROID_TOOLCHAIN_TYPEID || btc->typeId() != Constants::ANDROID_TOOLCHAIN_TYPEID) - return false; - - return atc->targetAbi() == btc->targetAbi(); + using namespace ProjectExplorer::Constants; + for (const Id lang : {C_LANGUAGE_ID, CXX_LANGUAGE_ID}) { + const Toolchain * const tc = ToolchainKitAspect::toolchain(&kit, lang); + if (!tc || tc->typeId() != Constants::ANDROID_TOOLCHAIN_TYPEID + || tc->targetAbi() != bundle.targetAbi()) { + return false; + } + } + return true; } void AndroidConfigurations::registerNewToolchains() @@ -1409,48 +1408,37 @@ void AndroidConfigurations::updateAutomaticKitList() } // register new kits - const Toolchains toolchains = ToolchainManager::toolchains([](const Toolchain *tc) { - return tc->isAutoDetected() && tc->typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID - && tc->isValid(); - }); - QList unhandledKits = existingKits; - for (Toolchain *tc : toolchains) { - if (tc->language() != ProjectExplorer::Constants::CXX_LANGUAGE_ID) - continue; - for (const QtVersion *qt : qtVersionsForArch.value(tc->targetAbi())) { - FilePath tcNdk = static_cast(tc)->ndkLocation(); + const QList bundles = Utils::filtered( + ToolchainBundle::collectBundles( + ToolchainManager::toolchains([](const Toolchain *tc) { + return tc->isAutoDetected() && tc->typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID; + }), + ToolchainBundle::AutoRegister::On), + [](const ToolchainBundle &b) { return b.isCompletelyValid(); }); + + QList unhandledKits = existingKits; + for (const ToolchainBundle &bundle : bundles) { + for (const QtVersion *qt : qtVersionsForArch.value(bundle.targetAbi())) { + const FilePath tcNdk = bundle.get(&AndroidToolchain::ndkLocation); if (tcNdk != AndroidConfig::ndkLocation(qt)) continue; - const Toolchains allLanguages - = Utils::filtered(toolchains, [tc, tcNdk](Toolchain *otherTc) { - FilePath otherNdk = static_cast(otherTc)->ndkLocation(); - return tc->targetAbi() == otherTc->targetAbi() && tcNdk == otherNdk; - }); - - QHash toolchainForLanguage; - for (Toolchain *tc : allLanguages) - toolchainForLanguage[tc->language()] = tc; - Kit *existingKit = Utils::findOrDefault(existingKits, [&](const Kit *b) { if (qt != QtKitAspect::qtVersion(b)) return false; - return matchToolchain(toolchainForLanguage[ProjectExplorer::Constants::CXX_LANGUAGE_ID], - ToolchainKitAspect::cxxToolchain(b)) - && matchToolchain(toolchainForLanguage[ProjectExplorer::Constants::C_LANGUAGE_ID], - ToolchainKitAspect::cToolchain(b)); + return matchKit(bundle, *b); }); - const auto initializeKit = [allLanguages, tc, qt](Kit *k) { + const auto initializeKit = [&bundle, qt](Kit *k) { k->setAutoDetected(true); k->setAutoDetectionSource("AndroidConfiguration"); DeviceTypeKitAspect::setDeviceTypeId(k, Constants::ANDROID_DEVICE_TYPE); - for (Toolchain *tc : allLanguages) - ToolchainKitAspect::setToolchain(k, tc); + ToolchainKitAspect::setBundle(k, bundle); QtKitAspect::setQtVersion(k, qt); QStringList abis = static_cast(qt)->androidAbis(); - Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis)); + Debugger::DebuggerKitAspect::setDebugger( + k, findOrRegisterDebugger(bundle.toolchains().first(), abis)); BuildDeviceKitAspect::setDeviceId(k, DeviceManager::defaultDesktopDevice()->id()); k->setSticky(QtKitAspect::id(), true);