Android: Don't remove all kits on changing the ndk

Instead compare the toolchain version (and abi) and replace the old
toolchain with the new toolchain.

This requires splitting up the updating into two parts, registering
the new toolchains first, then updating the kits and last removing
old toolchains.

Change-Id: Ida6aa27e84f683ef7a3159b69bb12f93cee4ec67
Task-number: QTCREATORBUG-14243
Reviewed-by: BogDan Vatra <bogdan@kde.org>
This commit is contained in:
Daniel Teske
2015-04-22 17:42:23 +02:00
parent 548ec9c099
commit 557bac136b
2 changed files with 29 additions and 6 deletions

View File

@@ -1118,8 +1118,9 @@ void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs)
m_instance->save();
m_instance->updateAndroidDevice();
m_instance->updateToolChainList();
m_instance->registerNewToolChains();
m_instance->updateAutomaticKitList();
m_instance->removeOldToolChains();
emit m_instance->updated();
}
@@ -1176,11 +1177,25 @@ QString AndroidConfigurations::defaultDevice(Project *project, const QString &ab
static bool equalKits(Kit *a, Kit *b)
{
return ToolChainKitInformation::toolChain(a) == ToolChainKitInformation::toolChain(b)
&& QtSupport::QtKitInformation::qtVersion(a) == QtSupport::QtKitInformation::qtVersion(b);
if (QtSupport::QtKitInformation::qtVersion(a) != QtSupport::QtKitInformation::qtVersion(b))
return false;
ToolChain *atc = ToolChainKitInformation::toolChain(a);
ToolChain *btc = ToolChainKitInformation::toolChain(b);
if (atc == btc)
return true;
if (!atc || atc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE))
return false;
if (!btc || btc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE))
return false;
AndroidToolChain *aatc = static_cast<AndroidToolChain *>(atc);
AndroidToolChain *bbtc = static_cast<AndroidToolChain *>(btc);
if (aatc->ndkToolChainVersion() == bbtc->ndkToolChainVersion()
&& aatc->targetAbi() == bbtc->targetAbi())
return true;
return false;
}
void AndroidConfigurations::updateToolChainList()
void AndroidConfigurations::registerNewToolChains()
{
QList<ToolChain *> existingToolChains = ToolChainManager::toolChains();
QList<ToolChain *> toolchains = AndroidToolChainFactory::createToolChainsForNdk(AndroidConfigurations::currentConfig().ndkLocation());
@@ -1197,8 +1212,11 @@ void AndroidConfigurations::updateToolChainList()
else
ToolChainManager::registerToolChain(tc);
}
}
foreach (ToolChain *tc, existingToolChains) {
void AndroidConfigurations::removeOldToolChains()
{
foreach (ToolChain *tc, ToolChainManager::toolChains()) {
if (tc->type() == QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE)) {
if (!tc->isValid())
ToolChainManager::deregisterToolChain(tc);
@@ -1217,6 +1235,8 @@ void AndroidConfigurations::updateAutomaticKitList()
continue;
if (tc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE))
continue;
if (!tc->isValid()) // going to be deleted
continue;
toolchains << static_cast<AndroidToolChain *>(tc);
}
}
@@ -1304,6 +1324,7 @@ void AndroidConfigurations::updateAutomaticKitList()
newKits.removeAt(j);
existingKits.at(i)->makeSticky();
existingKits.removeAt(i);
ToolChainKitInformation::setToolChain(existingKit, ToolChainKitInformation::toolChain(newKit));
KitManager::deleteKit(newKit);
j = newKits.count();
}
@@ -1314,6 +1335,7 @@ void AndroidConfigurations::updateAutomaticKitList()
ToolChain *tc = ToolChainKitInformation::toolChain(k);
QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(k);
if (tc && tc->type() == QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE)
&& tc->isValid()
&& qtVersion && qtVersion->type() == QLatin1String(Constants::ANDROIDQT)) {
k->makeUnSticky();
k->setAutoDetected(false);