diff options
author | Tobias Hunger <tobias.hunger@digia.com> | 2013-01-22 12:47:07 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@digia.com> | 2013-01-22 16:02:31 +0100 |
commit | f2122583da0e8f32c6ed77cd56b69d66559fe5f7 (patch) | |
tree | db285ad76fa7929ebb083eca83cfc77cf207c81d | |
parent | 4d775ac56ac554b85c133d9eff5751d006c6171b (diff) | |
download | qt-creator-f2122583da0e8f32c6ed77cd56b69d66559fe5f7.tar.gz |
Kits: Reduce magic while improving setup
Task-number: QTCREATORBUG-8576
Task-number: QTCREATORBUG-8081
Change-Id: I9a6675a8ae97517f78bca026c4aa0edca82d606d
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
-rw-r--r-- | src/plugins/debugger/debuggerkitinformation.cpp | 5 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerkitinformation.h | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kit.cpp | 15 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kit.h | 3 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitinformation.cpp | 33 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitinformation.h | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmanager.cpp | 8 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmanager.h | 4 | ||||
-rw-r--r-- | src/plugins/projectexplorer/kitmodel.cpp | 8 | ||||
-rw-r--r-- | src/plugins/qt4projectmanager/qmakekitinformation.cpp | 2 | ||||
-rw-r--r-- | src/plugins/qt4projectmanager/qmakekitinformation.h | 2 |
11 files changed, 61 insertions, 22 deletions
diff --git a/src/plugins/debugger/debuggerkitinformation.cpp b/src/plugins/debugger/debuggerkitinformation.cpp index 7210757aa9..04bdaa6f06 100644 --- a/src/plugins/debugger/debuggerkitinformation.cpp +++ b/src/plugins/debugger/debuggerkitinformation.cpp @@ -199,6 +199,11 @@ DebuggerKitInformation::DebuggerItem DebuggerKitInformation::autoDetectItem(cons return result; } +void DebuggerKitInformation::setup(Kit *k) +{ + setDebuggerItem(k, autoDetectItem(k)); +} + // Check the configuration errors and return a flag mask. Provide a quick check and // a verbose one with a list of errors. diff --git a/src/plugins/debugger/debuggerkitinformation.h b/src/plugins/debugger/debuggerkitinformation.h index 785becdf96..ddef704bb3 100644 --- a/src/plugins/debugger/debuggerkitinformation.h +++ b/src/plugins/debugger/debuggerkitinformation.h @@ -65,6 +65,8 @@ public: QList<ProjectExplorer::Task> validate(const ProjectExplorer::Kit *k) const { return DebuggerKitInformation::validateDebugger(k); } + void setup(ProjectExplorer::Kit *k); + static QList<ProjectExplorer::Task> validateDebugger(const ProjectExplorer::Kit *k); static bool isValidDebugger(const ProjectExplorer::Kit *k); diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 713402b628..da2b221648 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -197,6 +197,21 @@ void Kit::fix() i->fix(this); } +void Kit::setup() +{ + KitGuard g(this); + QHash<Core::Id, QVariant> data = d->m_data; + for (int i = 0; i < 5; ++i) { + // Allow for some retries to settle down in a good configuration + // This is necessary for the Qt version to pick its preferred tool chain + // and that to pick a working debugger afterwards. + foreach (KitInformation *i, KitManager::instance()->kitInformation()) + i->setup(this); + if (d->m_data == data) + break; + } +} + QString Kit::displayName() const { return d->m_displayName; diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 475b1d9601..c2f362f80f 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -66,7 +66,8 @@ public: bool isValid() const; QList<Task> validate() const; - void fix(); + void fix(); // Fix the individual kit information. + void setup(); // Apply advanced magic(TM). Used only once on each kit during initial setup. QString displayName() const; void setDisplayName(const QString &name); diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 81c068c43f..77e96b3a86 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -181,6 +181,23 @@ void ToolChainKitInformation::fix(Kit *k) setToolChain(k, 0); // make sure to clear out no longer known tool chains } +void ToolChainKitInformation::setup(Kit *k) +{ + const QString id = k->value(Core::Id(TOOLCHAIN_INFORMATION)).toString(); + if (id.isEmpty()) + return; + + ToolChain *tc = ToolChainManager::instance()->findToolChain(id); + if (tc) + return; + + // ID is not found: Might be an ABI string... + foreach (ToolChain *current, ToolChainManager::instance()->toolChains()) { + if (current->targetAbi().toString() == id) + return setToolChain(k, current); + } +} + KitConfigWidget *ToolChainKitInformation::createConfigWidget(Kit *k) const { return new Internal::ToolChainInformationConfigWidget(k); @@ -209,20 +226,8 @@ ToolChain *ToolChainKitInformation::toolChain(const Kit *k) { if (!k) return 0; - const QString id = k->value(Core::Id(TOOLCHAIN_INFORMATION)).toString(); - if (id.isEmpty()) - return 0; - - ToolChain *tc = ToolChainManager::instance()->findToolChain(id); - if (tc) - return tc; - - // ID is not found: Might be an ABI string... - foreach (ToolChain *current, ToolChainManager::instance()->toolChains()) { - if (current->targetAbi().toString() == id) - return current; - } - return 0; + return ToolChainManager::instance() + ->findToolChain(k->value(Core::Id(TOOLCHAIN_INFORMATION)).toString()); } void ToolChainKitInformation::setToolChain(Kit *k, ToolChain *tc) diff --git a/src/plugins/projectexplorer/kitinformation.h b/src/plugins/projectexplorer/kitinformation.h index 3abb091eab..60a7af2924 100644 --- a/src/plugins/projectexplorer/kitinformation.h +++ b/src/plugins/projectexplorer/kitinformation.h @@ -104,6 +104,7 @@ public: QList<Task> validate(const Kit *k) const; void fix(Kit *k); + void setup(Kit *k); KitConfigWidget *createConfigWidget(Kit *k) const; diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 1daf495349..8c5a3cb055 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -148,9 +148,11 @@ void KitManager::restoreKits() QFileInfo kitFile(systemSettingsFile.absolutePath() + QLatin1String(KIT_FILENAME)); if (kitFile.exists()) { KitList system = restoreKits(Utils::FileName(kitFile)); - // make sure we mark these as autodetected! - foreach (Kit *k, system.kits) + // make sure we mark these as autodetected and run additional setup logic + foreach (Kit *k, system.kits) { k->setAutoDetected(true); + k->setup(); + } // SDK kits are always considered to be up for validation since they might have been // extended with additional information by creator in the meantime: @@ -202,6 +204,8 @@ void KitManager::restoreKits() defaultKit->setAutoDetected(false); defaultKit->setIconPath(QLatin1String(":///DESKTOP///")); + defaultKit->setup(); + addKit(defaultKit); } diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index fb52aefb17..320c8560b0 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -74,8 +74,12 @@ public: virtual bool visibleIn(Kit *) { return true; } virtual QVariant defaultValue(Kit *) const = 0; + // called to find issues with the kit virtual QList<Task> validate(const Kit *) const = 0; + // called to fix issues with this kitinformation. Does not modify the rest of the kit. virtual void fix(Kit *) { return; } + // called on initial setup of a kit. + virtual void setup(Kit *) { return; } virtual ItemList toUserOutput(Kit *) const = 0; diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index de7d9ff30c..cbf723b124 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -322,12 +322,14 @@ Kit *KitModel::markForAddition(Kit *baseKit) beginInsertRows(index(m_manualRoot), pos, pos); KitNode *node = createNode(m_manualRoot, 0); + Kit *k = node->widget->workingCopy(); + KitGuard g(k); if (baseKit) { - Kit *k = node->widget->workingCopy(); - KitGuard g(k); k->copyFrom(baseKit); k->setAutoDetected(false); // Make sure we have a manual kit! k->setDisplayName(tr("Clone of %1").arg(k->displayName())); + } else { + k->setup(); } if (!m_defaultNode) @@ -335,7 +337,7 @@ Kit *KitModel::markForAddition(Kit *baseKit) endInsertRows(); - return node->widget->workingCopy(); + return k; } QModelIndex KitModel::index(KitNode *node, int column) const diff --git a/src/plugins/qt4projectmanager/qmakekitinformation.cpp b/src/plugins/qt4projectmanager/qmakekitinformation.cpp index 65dc5d1acc..3b192d9365 100644 --- a/src/plugins/qt4projectmanager/qmakekitinformation.cpp +++ b/src/plugins/qt4projectmanager/qmakekitinformation.cpp @@ -84,7 +84,7 @@ QList<ProjectExplorer::Task> QmakeKitInformation::validate(const ProjectExplorer return result; } -void QmakeKitInformation::fix(ProjectExplorer::Kit *k) +void QmakeKitInformation::setup(ProjectExplorer::Kit *k) { QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); if (!version) diff --git a/src/plugins/qt4projectmanager/qmakekitinformation.h b/src/plugins/qt4projectmanager/qmakekitinformation.h index e1c630f588..c432966dfd 100644 --- a/src/plugins/qt4projectmanager/qmakekitinformation.h +++ b/src/plugins/qt4projectmanager/qmakekitinformation.h @@ -50,7 +50,7 @@ public: QVariant defaultValue(ProjectExplorer::Kit *k) const; QList<ProjectExplorer::Task> validate(const ProjectExplorer::Kit *k) const; - void fix(ProjectExplorer::Kit *k); + void setup(ProjectExplorer::Kit *k); ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *k) const; |