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 <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2017-02-07 14:18:32 +01:00
parent 578af1e701
commit fe695bd2ba
4 changed files with 53 additions and 0 deletions

View File

@@ -101,6 +101,17 @@ QList<ToolChain *> NimToolChainFactory::autoDetect(const QList<ToolChain *> &alr
return result;
}
QList<ToolChain *> NimToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language)
{
QList<ToolChain *> 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)

View File

@@ -47,6 +47,7 @@ public:
ProjectExplorer::ToolChain *restore(const QVariantMap &data) final;
QSet<Core::Id> supportedLanguages() const final;
QList<ProjectExplorer::ToolChain *> autoDetect(const QList<ProjectExplorer::ToolChain *> &alreadyKnown) final;
QList<ProjectExplorer::ToolChain *> autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final;
};
class NimToolChainConfigWidget : public ProjectExplorer::ToolChainConfigWidget

View File

@@ -798,6 +798,15 @@ QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alr
return tcs;
}
QList<ToolChain *> 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<ToolChain *>();
}
// Used by the ToolChainManager to restore user-generated tool chains
bool GccToolChainFactory::canRestore(const QVariantMap &data)
{
@@ -1170,6 +1179,15 @@ QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &a
return result;
}
QList<ToolChain *> 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<ToolChain *>();
}
bool ClangToolChainFactory::canRestore(const QVariantMap &data)
{
return typeIdFromMap(data) == Constants::CLANG_TOOLCHAIN_TYPEID;
@@ -1255,6 +1273,17 @@ QList<ToolChain *> MingwToolChainFactory::autoDetect(const QList<ToolChain *> &a
return result;
}
QList<ToolChain *> 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<ToolChain *>();
}
bool MingwToolChainFactory::canRestore(const QVariantMap &data)
{
return typeIdFromMap(data) == Constants::MINGW_TOOLCHAIN_TYPEID;
@@ -1336,6 +1365,14 @@ QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const QList<ToolChain *>
Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown);
}
QList<ToolChain *> 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<ToolChain *>();
}
bool LinuxIccToolChainFactory::canRestore(const QVariantMap &data)
{
return typeIdFromMap(data) == Constants::LINUXICC_TOOLCHAIN_TYPEID;

View File

@@ -52,6 +52,7 @@ public:
QSet<Core::Id> supportedLanguages() const override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> 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<Core::Id> supportedLanguages() const override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final;
bool canRestore(const QVariantMap &data) override;
@@ -134,6 +136,7 @@ public:
QSet<Core::Id> supportedLanguages() const override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final;
bool canRestore(const QVariantMap &data) override;
@@ -154,6 +157,7 @@ public:
QSet<Core::Id> supportedLanguages() const override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const Utils::FileName &compilerPath, const Core::Id &language) final;
bool canRestore(const QVariantMap &data) override;