From 726cc7f5cd52c298bf517e9e201215fe1bf61d6b Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 15 Sep 2023 11:54:47 +0200 Subject: [PATCH] PE: Make GccToolChainFactory::autoDetectToolchains static In preparation of running it in another thread. Change-Id: I2cbac1bd45885416f8ee0dfdc95a4998e87d2f8e Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/gcctoolchain.cpp | 109 +++++++++++++------ src/plugins/projectexplorer/gcctoolchain.h | 17 +-- src/plugins/projectexplorer/toolchain.cpp | 7 +- src/plugins/projectexplorer/toolchain.h | 8 +- 4 files changed, 95 insertions(+), 46 deletions(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 2628b506d21..6794234e820 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -1184,10 +1184,20 @@ Toolchains GccToolChainFactory::autoDetect(const ToolchainDetector &detector) co && tc->compilerCommand().fileName() != "c89-gcc" && tc->compilerCommand().fileName() != "c99-gcc"; }; - tcs.append(autoDetectToolchains("g++", DetectVariants::Yes, Constants::CXX_LANGUAGE_ID, - Constants::GCC_TOOLCHAIN_TYPEID, detector, tcChecker)); - tcs.append(autoDetectToolchains("gcc", DetectVariants::Yes, Constants::C_LANGUAGE_ID, - Constants::GCC_TOOLCHAIN_TYPEID, detector, tcChecker)); + tcs.append(autoDetectToolchains("g++", + DetectVariants::Yes, + Constants::CXX_LANGUAGE_ID, + Constants::GCC_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor(), + tcChecker)); + tcs.append(autoDetectToolchains("gcc", + DetectVariants::Yes, + Constants::C_LANGUAGE_ID, + Constants::GCC_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor(), + tcChecker)); return tcs; } @@ -1207,7 +1217,7 @@ Toolchains GccToolChainFactory::detectForImport(const ToolChainDescription &tcd) || (fileName == "c++" && !resolvedSymlinksFileName.contains("clang"))); if (isCCompiler || isCxxCompiler) { - return autoDetectToolChain(tcd, [](const ToolChain *tc) { + return autoDetectToolChain(tcd, toolchainConstructor(), [](const ToolChain *tc) { return tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor; }); } @@ -1282,13 +1292,13 @@ static FilePaths findCompilerCandidates(const ToolchainDetector &detector, return compilerPaths; } -Toolchains GccToolChainFactory::autoDetectToolchains( - const QString &compilerName, - DetectVariants detectVariants, - const Id language, - const Id requiredTypeId, - const ToolchainDetector &detector, - const ToolchainChecker &checker) const +Toolchains GccToolChainFactory::autoDetectToolchains(const QString &compilerName, + DetectVariants detectVariants, + const Id language, + const Id requiredTypeId, + const ToolchainDetector &detector, + const ToolChainConstructor &constructor, + const ToolchainChecker &checker) { const FilePaths compilerPaths = findCompilerCandidates(detector, compilerName, detectVariants == DetectVariants::Yes); @@ -1331,7 +1341,7 @@ Toolchains GccToolChainFactory::autoDetectToolchains( } if (!alreadyExists) { const QList newToolchains - = autoDetectToolChain({compilerPath, language}, checker); + = autoDetectToolChain({compilerPath, language}, constructor, checker); result << newToolchains; existingCandidates << newToolchains; } @@ -1341,7 +1351,8 @@ Toolchains GccToolChainFactory::autoDetectToolchains( } Toolchains GccToolChainFactory::autoDetectToolChain(const ToolChainDescription &tcd, - const ToolchainChecker &checker) const + const ToolChainConstructor &constructor, + const ToolchainChecker &checker) { Toolchains result; @@ -1361,7 +1372,7 @@ Toolchains GccToolChainFactory::autoDetectToolChain(const ToolChainDescription & systemEnvironment, macros); for (const Abi &abi : detectedAbis.supportedAbis) { - std::unique_ptr tc(dynamic_cast(create())); + std::unique_ptr tc(dynamic_cast(constructor())); if (!tc) return result; @@ -1704,18 +1715,30 @@ Toolchains ClangToolChainFactory::autoDetect(const ToolchainDetector &detector) Toolchains tcs; Toolchains known = detector.alreadyKnown; - tcs.append(autoDetectToolchains("clang++", DetectVariants::Yes, Constants::CXX_LANGUAGE_ID, - Constants::CLANG_TOOLCHAIN_TYPEID, detector)); - tcs.append(autoDetectToolchains("clang", DetectVariants::Yes, Constants::C_LANGUAGE_ID, - Constants::CLANG_TOOLCHAIN_TYPEID, detector)); + tcs.append(autoDetectToolchains("clang++", + DetectVariants::Yes, + Constants::CXX_LANGUAGE_ID, + Constants::CLANG_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor())); + tcs.append(autoDetectToolchains("clang", + DetectVariants::Yes, + Constants::C_LANGUAGE_ID, + Constants::CLANG_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor())); known.append(tcs); const FilePath compilerPath = Core::ICore::clangExecutable(CLANG_BINDIR); if (!compilerPath.isEmpty()) { const FilePath clang = compilerPath.parentDir().pathAppended("clang").withExecutableSuffix(); - tcs.append(autoDetectToolchains(clang.toString(), DetectVariants::No, - Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, - ToolchainDetector(known, detector.device, detector.searchPaths))); + tcs.append( + autoDetectToolchains(clang.toString(), + DetectVariants::No, + Constants::C_LANGUAGE_ID, + Constants::CLANG_TOOLCHAIN_TYPEID, + ToolchainDetector(known, detector.device, detector.searchPaths), + toolchainConstructor())); } return tcs; @@ -1735,7 +1758,7 @@ Toolchains ClangToolChainFactory::detectForImport(const ToolChainDescription &tc || (fileName == "c++" && resolvedSymlinksFileName.contains("clang"))); if (isCCompiler || isCxxCompiler) { - return autoDetectToolChain(tcd); + return autoDetectToolChain(tcd, toolchainConstructor()); } return {}; } @@ -1901,11 +1924,20 @@ Toolchains MingwToolChainFactory::autoDetect(const ToolchainDetector &detector) static const auto tcChecker = [](const ToolChain *tc) { return tc->targetAbi().osFlavor() == Abi::WindowsMSysFlavor; }; - Toolchains result = autoDetectToolchains( - "g++", DetectVariants::Yes, Constants::CXX_LANGUAGE_ID, - Constants::MINGW_TOOLCHAIN_TYPEID, detector, tcChecker); - result += autoDetectToolchains("gcc", DetectVariants::Yes, Constants::C_LANGUAGE_ID, - Constants::MINGW_TOOLCHAIN_TYPEID, detector, tcChecker); + Toolchains result = autoDetectToolchains("g++", + DetectVariants::Yes, + Constants::CXX_LANGUAGE_ID, + Constants::MINGW_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor(), + tcChecker); + result += autoDetectToolchains("gcc", + DetectVariants::Yes, + Constants::C_LANGUAGE_ID, + Constants::MINGW_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor(), + tcChecker); return result; } @@ -1922,7 +1954,7 @@ Toolchains MingwToolChainFactory::detectForImport(const ToolChainDescription &tc || (fileName.startsWith("c++") || fileName.endsWith("c++"))); if (cCompiler || cxxCompiler) { - return autoDetectToolChain(tcd, [](const ToolChain *tc) { + return autoDetectToolChain(tcd, toolchainConstructor(), [](const ToolChain *tc) { return tc->targetAbi().osFlavor() == Abi::WindowsMSysFlavor; }); } @@ -1986,11 +2018,18 @@ LinuxIccToolChainFactory::LinuxIccToolChainFactory() Toolchains LinuxIccToolChainFactory::autoDetect(const ToolchainDetector &detector) const { - Toolchains result - = autoDetectToolchains("icpc", DetectVariants::No, Constants::CXX_LANGUAGE_ID, - Constants::LINUXICC_TOOLCHAIN_TYPEID, detector); - result += autoDetectToolchains("icc", DetectVariants::Yes, Constants::C_LANGUAGE_ID, - Constants::LINUXICC_TOOLCHAIN_TYPEID, detector); + Toolchains result = autoDetectToolchains("icpc", + DetectVariants::No, + Constants::CXX_LANGUAGE_ID, + Constants::LINUXICC_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor()); + result += autoDetectToolchains("icc", + DetectVariants::Yes, + Constants::C_LANGUAGE_ID, + Constants::LINUXICC_TOOLCHAIN_TYPEID, + detector, + toolchainConstructor()); return result; } @@ -1999,7 +2038,7 @@ Toolchains LinuxIccToolChainFactory::detectForImport(const ToolChainDescription const QString fileName = tcd.compilerPath.completeBaseName(); if ((tcd.language == Constants::CXX_LANGUAGE_ID && fileName.startsWith("icpc")) || (tcd.language == Constants::C_LANGUAGE_ID && fileName.startsWith("icc"))) { - return autoDetectToolChain(tcd); + return autoDetectToolChain(tcd, toolchainConstructor()); } return {}; } diff --git a/src/plugins/projectexplorer/gcctoolchain.h b/src/plugins/projectexplorer/gcctoolchain.h index beb736be4d0..554ccc78fd5 100644 --- a/src/plugins/projectexplorer/gcctoolchain.h +++ b/src/plugins/projectexplorer/gcctoolchain.h @@ -263,13 +263,16 @@ public: protected: enum class DetectVariants { Yes, No }; using ToolchainChecker = std::function; - Toolchains autoDetectToolchains( - const QString &compilerName, DetectVariants detectVariants, const Utils::Id language, - const Utils::Id requiredTypeId, const ToolchainDetector &detector, - const ToolchainChecker &checker = {}) const; - Toolchains autoDetectToolChain( - const ToolChainDescription &tcd, - const ToolchainChecker &checker = {}) const; + static Toolchains autoDetectToolchains(const QString &compilerName, + DetectVariants detectVariants, + const Utils::Id language, + const Utils::Id requiredTypeId, + const ToolchainDetector &detector, + const ToolChainConstructor &constructor, + const ToolchainChecker &checker = {}); + static Toolchains autoDetectToolChain(const ToolChainDescription &tcd, + const ToolChainConstructor &constructor, + const ToolchainChecker &checker = {}); }; class ClangToolChainFactory : public GccToolChainFactory diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 6bb6e1acf85..f4ceb06720d 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -672,11 +672,16 @@ void ToolChainFactory::setSupportsAllLanguages(bool supportsAllLanguages) } void ToolChainFactory::setToolchainConstructor - (const std::function &toolchainContructor) + (const ToolChainConstructor &toolchainContructor) { m_toolchainConstructor = toolchainContructor; } +ToolChainFactory::ToolChainConstructor ToolChainFactory::toolchainConstructor() const +{ + return m_toolchainConstructor; +} + void ToolChainFactory::setUserCreatable(bool userCreatable) { m_userCreatable = userCreatable; diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index a2251d866c0..d63f3476dfc 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -260,7 +260,7 @@ public: virtual Toolchains detectForImport(const ToolChainDescription &tcd) const; virtual bool canCreate() const; - virtual ToolChain *create() const; + ToolChain *create() const; ToolChain *restore(const Utils::Store &data); @@ -279,7 +279,9 @@ protected: void setSupportedToolChainType(const Utils::Id &supportedToolChainType); void setSupportedLanguages(const QList &supportedLanguages); void setSupportsAllLanguages(bool supportsAllLanguages); - void setToolchainConstructor(const std::function &constructor); + using ToolChainConstructor = std::function; + void setToolchainConstructor(const ToolChainConstructor &constructor); + ToolChainConstructor toolchainConstructor() const; class Candidate { public: @@ -300,7 +302,7 @@ private: QList m_supportedLanguages; bool m_supportsAllLanguages = false; bool m_userCreatable = false; - std::function m_toolchainConstructor; + ToolChainConstructor m_toolchainConstructor; }; } // namespace ProjectExplorer