ProjectExplorer: Provide more flexibility in compiler paths

Let autoDetectToolchains accept compiler path instead of
always searching for it in environment. Make environment
search into a separate call.

Change-Id: Ie692b38bac03955a8f1cb3590beb7a2e9640a448
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-08-06 12:28:08 +02:00
parent c24116f035
commit 5d67a471e0
2 changed files with 37 additions and 22 deletions

View File

@@ -942,7 +942,8 @@ void GccToolChainFactory::versionProbe(const QString &name, Core::Id language, C
continue; continue;
const bool isNative = fileName.startsWith(name); const bool isNative = fileName.startsWith(name);
const Abi abi = isNative ? Abi::hostAbi() : Abi(); const Abi abi = isNative ? Abi::hostAbi() : Abi();
tcs.append(autoDetectToolchains(entry, abi, language, type, known)); tcs.append(autoDetectToolchains(compilerPathFromEnvironment(entry), abi, language, type,
known));
known.append(tcs); known.append(tcs);
} }
} }
@@ -952,10 +953,12 @@ QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alr
{ {
QList<ToolChain *> tcs; QList<ToolChain *> tcs;
QList<ToolChain *> known = alreadyKnown; QList<ToolChain *> known = alreadyKnown;
tcs.append(autoDetectToolchains("g++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, tcs.append(autoDetectToolchains(compilerPathFromEnvironment("g++"), Abi::hostAbi(),
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID,
tcs.append(autoDetectToolchains("gcc", Abi::hostAbi(), Constants::C_LANGUAGE_ID, alreadyKnown));
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); tcs.append(autoDetectToolchains(compilerPathFromEnvironment("gcc"), Abi::hostAbi(),
Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID,
alreadyKnown));
known.append(tcs); known.append(tcs);
versionProbe("g++", Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known); versionProbe("g++", Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known);
versionProbe("gcc", Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known, versionProbe("gcc", Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known,
@@ -996,7 +999,13 @@ GccToolChain *GccToolChainFactory::createToolChain(bool autoDetect)
return new GccToolChain(autoDetect ? ToolChain::AutoDetection : ToolChain::ManualDetection); return new GccToolChain(autoDetect ? ToolChain::AutoDetection : ToolChain::ManualDetection);
} }
QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &compiler, Utils::FileName GccToolChainFactory::compilerPathFromEnvironment(const QString &compilerName)
{
Environment systemEnvironment = Environment::systemEnvironment();
return systemEnvironment.searchInPath(compilerName);
}
QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const FileName &compilerPath,
const Abi &requiredAbi, const Abi &requiredAbi,
Core::Id language, Core::Id language,
const Core::Id requiredTypeId, const Core::Id requiredTypeId,
@@ -1004,11 +1013,8 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &comp
{ {
QList<ToolChain *> result; QList<ToolChain *> result;
Environment systemEnvironment = Environment::systemEnvironment();
const FileName compilerPath = systemEnvironment.searchInPath(compiler);
if (compilerPath.isEmpty()) if (compilerPath.isEmpty())
return result; return result;
const FileName canonicalPath = FileUtils::canonicalPath(compilerPath);
result = Utils::filtered(alreadyKnown, [requiredTypeId, compilerPath](ToolChain *tc) { result = Utils::filtered(alreadyKnown, [requiredTypeId, compilerPath](ToolChain *tc) {
return tc->typeId() == requiredTypeId && tc->compilerCommand() == compilerPath; return tc->typeId() == requiredTypeId && tc->compilerCommand() == compilerPath;
@@ -1338,10 +1344,13 @@ QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &a
{ {
QList<ToolChain *> tcs; QList<ToolChain *> tcs;
QList<ToolChain *> known = alreadyKnown; QList<ToolChain *> known = alreadyKnown;
tcs.append(autoDetectToolchains("clang++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown)); tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang++"), Abi::hostAbi(),
tcs.append(autoDetectToolchains("clang", Abi::hostAbi(), Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID,
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown)); alreadyKnown));
tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang"), Abi::hostAbi(),
Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID,
alreadyKnown));
known.append(tcs); known.append(tcs);
versionProbe("clang++", Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known); versionProbe("clang++", Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known);
versionProbe("clang", Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known); versionProbe("clang", Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known);
@@ -1435,10 +1444,12 @@ QList<ToolChain *> MingwToolChainFactory::autoDetect(const QList<ToolChain *> &a
{ {
Abi ha = Abi::hostAbi(); Abi ha = Abi::hostAbi();
ha = Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth()); ha = Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth());
QList<ToolChain *> result = autoDetectToolchains("g++", ha, Constants::CXX_LANGUAGE_ID, QList<ToolChain *> result = autoDetectToolchains(
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); compilerPathFromEnvironment("g++"), ha, Constants::CXX_LANGUAGE_ID,
result += autoDetectToolchains("gcc", ha, Constants::C_LANGUAGE_ID, Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown);
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); result += autoDetectToolchains(
compilerPathFromEnvironment("gcc"), ha, Constants::C_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown);
return result; return result;
} }
@@ -1532,8 +1543,9 @@ QSet<Core::Id> LinuxIccToolChainFactory::supportedLanguages() const
QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
{ {
return autoDetectToolchains("icpc", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, return autoDetectToolchains(compilerPathFromEnvironment("icpc"), Abi::hostAbi(),
Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown); Constants::CXX_LANGUAGE_ID, Constants::LINUXICC_TOOLCHAIN_TYPEID,
alreadyKnown);
} }
QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language)

View File

@@ -69,9 +69,12 @@ protected:
QList<ToolChain *> &tcs, QList<ToolChain *> &tcs,
QList<ToolChain *> &known, QList<ToolChain *> &known,
const QSet<QString> &filteredNames = {}); const QSet<QString> &filteredNames = {});
QList<ToolChain *> autoDetectToolchains(const QString &compiler, const Abi &requiredAbi,
Core::Id language, const Core::Id requiredTypeId, Utils::FileName compilerPathFromEnvironment(const QString &compilerName);
const QList<ToolChain *> &alreadyKnown);
QList<ToolChain *> autoDetectToolchains(
const Utils::FileName &compilerPath, const Abi &requiredAbi, Core::Id language,
const Core::Id requiredTypeId, const QList<ToolChain *> &alreadyKnown);
QList<ToolChain *> autoDetectToolChain(const Utils::FileName &compilerPath, const Core::Id language, QList<ToolChain *> autoDetectToolChain(const Utils::FileName &compilerPath, const Core::Id language,
const Abi &requiredAbi = Abi()); const Abi &requiredAbi = Abi());
}; };