diff --git a/src/plugins/debugger/debuggerkitinformation.cpp b/src/plugins/debugger/debuggerkitinformation.cpp index 7210757aa97..04bdaa6f06c 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 785becdf96b..ddef704bb39 100644 --- a/src/plugins/debugger/debuggerkitinformation.h +++ b/src/plugins/debugger/debuggerkitinformation.h @@ -65,6 +65,8 @@ public: QList validate(const ProjectExplorer::Kit *k) const { return DebuggerKitInformation::validateDebugger(k); } + void setup(ProjectExplorer::Kit *k); + static QList 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 713402b628f..da2b2216481 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 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 475b1d9601a..c2f362f80f5 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -66,7 +66,8 @@ public: bool isValid() const; QList 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 81c068c43f6..77e96b3a86e 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 3abb091eaba..60a7af2924e 100644 --- a/src/plugins/projectexplorer/kitinformation.h +++ b/src/plugins/projectexplorer/kitinformation.h @@ -104,6 +104,7 @@ public: QList 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 1daf4953492..8c5a3cb0558 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 fb52aefb17e..320c8560b04 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 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 de7d9ff30cc..cbf723b1240 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 65dc5d1acc4..3b192d9365d 100644 --- a/src/plugins/qt4projectmanager/qmakekitinformation.cpp +++ b/src/plugins/qt4projectmanager/qmakekitinformation.cpp @@ -84,7 +84,7 @@ QList 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 e1c630f5884..c432966dfd5 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 validate(const ProjectExplorer::Kit *k) const; - void fix(ProjectExplorer::Kit *k); + void setup(ProjectExplorer::Kit *k); ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *k) const;