aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/projectimporter.cpp
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2017-02-07 14:40:18 +0100
committerTobias Hunger <tobias.hunger@qt.io>2017-02-10 10:33:45 +0000
commit87504eac2d28991f6a6361d722d2a0d41a4e277c (patch)
treed16955c23efadb294943200ab4441af8ac4a49d2 /src/plugins/projectexplorer/projectimporter.cpp
parent587b2cbe0feff5c29c5eac256679dbb5addbde53 (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.cpp79
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