Android: Use toolchain bundles for setting up the kits

Change-Id: I46f436cc9ccdb84543abf7bf78a93ed6fe27561c
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Christian Kandeler
2024-08-06 13:54:55 +02:00
parent d4f0da4c35
commit 3a2bcefca0

View File

@@ -1190,18 +1190,17 @@ void AndroidConfigurations::applyConfig()
emit m_instance->updated(); 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) 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; 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();
} }
void AndroidConfigurations::registerNewToolchains() void AndroidConfigurations::registerNewToolchains()
@@ -1409,48 +1408,37 @@ void AndroidConfigurations::updateAutomaticKitList()
} }
// register new kits // register new kits
const Toolchains toolchains = ToolchainManager::toolchains([](const Toolchain *tc) {
return tc->isAutoDetected() && tc->typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID
&& tc->isValid();
});
QList<Kit *> unhandledKits = existingKits;
for (Toolchain *tc : toolchains) {
if (tc->language() != ProjectExplorer::Constants::CXX_LANGUAGE_ID)
continue;
for (const QtVersion *qt : qtVersionsForArch.value(tc->targetAbi())) { const QList<ToolchainBundle> bundles = Utils::filtered(
FilePath tcNdk = static_cast<const AndroidToolchain *>(tc)->ndkLocation(); 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<Kit *> 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)) if (tcNdk != AndroidConfig::ndkLocation(qt))
continue; continue;
const Toolchains allLanguages
= Utils::filtered(toolchains, [tc, tcNdk](Toolchain *otherTc) {
FilePath otherNdk = static_cast<const AndroidToolchain *>(otherTc)->ndkLocation();
return tc->targetAbi() == otherTc->targetAbi() && tcNdk == otherNdk;
});
QHash<Id, Toolchain *> toolchainForLanguage;
for (Toolchain *tc : allLanguages)
toolchainForLanguage[tc->language()] = tc;
Kit *existingKit = Utils::findOrDefault(existingKits, [&](const Kit *b) { Kit *existingKit = Utils::findOrDefault(existingKits, [&](const Kit *b) {
if (qt != QtKitAspect::qtVersion(b)) if (qt != QtKitAspect::qtVersion(b))
return false; return false;
return matchToolchain(toolchainForLanguage[ProjectExplorer::Constants::CXX_LANGUAGE_ID], return matchKit(bundle, *b);
ToolchainKitAspect::cxxToolchain(b))
&& matchToolchain(toolchainForLanguage[ProjectExplorer::Constants::C_LANGUAGE_ID],
ToolchainKitAspect::cToolchain(b));
}); });
const auto initializeKit = [allLanguages, tc, qt](Kit *k) { const auto initializeKit = [&bundle, qt](Kit *k) {
k->setAutoDetected(true); k->setAutoDetected(true);
k->setAutoDetectionSource("AndroidConfiguration"); k->setAutoDetectionSource("AndroidConfiguration");
DeviceTypeKitAspect::setDeviceTypeId(k, Constants::ANDROID_DEVICE_TYPE); DeviceTypeKitAspect::setDeviceTypeId(k, Constants::ANDROID_DEVICE_TYPE);
for (Toolchain *tc : allLanguages) ToolchainKitAspect::setBundle(k, bundle);
ToolchainKitAspect::setToolchain(k, tc);
QtKitAspect::setQtVersion(k, qt); QtKitAspect::setQtVersion(k, qt);
QStringList abis = static_cast<const AndroidQtVersion *>(qt)->androidAbis(); QStringList abis = static_cast<const AndroidQtVersion *>(qt)->androidAbis();
Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis)); Debugger::DebuggerKitAspect::setDebugger(
k, findOrRegisterDebugger(bundle.toolchains().first(), abis));
BuildDeviceKitAspect::setDeviceId(k, DeviceManager::defaultDesktopDevice()->id()); BuildDeviceKitAspect::setDeviceId(k, DeviceManager::defaultDesktopDevice()->id());
k->setSticky(QtKitAspect::id(), true); k->setSticky(QtKitAspect::id(), true);