From bd309397ede43954d6ea00df1b95d462b65477ac Mon Sep 17 00:00:00 2001
From: El Mehdi Fekari <mfekari@blackberry.com>
Date: Tue, 10 Dec 2013 11:19:55 +0100
Subject: [PATCH] Qnx: Set auto detection source for generated kits

Set the auto detection source for generated kits
to the target's ndk env file path. This ease the way
to deactivate configurations and handles targets sharing
the same QNX_HOST.

Task-number: QTCREATORBUG-10818

Change-Id: I823fb498f54e52c704a806234e7b4a0a6c8da4e7
Reviewed-by: David Kaspar <dkaspar@blackberry.com>
Reviewed-by: Nicolas Arnaud-Cormos <nicolas@kdab.com>
---
 src/plugins/qnx/blackberryconfiguration.cpp   | 59 +++++++------------
 src/plugins/qnx/blackberryconfiguration.h     |  1 -
 .../qnx/blackberryconfigurationmanager.cpp    | 22 +++++++
 .../qnx/blackberryconfigurationmanager.h      |  1 +
 4 files changed, 43 insertions(+), 40 deletions(-)

diff --git a/src/plugins/qnx/blackberryconfiguration.cpp b/src/plugins/qnx/blackberryconfiguration.cpp
index ec6f95587dc..3404e6f7eb6 100644
--- a/src/plugins/qnx/blackberryconfiguration.cpp
+++ b/src/plugins/qnx/blackberryconfiguration.cpp
@@ -169,7 +169,13 @@ bool BlackBerryConfiguration::isAutoDetected() const
 
 bool BlackBerryConfiguration::isActive() const
 {
-    return !findRegisteredQtVersions().isEmpty();
+    foreach (Kit *kit, KitManager::kits()) {
+        if (kit->isAutoDetected() &&
+                kit->autoDetectionSource() == m_ndkEnvFile.toString())
+            return true;
+    }
+
+    return false;
 }
 
 bool BlackBerryConfiguration::isValid() const
@@ -277,6 +283,7 @@ Kit *BlackBerryConfiguration::createKit(
     kit->setIconPath(FileName::fromString(QLatin1String(Constants::QNX_BB_CATEGORY_ICON)));
 
     kit->setAutoDetected(true);
+    kit->setAutoDetectionSource(m_ndkEnvFile.toString());
     kit->setMutable(DeviceKitInformation::id(), true);
 
     kit->setSticky(QtKitInformation::id(), true);
@@ -370,50 +377,24 @@ bool BlackBerryConfiguration::activate()
     return true;
 }
 
-QList<BaseQtVersion *> BlackBerryConfiguration::findRegisteredQtVersions() const
-{
-    QList<BaseQtVersion *> versions;
-    foreach (BaseQtVersion *version, QtVersionManager::versions()) {
-        if (version->type() == QLatin1String(Constants::QNX_BB_QT)) {
-            QnxAbstractQtVersion *qnxVersion = dynamic_cast<QnxAbstractQtVersion *>(version);
-            if (qnxVersion  &&  qnxVersion->isAutodetected()
-                    && (qnxVersion->qmakeCommand() == qmake4BinaryFile()
-                    || qnxVersion->qmakeCommand() == qmake5BinaryFile()))
-                versions << qnxVersion;
-        }
-    }
-    return versions;
-}
-
 void BlackBerryConfiguration::deactivate()
 {
-    QList<BaseQtVersion *> versions = findRegisteredQtVersions();
-    QList<ToolChain *> toolChains;
     foreach (Kit *kit, KitManager::kits()) {
-        if (kit->isAutoDetected()) {
+        if (kit->isAutoDetected() &&
+                kit->autoDetectionSource() == ndkEnvFile().toString()) {
             BaseQtVersion *version = QtKitInformation::qtVersion(kit);
-            if (versions.contains(version)) {
-                ToolChain *toolChain = ToolChainKitInformation::toolChain(kit);
-                if (toolChain)
-                    toolChains << toolChain;
-                KitManager::deregisterKit(kit);
-            }
+            ToolChain *toolChain = ToolChainKitInformation::toolChain(kit);
+            const DebuggerItem *debugger = DebuggerKitInformation::debugger(kit);
+            if (version)
+                QtVersionManager::removeVersion(version);
+            if (toolChain)
+                ToolChainManager::deregisterToolChain(toolChain);
+            if (debugger)
+                DebuggerItemManager::deregisterDebugger(debugger->id());
+
+            KitManager::deregisterKit(kit);
         }
     }
-
-    foreach (const DebuggerItem &item, DebuggerItemManager::debuggers())
-        if (item.isAutoDetected() &&
-                (item.command() == m_simulatorDebugger || item.command() == m_deviceDebugger))
-                DebuggerItemManager::deregisterDebugger(item.id());
-
-    foreach (ToolChain *toolChain, ToolChainManager::toolChains())
-        if (toolChain->isAutoDetected()
-                && (toolChains.contains(toolChain) || toolChain->compilerCommand() == m_gccCompiler))
-            ToolChainManager::deregisterToolChain(toolChain);
-
-    foreach (BaseQtVersion *version, versions)
-        QtVersionManager::removeVersion(version);
-
 }
 
 } // namespace Internal
