diff options
author | hjk <hjk@qt.io> | 2022-01-24 15:14:09 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2022-02-03 10:16:06 +0000 |
commit | 9b7f580a1434795a40cccc0f3b9bb13befab7ee5 (patch) | |
tree | f647b1f385ad7a0c6c196e1888e4b130df99a2f0 | |
parent | bd095d1ebef3fa4992c066ef82f1e18b9b5cb5ab (diff) |
WebAssembly: Move auto-detection into stand-alone function
Change-Id: I641946e62998371e6e45b6c6d75e069b8729eaa6
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
-rw-r--r-- | src/plugins/webassembly/webassemblytoolchain.cpp | 80 | ||||
-rw-r--r-- | src/plugins/webassembly/webassemblytoolchain.h | 7 |
2 files changed, 43 insertions, 44 deletions
diff --git a/src/plugins/webassembly/webassemblytoolchain.cpp b/src/plugins/webassembly/webassemblytoolchain.cpp index 780e48e165..bebf2866fb 100644 --- a/src/plugins/webassembly/webassemblytoolchain.cpp +++ b/src/plugins/webassembly/webassemblytoolchain.cpp @@ -111,6 +111,43 @@ const QVersionNumber &WebAssemblyToolChain::minimumSupportedEmSdkVersion() return number; } +static Toolchains doAutoDetect(const ToolchainDetector &detector) +{ + const FilePath sdk = WebAssemblyEmSdk::registeredEmSdk(); + if (!WebAssemblyEmSdk::isValid(sdk)) + return {}; + + if (detector.device) { + // Only detect toolchains from the emsdk installation device + const FilePath deviceRoot = detector.device->mapToGlobalPath({}); + if (deviceRoot.host() != sdk.host()) + return {}; + } + + Environment env = sdk.deviceEnvironment(); + WebAssemblyEmSdk::addToEnvironment(sdk, env); + + Toolchains result; + for (auto languageId : {ProjectExplorer::Constants::C_LANGUAGE_ID, + ProjectExplorer::Constants::CXX_LANGUAGE_ID}) { + auto toolChain = new WebAssemblyToolChain; + toolChain->setLanguage(languageId); + toolChain->setDetection(ToolChain::AutoDetection); + const bool cLanguage = languageId == ProjectExplorer::Constants::C_LANGUAGE_ID; + const QString script = QLatin1String(cLanguage ? "emcc" : "em++") + + QLatin1String(sdk.osType() == OsTypeWindows ? ".bat" : ""); + const FilePath scriptFile = sdk.withNewPath(script).searchInDirectories(env.path()); + toolChain->setCompilerCommand(scriptFile); + + const QString displayName = WebAssemblyToolChain::tr("Emscripten Compiler %1 for %2") + .arg(toolChain->version(), QLatin1String(cLanguage ? "C" : "C++")); + toolChain->setDisplayName(displayName); + result.append(toolChain); + } + + return result; +} + void WebAssemblyToolChain::registerToolChains() { // Remove old toolchains @@ -121,12 +158,9 @@ void WebAssemblyToolChain::registerToolChains() }; // Create new toolchains and register them - ToolChainFactory *factory = - findOrDefault(ToolChainFactory::allToolChainFactories(), [](ToolChainFactory *f){ - return f->supportedToolChainType() == Constants::WEBASSEMBLY_TOOLCHAIN_TYPEID; - }); - QTC_ASSERT(factory, return); - for (auto toolChain : factory->autoDetect(ToolchainDetector({}, {}))) + ToolchainDetector detector({}, {}); + const Toolchains toolchains = doAutoDetect(detector); + for (auto toolChain : toolchains) ToolChainManager::registerToolChain(toolChain); // Let kits pick up the new toolchains @@ -157,39 +191,7 @@ WebAssemblyToolChainFactory::WebAssemblyToolChainFactory() Toolchains WebAssemblyToolChainFactory::autoDetect(const ToolchainDetector &detector) const { - const FilePath sdk = WebAssemblyEmSdk::registeredEmSdk(); - if (!WebAssemblyEmSdk::isValid(sdk)) - return {}; - - if (detector.device) { - // Only detect toolchains from the emsdk installation device - const FilePath deviceRoot = detector.device->mapToGlobalPath({}); - if (deviceRoot.host() != sdk.host()) - return {}; - } - - Environment env = sdk.deviceEnvironment(); - WebAssemblyEmSdk::addToEnvironment(sdk, env); - - Toolchains result; - for (auto languageId : {ProjectExplorer::Constants::C_LANGUAGE_ID, - ProjectExplorer::Constants::CXX_LANGUAGE_ID}) { - auto toolChain = new WebAssemblyToolChain; - toolChain->setLanguage(languageId); - toolChain->setDetection(ToolChain::AutoDetection); - const bool cLanguage = languageId == ProjectExplorer::Constants::C_LANGUAGE_ID; - const QString script = QLatin1String(cLanguage ? "emcc" : "em++") - + QLatin1String(sdk.osType() == OsTypeWindows ? ".bat" : ""); - const FilePath scriptFile = sdk.withNewPath(script).searchInDirectories(env.path()); - toolChain->setCompilerCommand(scriptFile); - - const QString displayName = WebAssemblyToolChain::tr("Emscripten Compiler %1 for %2") - .arg(toolChain->version(), QLatin1String(cLanguage ? "C" : "C++")); - toolChain->setDisplayName(displayName); - result.append(toolChain); - } - - return result; + return doAutoDetect(detector); } } // namespace Internal diff --git a/src/plugins/webassembly/webassemblytoolchain.h b/src/plugins/webassembly/webassemblytoolchain.h index 41eeb72e94..95291af7f4 100644 --- a/src/plugins/webassembly/webassemblytoolchain.h +++ b/src/plugins/webassembly/webassemblytoolchain.h @@ -37,6 +37,8 @@ class WebAssemblyToolChain final : public ProjectExplorer::GccToolChain Q_DECLARE_TR_FUNCTIONS(WebAssembly::Internal::WebAssemblyToolChain) public: + WebAssemblyToolChain(); + void addToEnvironment(Utils::Environment &env) const override; Utils::FilePath makeCommand(const Utils::Environment &environment) const override; @@ -45,11 +47,6 @@ public: static const QVersionNumber &minimumSupportedEmSdkVersion(); static void registerToolChains(); static bool areToolChainsRegistered(); - -private: - WebAssemblyToolChain(); - - friend class WebAssemblyToolChainFactory; }; class WebAssemblyToolChainFactory : public ProjectExplorer::ToolChainFactory |