diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2017-02-07 14:40:18 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2017-02-10 10:33:45 +0000 |
commit | 87504eac2d28991f6a6361d722d2a0d41a4e277c (patch) | |
tree | d16955c23efadb294943200ab4441af8ac4a49d2 /src/plugins/projectexplorer/projectimporter.cpp | |
parent | 587b2cbe0feff5c29c5eac256679dbb5addbde53 (diff) |
ProjectExplorer: Handle toolchains at the ProjectImporter level
Change-Id: I941d2eaa6fdd6135b49b51e8f685fb1d0d8b652c
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/plugins/projectexplorer/projectimporter.cpp')
-rw-r--r-- | src/plugins/projectexplorer/projectimporter.cpp | 79 |
1 files changed, 78 insertions, 1 deletions
diff --git a/src/plugins/projectexplorer/projectimporter.cpp b/src/plugins/projectexplorer/projectimporter.cpp index 563510da8b6..91126ba4b13 100644 --- a/src/plugins/projectexplorer/projectimporter.cpp +++ b/src/plugins/projectexplorer/projectimporter.cpp @@ -32,9 +32,13 @@ #include "project.h" #include "projectexplorerconstants.h" #include "target.h" +#include "toolchain.h" +#include "toolchainmanager.h" #include <coreplugin/icore.h> +#include <extensionsystem/pluginmanager.h> + #include <utils/algorithm.h> #include <utils/qtcassert.h> @@ -70,7 +74,11 @@ static bool hasOtherUsers(Core::Id id, const QVariant &v, Kit *k) } ProjectImporter::ProjectImporter(const Utils::FileName &path) : m_projectPath(path) -{ } +{ + useTemporaryKitInformation(ToolChainKitInformation::id(), + [this](Kit *k, const QVariantList &vl) { cleanupTemporaryToolChains(k, vl); }, + [this](Kit *k, const QVariantList &vl) { persistTemporaryToolChains(k, vl); }); +} ProjectImporter::~ProjectImporter() { @@ -302,6 +310,33 @@ bool ProjectImporter::findTemporaryHandler(Core::Id id) const return Utils::contains(m_temporaryHandlers, [id](const TemporaryInformationHandler &ch) { return ch.id == id; }); } +static ToolChain *toolChainFromVariant(const QVariant &v) +{ + const QByteArray tcId = v.toByteArray(); + return ToolChainManager::findToolChain(tcId); +} + +void ProjectImporter::cleanupTemporaryToolChains(Kit *k, const QVariantList &vl) +{ + for (const QVariant &v : vl) { + ToolChain *tc = toolChainFromVariant(v); + QTC_ASSERT(tc, continue); + ToolChainManager::deregisterToolChain(tc); + ToolChainKitInformation::setToolChain(k, nullptr); + } +} + +void ProjectImporter::persistTemporaryToolChains(Kit *k, const QVariantList &vl) +{ + for (const QVariant &v : vl) { + ToolChain *tmpTc = toolChainFromVariant(v); + QTC_ASSERT(tmpTc, continue); + ToolChain *actualTc = ToolChainKitInformation::toolChain(k, tmpTc->language()); + if (tmpTc && actualTc != tmpTc) + ToolChainManager::deregisterToolChain(tmpTc); + } +} + void ProjectImporter::useTemporaryKitInformation(Core::Id id, ProjectImporter::CleanupFunction cleanup, ProjectImporter::PersistFunction persist) @@ -330,4 +365,46 @@ bool ProjectImporter::hasKitWithTemporaryData(Core::Id id, const QVariant &data) }); } +static ProjectImporter::ToolChainData +createToolChains(const Utils::FileName &toolChainPath, const Core::Id &language) +{ + const QList<ToolChainFactory *> factories + = ExtensionSystem::PluginManager::getObjects<ToolChainFactory>(); + ProjectImporter::ToolChainData data; + + for (ToolChainFactory *factory : factories) { + data.tcs = factory->autoDetect(toolChainPath, language); + if (data.tcs.isEmpty()) + continue; + + for (ToolChain *tc : data.tcs) + ToolChainManager::registerToolChain(tc); + + data.areTemporary = true; + break; + } + + return data; +} + +ProjectImporter::ToolChainData +ProjectImporter::findOrCreateToolChains(const Utils::FileName &toolChainPath, + const Core::Id &language) const +{ + ToolChainData result; + result.tcs = ToolChainManager::toolChains([toolChainPath, language](const ToolChain *tc) { + return tc->language() == language && tc->compilerCommand() == toolChainPath; + }); + for (const ToolChain *tc : result.tcs) { + const QByteArray tcId = tc->id(); + result.areTemporary = result.areTemporary ? true : hasKitWithTemporaryData(ToolChainKitInformation::id(), tcId); + } + if (!result.tcs.isEmpty()) + return result; + + // Create a new toolchain: + UpdateGuard guard(*this); + return createToolChains(toolChainPath, language); +} + } // namespace ProjectExplorer |