diff --git a/src/plugins/qnx/blackberryconfiguration.h b/src/plugins/qnx/blackberryconfiguration.h
index 9701e43485b..8bc2c4ee1c3 100644
--- a/src/plugins/qnx/blackberryconfiguration.h
+++ b/src/plugins/qnx/blackberryconfiguration.h
@@ -108,7 +108,6 @@ private:
     ProjectExplorer::Kit* createKit(
             QnxAbstractQtVersion* version, QnxToolChain* toolChain,
             const QVariant &debuggerItemId);
-    QList<QtSupport::BaseQtVersion *> findRegisteredQtVersions() const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qnx/blackberryconfigurationmanager.cpp b/src/plugins/qnx/blackberryconfigurationmanager.cpp
index a7f265dcc93..10d4c9ffbd3 100644
--- a/src/plugins/qnx/blackberryconfigurationmanager.cpp
+++ b/src/plugins/qnx/blackberryconfigurationmanager.cpp
@@ -49,6 +49,8 @@
 #include <qtsupport/qtversionmanager.h>
 #include <qtsupport/qtkitinformation.h>
 
+#include <debugger/debuggerkitinformation.h>
+
 #include <QMessageBox>
 #include <QFileInfo>
 
@@ -212,6 +214,23 @@ void BlackBerryConfigurationManager::clearInvalidConfigurations()
     }
 }
 
+void BlackBerryConfigurationManager::setKitsAutoDetectionSource()
+{
+    foreach (Kit *kit, KitManager::kits()) {
+        if (kit->isAutoDetected() &&
+                (DeviceTypeKitInformation::deviceTypeId(kit) ==  Constants::QNX_BB_CATEGORY_ICON) &&
+                kit->autoDetectionSource().isEmpty()) {
+            QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(kit);
+            foreach (BlackBerryConfiguration *config, m_configs) {
+                if ((version &&
+                     (version->qmakeCommand() == config->qmake4BinaryFile() || version->qmakeCommand() == config->qmake5BinaryFile()))
+                        && (SysRootKitInformation::sysRoot(kit) == config->sysRoot()))
+                    kit->setAutoDetectionSource(config->ndkEnvFile().toString());
+            }
+        }
+    }
+}
+
 // Switch to QnxToolchain for exisintg configuration using GccToolChain
 void BlackBerryConfigurationManager::checkToolChainConfiguration()
 {
@@ -320,6 +339,9 @@ QList<Utils::EnvironmentItem> BlackBerryConfigurationManager::defaultQnxEnv()
 
 void BlackBerryConfigurationManager::loadSettings()
 {
+    // Backward compatibility: Set kit's auto detection source
+    // for existing BlackBerry kits that do not have it set yet.
+    setKitsAutoDetectionSource();
     clearInvalidConfigurations();
     loadAutoDetectedConfigurations();
     loadManualConfigurations();
diff --git a/src/plugins/qnx/blackberryconfigurationmanager.h b/src/plugins/qnx/blackberryconfigurationmanager.h
index 97602e0633c..7934a2adc61 100644
--- a/src/plugins/qnx/blackberryconfigurationmanager.h
+++ b/src/plugins/qnx/blackberryconfigurationmanager.h
@@ -84,6 +84,7 @@ private:
     void saveManualConfigurations();
     void saveActiveConfigurationNdkEnvPath();
     void clearInvalidConfigurations();
+    void setKitsAutoDetectionSource();
 
     QStringList activeConfigurationNdkEnvPaths();
 };
-- 
GitLab