From 5cf087ac5d9ff2f7a8b1531fa5c34bd8a714c365 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Wed, 8 May 2019 22:54:01 +0300 Subject: [PATCH] ProjectExplorer: Introduce new ToolChainFactory::Candidate class ... to unify the bare-metal toolchains auto-detection algorithms. Change-Id: I669420eac61fe1f0ab3f88ffaf2aa8e6bbad2102 Reviewed-by: hjk Reviewed-by: Christian Kandeler --- src/plugins/baremetal/iarewtoolchain.cpp | 8 ++++---- src/plugins/baremetal/iarewtoolchain.h | 4 ---- src/plugins/baremetal/keiltoolchain.cpp | 8 ++++---- src/plugins/baremetal/keiltoolchain.h | 4 ---- src/plugins/baremetal/sdcctoolchain.cpp | 10 +++++----- src/plugins/baremetal/sdcctoolchain.h | 4 ---- src/plugins/projectexplorer/toolchain.h | 13 +++++++++++++ 7 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/plugins/baremetal/iarewtoolchain.cpp b/src/plugins/baremetal/iarewtoolchain.cpp index 0525249dcf0..15986d878b4 100644 --- a/src/plugins/baremetal/iarewtoolchain.cpp +++ b/src/plugins/baremetal/iarewtoolchain.cpp @@ -497,7 +497,7 @@ QList IarToolChainFactory::autoDetectToolchains( const QList filtered = Utils::filtered( alreadyKnown, [candidate](ToolChain *tc) { return tc->typeId() == Constants::IAREW_TOOLCHAIN_TYPEID - && tc->compilerCommand() == candidate.first + && tc->compilerCommand() == candidate.compilerPath && (tc->language() == ProjectExplorer::Constants::C_LANGUAGE_ID || tc->language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID); }); @@ -519,16 +519,16 @@ QList IarToolChainFactory::autoDetectToolchain( const Candidate &candidate, Core::Id language) const { const auto env = Environment::systemEnvironment(); - const Macros macros = dumpPredefinedMacros(candidate.first, env.toStringList()); + const Macros macros = dumpPredefinedMacros(candidate.compilerPath, env.toStringList()); if (macros.isEmpty()) return {}; const Abi abi = guessAbi(macros); const auto tc = new IarToolChain(ToolChain::AutoDetection); tc->setLanguage(language); - tc->setCompilerCommand(candidate.first); + tc->setCompilerCommand(candidate.compilerPath); tc->setTargetAbi(abi); - tc->setDisplayName(buildDisplayName(abi.architecture(), language, candidate.second)); + tc->setDisplayName(buildDisplayName(abi.architecture(), language, candidate.compilerVersion)); const auto languageVersion = ToolChain::languageVersion(language, macros); tc->predefinedMacrosCache()->insert({}, {macros, languageVersion}); diff --git a/src/plugins/baremetal/iarewtoolchain.h b/src/plugins/baremetal/iarewtoolchain.h index 06b93577a2d..6e6b0befa68 100644 --- a/src/plugins/baremetal/iarewtoolchain.h +++ b/src/plugins/baremetal/iarewtoolchain.h @@ -119,10 +119,6 @@ public: ProjectExplorer::ToolChain *restore(const QVariantMap &data) final; private: - // File path + version. - using Candidate = QPair; - using Candidates = QVector; - QList autoDetectToolchains(const Candidates &candidates, const QList &alreadyKnown) const; QList autoDetectToolchain( diff --git a/src/plugins/baremetal/keiltoolchain.cpp b/src/plugins/baremetal/keiltoolchain.cpp index 755b25b25a7..1c0628c9526 100644 --- a/src/plugins/baremetal/keiltoolchain.cpp +++ b/src/plugins/baremetal/keiltoolchain.cpp @@ -501,7 +501,7 @@ QList KeilToolchainFactory::autoDetectToolchains( const QList filtered = Utils::filtered( alreadyKnown, [candidate](ToolChain *tc) { return tc->typeId() == Constants::IAREW_TOOLCHAIN_TYPEID - && tc->compilerCommand() == candidate.first + && tc->compilerCommand() == candidate.compilerPath && (tc->language() == ProjectExplorer::Constants::C_LANGUAGE_ID || tc->language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID); }); @@ -523,16 +523,16 @@ QList KeilToolchainFactory::autoDetectToolchain( const Candidate &candidate, Core::Id language) const { const auto env = Environment::systemEnvironment(); - const Macros macros = dumpPredefinedMacros(candidate.first, env.toStringList()); + const Macros macros = dumpPredefinedMacros(candidate.compilerPath, env.toStringList()); if (macros.isEmpty()) return {}; const Abi abi = guessAbi(macros); const auto tc = new KeilToolchain(ToolChain::AutoDetection); tc->setLanguage(language); - tc->setCompilerCommand(candidate.first); + tc->setCompilerCommand(candidate.compilerPath); tc->setTargetAbi(abi); - tc->setDisplayName(buildDisplayName(abi.architecture(), language, candidate.second)); + tc->setDisplayName(buildDisplayName(abi.architecture(), language, candidate.compilerVersion)); const auto languageVersion = ToolChain::languageVersion(language, macros); tc->predefinedMacrosCache()->insert({}, {macros, languageVersion}); diff --git a/src/plugins/baremetal/keiltoolchain.h b/src/plugins/baremetal/keiltoolchain.h index 36f28900f65..9cc91538233 100644 --- a/src/plugins/baremetal/keiltoolchain.h +++ b/src/plugins/baremetal/keiltoolchain.h @@ -119,10 +119,6 @@ public: ProjectExplorer::ToolChain *restore(const QVariantMap &data) final; private: - // File path + version. - using Candidate = QPair; - using Candidates = QVector; - QList autoDetectToolchains(const Candidates &candidates, const QList &alreadyKnown) const; QList autoDetectToolchain( diff --git a/src/plugins/baremetal/sdcctoolchain.cpp b/src/plugins/baremetal/sdcctoolchain.cpp index 493f8867875..7257c48cf86 100644 --- a/src/plugins/baremetal/sdcctoolchain.cpp +++ b/src/plugins/baremetal/sdcctoolchain.cpp @@ -436,7 +436,7 @@ QList SdccToolChainFactory::autoDetect(const QList &al const auto env = Environment::systemEnvironment(); const auto macros = dumpPredefinedMacros(fn, env.toStringList(), {}); const QString version = guessVersion(macros); - const Candidate candidate(fn, version); + const Candidate candidate = {fn, version}; if (!candidates.contains(candidate)) candidates.push_back(candidate); } @@ -478,7 +478,7 @@ QList SdccToolChainFactory::autoDetectToolchains( const QList filtered = Utils::filtered( alreadyKnown, [candidate](ToolChain *tc) { return tc->typeId() == Constants::SDCC_TOOLCHAIN_TYPEID - && tc->compilerCommand() == candidate.first + && tc->compilerCommand() == candidate.compilerPath && (tc->language() == ProjectExplorer::Constants::C_LANGUAGE_ID); }); @@ -498,16 +498,16 @@ QList SdccToolChainFactory::autoDetectToolchain( const Candidate &candidate, Core::Id language) const { const auto env = Environment::systemEnvironment(); - const Macros macros = dumpPredefinedMacros(candidate.first, env.toStringList(), {}); + const Macros macros = dumpPredefinedMacros(candidate.compilerPath, env.toStringList(), {}); if (macros.isEmpty()) return {}; const Abi abi = guessAbi(macros); const auto tc = new SdccToolChain(ToolChain::AutoDetection); tc->setLanguage(language); - tc->setCompilerCommand(candidate.first); + tc->setCompilerCommand(candidate.compilerPath); tc->setTargetAbi(abi); - tc->setDisplayName(buildDisplayName(abi.architecture(), language, candidate.second)); + tc->setDisplayName(buildDisplayName(abi.architecture(), language, candidate.compilerVersion)); const auto languageVersion = ToolChain::languageVersion(language, macros); tc->predefinedMacrosCache()->insert({}, {macros, languageVersion}); diff --git a/src/plugins/baremetal/sdcctoolchain.h b/src/plugins/baremetal/sdcctoolchain.h index 93cbcfab496..62a56647205 100644 --- a/src/plugins/baremetal/sdcctoolchain.h +++ b/src/plugins/baremetal/sdcctoolchain.h @@ -119,10 +119,6 @@ public: ProjectExplorer::ToolChain *restore(const QVariantMap &data) final; private: - // File path + version. - using Candidate = QPair; - using Candidates = QVector; - QList autoDetectToolchains(const Candidates &candidates, const QList &alreadyKnown) const; QList autoDetectToolchain( diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index a352e685086..c551f2829da 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -211,6 +211,19 @@ public: protected: void setDisplayName(const QString &name) { m_displayName = name; } + class Candidate { + public: + Utils::FileName compilerPath; + QString compilerVersion; + + bool operator==(const ToolChainFactory::Candidate &other) const { + return compilerPath == other.compilerPath + && compilerVersion == other.compilerVersion; + } + }; + + using Candidates = QVector; + private: QString m_displayName; };