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;
const bool isNative = fileName.startsWith(name);
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);
}
}
@@ -952,10 +953,12 @@ QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alr
{
QList<ToolChain *> tcs;
QList<ToolChain *> known = alreadyKnown;
tcs.append(autoDetectToolchains("g++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID,
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown));
tcs.append(autoDetectToolchains("gcc", Abi::hostAbi(), Constants::C_LANGUAGE_ID,
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown));
tcs.append(autoDetectToolchains(compilerPathFromEnvironment("g++"), Abi::hostAbi(),
Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID,
alreadyKnown));
tcs.append(autoDetectToolchains(compilerPathFromEnvironment("gcc"), Abi::hostAbi(),
Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID,
alreadyKnown));
known.append(tcs);
versionProbe("g++", Constants::CXX_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);
}
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,
Core::Id language,
const Core::Id requiredTypeId,
@@ -1004,11 +1013,8 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &comp
{
QList<ToolChain *> result;
Environment systemEnvironment = Environment::systemEnvironment();
const FileName compilerPath = systemEnvironment.searchInPath(compiler);
if (compilerPath.isEmpty())
return result;
const FileName canonicalPath = FileUtils::canonicalPath(compilerPath);
result = Utils::filtered(alreadyKnown, [requiredTypeId, compilerPath](ToolChain *tc) {
return tc->typeId() == requiredTypeId && tc->compilerCommand() == compilerPath;
@@ -1338,10 +1344,13 @@ QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &a
{
QList<ToolChain *> tcs;
QList<ToolChain *> known = alreadyKnown;
tcs.append(autoDetectToolchains("clang++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown));
tcs.append(autoDetectToolchains("clang", Abi::hostAbi(), Constants::C_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown));
tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang++"), Abi::hostAbi(),
Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID,
alreadyKnown));
tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang"), Abi::hostAbi(),
Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID,
alreadyKnown));
known.append(tcs);
versionProbe("clang++", Constants::CXX_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();
ha = Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth());
QList<ToolChain *> result = autoDetectToolchains("g++", ha, Constants::CXX_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown);
result += autoDetectToolchains("gcc", ha, Constants::C_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown);
QList<ToolChain *> result = autoDetectToolchains(
compilerPathFromEnvironment("g++"), ha, Constants::CXX_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown);
result += autoDetectToolchains(
compilerPathFromEnvironment("gcc"), ha, Constants::C_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown);
return result;
}
@@ -1532,8 +1543,9 @@ QSet<Core::Id> LinuxIccToolChainFactory::supportedLanguages() const
QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
{
return autoDetectToolchains("icpc", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID,
Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown);
return autoDetectToolchains(compilerPathFromEnvironment("icpc"), Abi::hostAbi(),
Constants::CXX_LANGUAGE_ID, Constants::LINUXICC_TOOLCHAIN_TYPEID,
alreadyKnown);
}
QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language)

View File

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