From 62f68a2f99f596ae7a940bdf2fe30271dcc6e7c2 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 23 Jul 2024 12:49:51 +0200 Subject: [PATCH] WebAssembly: Provide diagnostics for an unsuccessful emsdk detection Setting up a working emsdk requires a couple of steps: 1) Installation/clone of emsdk 2) Installation of an SDK 3) Activation of an SDK If the setup is incomplete, Qt Creator cannot use the emsdk. Until now, users got no explicit indication of an unsuccessful emsdk detection and no hint of what could be wrong. This change adds visual diagnostics of potentially missing emsdk setup steps. Fixes: QTCREATORBUG-30057 Change-Id: I2dc2d3388be75e8586dc18d24b0a5b57bcffaadb Reviewed-by: Marcus Tillmanns --- .../webassembly/webassemblyconstants.h | 2 + src/plugins/webassembly/webassemblyemsdk.cpp | 4 +- .../webassembly/webassemblysettings.cpp | 43 +++++++++++++++++++ src/plugins/webassembly/webassemblysettings.h | 4 ++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/plugins/webassembly/webassemblyconstants.h b/src/plugins/webassembly/webassemblyconstants.h index 56315b0b404..897508ef51f 100644 --- a/src/plugins/webassembly/webassemblyconstants.h +++ b/src/plugins/webassembly/webassemblyconstants.h @@ -14,5 +14,7 @@ const char WEBASSEMBLY_DEVICE_DEVICE_ID[] = "WebAssembly Device"; const char WEBASSEMBLY_QT_VERSION[] = "Qt4ProjectManager.QtVersion.WebAssembly"; const char WEBASSEMBLY_RUNCONFIGURATION_EMRUN[] = "WebAssembly.RunConfiguration.Emrun"; +const char WEBASSEMBLY_EMSDK_CONFIG_FILE[] = ".emscripten"; + } // namespace WebAssembly } // namespace Constants diff --git a/src/plugins/webassembly/webassemblyemsdk.cpp b/src/plugins/webassembly/webassemblyemsdk.cpp index 6541200eaa7..f2fa4fe72b4 100644 --- a/src/plugins/webassembly/webassemblyemsdk.cpp +++ b/src/plugins/webassembly/webassemblyemsdk.cpp @@ -3,6 +3,8 @@ #include "webassemblyemsdk.h" +#include "webassemblyconstants.h" + #include #include @@ -26,7 +28,7 @@ const char emSdkVersionKey[] = "WebAssembly/emSdkVersion1"; const FilePath timeStampFile(const FilePath &sdkRoot) { - return sdkRoot / ".emscripten"; + return sdkRoot / Constants::WEBASSEMBLY_EMSDK_CONFIG_FILE; } static QString emSdkEnvOutput(const FilePath &sdkRoot) diff --git a/src/plugins/webassembly/webassemblysettings.cpp b/src/plugins/webassembly/webassemblysettings.cpp index b33d41ba570..3e522d9d65d 100644 --- a/src/plugins/webassembly/webassemblysettings.cpp +++ b/src/plugins/webassembly/webassemblysettings.cpp @@ -73,6 +73,13 @@ WebAssemblySettings::WebAssemblySettings() instruction->setOpenExternalLinks(true); instruction->setWordWrap(true); + m_statusIsEmsdkDir = new InfoLabel(Tr::tr("The chosen directory is an emsdk location.")); + m_statusSdkInstalled = new InfoLabel(Tr::tr("An SDK is installed.")); + m_statusSdkActivated = new InfoLabel(Tr::tr("An SDK is activated.")); + m_statusSdkValid = new InfoLabel(Tr::tr("The activated SDK is usable by %1.") + .arg(QGuiApplication::applicationDisplayName()), + InfoLabel::NotOk); + m_emSdkVersionDisplay = new InfoLabel; m_emSdkVersionDisplay->setElideMode(Qt::ElideNone); m_emSdkVersionDisplay->setWordWrap(true); @@ -98,6 +105,10 @@ WebAssemblySettings::WebAssemblySettings() Column { instruction, emSdk, + m_statusIsEmsdkDir, + m_statusSdkInstalled, + m_statusSdkActivated, + m_statusSdkValid, m_emSdkVersionDisplay, }, }, @@ -122,6 +133,27 @@ WebAssemblySettings::WebAssemblySettings() readSettings(); } +enum EmsdkError { + EmsdkErrorUnknown, + EmsdkErrorNoDir, + EmsdkErrorNoEmsdkDir, + EmsdkErrorNoSdkInstalled, + EmsdkErrorNoSdkActivated, +}; + +static EmsdkError emsdkError(const Utils::FilePath &sdkRoot) +{ + if (!sdkRoot.exists()) + return EmsdkErrorNoDir; + if (!(sdkRoot / "emsdk").refersToExecutableFile(FilePath::WithBatSuffix)) + return EmsdkErrorNoEmsdkDir; + if (!(sdkRoot / "upstream/.emsdk_version").isReadableFile()) + return EmsdkErrorNoSdkInstalled; + if (!(sdkRoot / Constants::WEBASSEMBLY_EMSDK_CONFIG_FILE).isReadableFile()) + return EmsdkErrorNoSdkActivated; + return EmsdkErrorUnknown; +} + void WebAssemblySettings::updateStatus() { WebAssemblyEmSdk::clearCaches(); @@ -129,6 +161,10 @@ void WebAssemblySettings::updateStatus() const Utils::FilePath newEmSdk = emSdk.pathChooser()->filePath(); const bool sdkValid = newEmSdk.exists() && WebAssemblyEmSdk::isValid(newEmSdk); + m_statusIsEmsdkDir->setVisible(!sdkValid); + m_statusSdkInstalled->setVisible(!sdkValid); + m_statusSdkActivated->setVisible(!sdkValid); + m_statusSdkValid->setVisible(!sdkValid); m_emSdkVersionDisplay->setVisible(sdkValid); m_emSdkEnvDisplay->setEnabled(sdkValid); @@ -148,6 +184,13 @@ void WebAssemblySettings::updateStatus() .arg(bold(sdkVersion.toString()))); m_emSdkEnvDisplay->setText(environmentDisplay(newEmSdk)); } else { + const EmsdkError error = emsdkError(newEmSdk); + const bool isEmsdkDir = error != EmsdkErrorNoDir && error != EmsdkErrorNoEmsdkDir; + m_statusIsEmsdkDir->setType(isEmsdkDir ? InfoLabel::Ok : InfoLabel::NotOk); + const bool sdkInstalled = isEmsdkDir && error != EmsdkErrorNoSdkInstalled; + m_statusSdkInstalled->setType(sdkInstalled ? InfoLabel::Ok : InfoLabel::NotOk); + const bool sdkActivated = sdkInstalled && error != EmsdkErrorNoSdkActivated; + m_statusSdkActivated->setType(sdkActivated ? InfoLabel::Ok : InfoLabel::NotOk); m_emSdkEnvDisplay->clear(); } diff --git a/src/plugins/webassembly/webassemblysettings.h b/src/plugins/webassembly/webassemblysettings.h index c7169b6c821..de322b4874a 100644 --- a/src/plugins/webassembly/webassemblysettings.h +++ b/src/plugins/webassembly/webassemblysettings.h @@ -21,6 +21,10 @@ public: Utils::FilePathAspect emSdk{this}; private: + Utils::InfoLabel *m_statusIsEmsdkDir = nullptr; + Utils::InfoLabel *m_statusSdkInstalled = nullptr; + Utils::InfoLabel *m_statusSdkActivated = nullptr; + Utils::InfoLabel *m_statusSdkValid = nullptr; Utils::InfoLabel *m_emSdkVersionDisplay = nullptr; QTextBrowser *m_emSdkEnvDisplay = nullptr; Utils::InfoLabel *m_qtVersionDisplay = nullptr;