From fe695bd2ba83417eeadd73ed2af248e77331e25b Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 7 Feb 2017 14:18:32 +0100 Subject: [PATCH] ToolChains: Implement detection of toolchains based on compiler path Do not bother to implement this functionality for toolchains that are assumed to be completely auto-detected (e.g. MSVC) or require infrastructure around the toolchains to be useful (e.g. embedded platforms). Change-Id: I3e7dfe2f3c30a0d2d2bb16364895151f95b16423 Reviewed-by: Tim Jenssen --- .../nim/project/nimtoolchainfactory.cpp | 11 ++++++ src/plugins/nim/project/nimtoolchainfactory.h | 1 + src/plugins/projectexplorer/gcctoolchain.cpp | 37 +++++++++++++++++++ .../projectexplorer/gcctoolchainfactories.h | 4 ++ 4 files changed, 53 insertions(+) diff --git a/src/plugins/nim/project/nimtoolchainfactory.cpp b/src/plugins/nim/project/nimtoolchainfactory.cpp index c2352abecc2..3978bf0e6ee 100644 --- a/src/plugins/nim/project/nimtoolchainfactory.cpp +++ b/src/plugins/nim/project/nimtoolchainfactory.cpp @@ -101,6 +101,17 @@ QList NimToolChainFactory::autoDetect(const QList &alr return result; } +QList NimToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) +{ + QList result; + if (language == Constants::C_NIMLANGUAGE_ID) { + auto tc = new NimToolChain(ToolChain::ManualDetection); + tc->setCompilerCommand(compilerPath); + result.append(tc); + } + return result; +} + NimToolChainConfigWidget::NimToolChainConfigWidget(NimToolChain *tc) : ToolChainConfigWidget(tc) , m_compilerCommand(new PathChooser) diff --git a/src/plugins/nim/project/nimtoolchainfactory.h b/src/plugins/nim/project/nimtoolchainfactory.h index 9c0d8fbc13f..4ba0a028ad8 100644 --- a/src/plugins/nim/project/nimtoolchainfactory.h +++ b/src/plugins/nim/project/nimtoolchainfactory.h @@ -47,6 +47,7 @@ public: ProjectExplorer::ToolChain *restore(const QVariantMap &data) final; QSet supportedLanguages() const final; QList autoDetect(const QList &alreadyKnown) final; + QList autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final; }; class NimToolChainConfigWidget : public ProjectExplorer::ToolChainConfigWidget diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index a3aa2d4eea3..fa79ae5ce1c 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -798,6 +798,15 @@ QList GccToolChainFactory::autoDetect(const QList &alr return tcs; } +QList GccToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) +{ + const QString fileName = compilerPath.fileName(); + if ((language == Constants::C_LANGUAGE_ID && fileName.startsWith("gcc")) + || (language == Constants::CXX_LANGUAGE_ID && fileName.startsWith("g++"))) + return autoDetectToolChain(compilerPath, language); + return QList(); +} + // Used by the ToolChainManager to restore user-generated tool chains bool GccToolChainFactory::canRestore(const QVariantMap &data) { @@ -1170,6 +1179,15 @@ QList ClangToolChainFactory::autoDetect(const QList &a return result; } +QList ClangToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) +{ + const QString fileName = compilerPath.fileName(); + if ((language == Constants::C_LANGUAGE_ID && fileName.startsWith("clang") && !fileName.startsWith("clang++")) + || (language == Constants::CXX_LANGUAGE_ID && fileName.startsWith("clang++"))) + return autoDetectToolChain(compilerPath, language); + return QList(); +} + bool ClangToolChainFactory::canRestore(const QVariantMap &data) { return typeIdFromMap(data) == Constants::CLANG_TOOLCHAIN_TYPEID; @@ -1255,6 +1273,17 @@ QList MingwToolChainFactory::autoDetect(const QList &a return result; } +QList MingwToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) +{ + Abi ha = Abi::hostAbi(); + ha = Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth()); + const QString fileName = compilerPath.fileName(); + if ((language == Constants::C_LANGUAGE_ID && fileName.startsWith("gcc")) + || (language == Constants::CXX_LANGUAGE_ID && fileName.startsWith("g++"))) + return autoDetectToolChain(compilerPath, language, ha); + return QList(); +} + bool MingwToolChainFactory::canRestore(const QVariantMap &data) { return typeIdFromMap(data) == Constants::MINGW_TOOLCHAIN_TYPEID; @@ -1336,6 +1365,14 @@ QList LinuxIccToolChainFactory::autoDetect(const QList Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown); } +QList LinuxIccToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) +{ + const QString fileName = compilerPath.fileName(); + if (language == Constants::CXX_LANGUAGE_ID && fileName.startsWith("icpc")) + return autoDetectToolChain(compilerPath, language); + return QList(); +} + bool LinuxIccToolChainFactory::canRestore(const QVariantMap &data) { return typeIdFromMap(data) == Constants::LINUXICC_TOOLCHAIN_TYPEID; diff --git a/src/plugins/projectexplorer/gcctoolchainfactories.h b/src/plugins/projectexplorer/gcctoolchainfactories.h index 2ed74b3039d..4417fc712fd 100644 --- a/src/plugins/projectexplorer/gcctoolchainfactories.h +++ b/src/plugins/projectexplorer/gcctoolchainfactories.h @@ -52,6 +52,7 @@ public: QSet supportedLanguages() const override; QList autoDetect(const QList &alreadyKnown) override; + QList autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) override; bool canCreate() override; ToolChain *create(Core::Id language) override; @@ -114,6 +115,7 @@ public: QSet supportedLanguages() const override; QList autoDetect(const QList &alreadyKnown) override; + QList autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final; bool canRestore(const QVariantMap &data) override; @@ -134,6 +136,7 @@ public: QSet supportedLanguages() const override; QList autoDetect(const QList &alreadyKnown) override; + QList autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final; bool canRestore(const QVariantMap &data) override; @@ -154,6 +157,7 @@ public: QSet supportedLanguages() const override; QList autoDetect(const QList &alreadyKnown) override; + QList autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final; bool canRestore(const QVariantMap &data) override;