ProjectExplorer: Move path collection in gcc autodetection one level up

Closer to doing it just once.

Change-Id: I8d9c7d8c4d3b7bd3afb57eb612eaae9bc4f7b616
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-09-26 11:50:39 +02:00
parent 0a1439f8d7
commit fa58a55b4f
2 changed files with 19 additions and 25 deletions

View File

@@ -1247,6 +1247,11 @@ GccToolChainFactory::GccToolChainFactory(GccToolChain::SubType subType)
setUserCreatable(true); setUserCreatable(true);
} }
// FIXME: Re-order later.
static FilePaths findCompilerCandidates(const ToolchainDetector &detector,
const QString &compilerName,
bool detectVariants);
Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) const Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) const
{ {
Toolchains result; Toolchains result;
@@ -1257,14 +1262,14 @@ Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) co
// Linux ICC // Linux ICC
result += autoDetectToolchains("icpc", result += autoDetectToolchains(findCompilerCandidates(detector, "icpc", false),
DetectVariants::No,
Constants::CXX_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID,
Constants::LINUXICC_TOOLCHAIN_TYPEID, Constants::LINUXICC_TOOLCHAIN_TYPEID,
detector, detector,
&constructLinuxIccToolchain); &constructLinuxIccToolchain);
result += autoDetectToolchains("icc",
DetectVariants::Yes,
result += autoDetectToolchains(findCompilerCandidates(detector, "icc", true),
Constants::C_LANGUAGE_ID, Constants::C_LANGUAGE_ID,
Constants::LINUXICC_TOOLCHAIN_TYPEID, Constants::LINUXICC_TOOLCHAIN_TYPEID,
detector, detector,
@@ -1275,15 +1280,14 @@ Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) co
static const auto tcChecker = [](const ToolChain *tc) { static const auto tcChecker = [](const ToolChain *tc) {
return tc->targetAbi().osFlavor() == Abi::WindowsMSysFlavor; return tc->targetAbi().osFlavor() == Abi::WindowsMSysFlavor;
}; };
result += autoDetectToolchains("g++",
DetectVariants::Yes, result += autoDetectToolchains(findCompilerCandidates(detector, "g++", true),
Constants::CXX_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, Constants::MINGW_TOOLCHAIN_TYPEID,
detector, detector,
&constructMinGWToolchain, &constructMinGWToolchain,
tcChecker); tcChecker);
result += autoDetectToolchains("gcc", result += autoDetectToolchains(findCompilerCandidates(detector, "gcc", true),
DetectVariants::Yes,
Constants::C_LANGUAGE_ID, Constants::C_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, Constants::MINGW_TOOLCHAIN_TYPEID,
detector, detector,
@@ -1295,14 +1299,12 @@ Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) co
Toolchains tcs; Toolchains tcs;
Toolchains known = detector.alreadyKnown; Toolchains known = detector.alreadyKnown;
tcs.append(autoDetectToolchains("clang++", tcs.append(autoDetectToolchains(findCompilerCandidates(detector, "clang++", true),
DetectVariants::Yes,
Constants::CXX_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, Constants::CLANG_TOOLCHAIN_TYPEID,
detector, detector,
&constructClangToolchain)); &constructClangToolchain));
tcs.append(autoDetectToolchains("clang", tcs.append(autoDetectToolchains(findCompilerCandidates(detector, "clang", true),
DetectVariants::Yes,
Constants::C_LANGUAGE_ID, Constants::C_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, Constants::CLANG_TOOLCHAIN_TYPEID,
detector, detector,
@@ -1313,8 +1315,7 @@ Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) co
if (!compilerPath.isEmpty()) { if (!compilerPath.isEmpty()) {
const FilePath clang = compilerPath.parentDir().pathAppended("clang").withExecutableSuffix(); const FilePath clang = compilerPath.parentDir().pathAppended("clang").withExecutableSuffix();
tcs.append( tcs.append(
autoDetectToolchains(clang.toString(), autoDetectToolchains(findCompilerCandidates(detector, clang.toString(), false),
DetectVariants::No,
Constants::C_LANGUAGE_ID, Constants::C_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, Constants::CLANG_TOOLCHAIN_TYPEID,
ToolchainDetector(known, detector.device, detector.searchPaths), ToolchainDetector(known, detector.device, detector.searchPaths),
@@ -1333,15 +1334,13 @@ Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) co
&& tc->compilerCommand().fileName() != "c89-gcc" && tc->compilerCommand().fileName() != "c89-gcc"
&& tc->compilerCommand().fileName() != "c99-gcc"; && tc->compilerCommand().fileName() != "c99-gcc";
}; };
result += autoDetectToolchains("g++", result += autoDetectToolchains(findCompilerCandidates(detector, "g++", true),
DetectVariants::Yes,
Constants::CXX_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID,
Constants::GCC_TOOLCHAIN_TYPEID, Constants::GCC_TOOLCHAIN_TYPEID,
detector, detector,
&constructRealGccToolchain, &constructRealGccToolchain,
tcChecker); tcChecker);
result += autoDetectToolchains("gcc", result += autoDetectToolchains(findCompilerCandidates(detector, "gcc", true),
DetectVariants::Yes,
Constants::C_LANGUAGE_ID, Constants::C_LANGUAGE_ID,
Constants::GCC_TOOLCHAIN_TYPEID, Constants::GCC_TOOLCHAIN_TYPEID,
detector, detector,
@@ -1488,16 +1487,13 @@ static FilePaths findCompilerCandidates(const ToolchainDetector &detector,
return compilerPaths; return compilerPaths;
} }
Toolchains GccToolChainFactory::autoDetectToolchains(const QString &compilerName, Toolchains GccToolChainFactory::autoDetectToolchains(const FilePaths &compilerPaths,
DetectVariants detectVariants,
const Id language, const Id language,
const Id requiredTypeId, const Id requiredTypeId,
const ToolchainDetector &detector, const ToolchainDetector &detector,
const ToolChainConstructor &constructor, const ToolChainConstructor &constructor,
const ToolchainChecker &checker) const ToolchainChecker &checker)
{ {
const FilePaths compilerPaths =
findCompilerCandidates(detector, compilerName, detectVariants == DetectVariants::Yes);
Toolchains existingCandidates = filtered(detector.alreadyKnown, Toolchains existingCandidates = filtered(detector.alreadyKnown,
[language](const ToolChain *tc) { return tc->language() == language; }); [language](const ToolChain *tc) { return tc->language() == language; });
Toolchains result; Toolchains result;

View File

@@ -192,10 +192,8 @@ public:
Toolchains detectForImport(const ToolChainDescription &tcd) const final; Toolchains detectForImport(const ToolChainDescription &tcd) const final;
private: private:
enum class DetectVariants { Yes, No };
using ToolchainChecker = std::function<bool(const ToolChain *)>; using ToolchainChecker = std::function<bool(const ToolChain *)>;
static Toolchains autoDetectToolchains(const QString &compilerName, static Toolchains autoDetectToolchains(const Utils::FilePaths &compilerPaths,
DetectVariants detectVariants,
const Utils::Id language, const Utils::Id language,
const Utils::Id requiredTypeId, const Utils::Id requiredTypeId,
const ToolchainDetector &detector, const ToolchainDetector &detector,