diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 8e196299275..3b3e710426c 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -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(atc); + AndroidToolChain *bbtc = static_cast(btc); + if (aatc->ndkToolChainVersion() == bbtc->ndkToolChainVersion() + && aatc->targetAbi() == bbtc->targetAbi()) + return true; + return false; } -void AndroidConfigurations::updateToolChainList() +void AndroidConfigurations::registerNewToolChains() { QList existingToolChains = ToolChainManager::toolChains(); QList 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(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); diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 687ec1cfce0..6c0a17b8eec 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -228,7 +228,8 @@ public: static QString defaultDevice(ProjectExplorer::Project *project, const QString &abi); // serial number or avd name public slots: static void clearDefaultDevices(ProjectExplorer::Project *project); - static void updateToolChainList(); + static void registerNewToolChains(); + static void removeOldToolChains(); static void updateAutomaticKitList(); static bool force32bitEmulator();