diff --git a/src/plugins/webassembly/webassemblytoolchain.cpp b/src/plugins/webassembly/webassemblytoolchain.cpp index 780e48e165f..bebf2866fb9 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 41eeb72e94b..95291af7f41 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