diff --git a/src/plugins/mcusupport/CMakeLists.txt b/src/plugins/mcusupport/CMakeLists.txt index 778f0a70394..81fadd4ddfb 100644 --- a/src/plugins/mcusupport/CMakeLists.txt +++ b/src/plugins/mcusupport/CMakeLists.txt @@ -23,6 +23,7 @@ add_qtc_plugin(McuSupport mcuhelpers.cpp mcuhelpers.h settingshandler.cpp settingshandler.h mcuqmlprojectnode.cpp mcuqmlprojectnode.h + mcubuildstep.cpp mcubuildstep.h ) add_subdirectory(test) diff --git a/src/plugins/qmlprojectmanager/mcubuildstep.cpp b/src/plugins/mcusupport/mcubuildstep.cpp similarity index 68% rename from src/plugins/qmlprojectmanager/mcubuildstep.cpp rename to src/plugins/mcusupport/mcubuildstep.cpp index 031ed770354..a26e8ed0d1e 100644 --- a/src/plugins/qmlprojectmanager/mcubuildstep.cpp +++ b/src/plugins/mcusupport/mcubuildstep.cpp @@ -2,7 +2,11 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "mcubuildstep.h" -#include "qmlprojectmanagertr.h" +#include "mcukitmanager.h" +#include "mculegacyconstants.h" +#include "mcusupportconstants.h" + +#include #include #include @@ -14,10 +18,8 @@ #include #include -#include +#include -#include -#include #include #include @@ -25,7 +27,7 @@ #include -namespace QmlProjectManager { +namespace McuSupport::Internal { const Utils::Id DeployMcuProcessStep::id = "QmlProject.Mcu.DeployStep"; @@ -35,26 +37,17 @@ void DeployMcuProcessStep::showError(const QString &text) ProjectExplorer::TaskHub::addTask(task); } -// TODO: -// - Grabbing *a* kit might not be the best todo. -// Would be better to specify a specific version of Qt4MCU in the qmlproject file. -// Currently we use the kit with the greatest version number. -// -// - Do not compare to *legacy* constants. -// Sounds like they will stop existing at some point. -// Also: Find Constant for QUL_PLATFORM - DeployMcuProcessStep::DeployMcuProcessStep(ProjectExplorer::BuildStepList *bc, Utils::Id id) : AbstractProcessStep(bc, id) , m_tmpDir() { if (!buildSystem()) { - showError(Tr::tr("Failed to find valid build system")); + showError(QmlProjectManager::Tr::tr("Failed to find valid build system")); return; } if (!m_tmpDir.isValid()) { - showError(Tr::tr("Failed to create valid build directory")); + showError(QmlProjectManager::Tr::tr("Failed to create valid build directory")); return; } @@ -62,14 +55,14 @@ DeployMcuProcessStep::DeployMcuProcessStep(ProjectExplorer::BuildStepList *bc, U if (!kit) return; - QString root = findKitInformation(kit, McuSupport::Internal::Legacy::Constants::QUL_CMAKE_VAR); + QString root = findKitInformation(kit, Internal::Legacy::Constants::QUL_CMAKE_VAR); auto rootPath = Utils::FilePath::fromString(root); auto cmd = addAspect(); cmd->setSettingsKey("QmlProject.Mcu.ProcessStep.Command"); cmd->setDisplayStyle(Utils::StringAspect::PathChooserDisplay); cmd->setExpectedKind(Utils::PathChooser::Command); - cmd->setLabelText(Tr::tr("Command:")); + cmd->setLabelText(QmlProjectManager::Tr::tr("Command:")); cmd->setFilePath(rootPath.pathAppended("/bin/qmlprojectexporter")); const char *importPathConstant = QtSupport::Constants::KIT_QML_IMPORT_PATH; @@ -80,7 +73,7 @@ DeployMcuProcessStep::DeployMcuProcessStep(ProjectExplorer::BuildStepList *bc, U Utils::ProcessArgs::quoteArg(qulIncludeDir.pathAppended("Timeline").toString()) }; - const char *toolChainConstant = McuSupport::Internal::Constants::KIT_MCUTARGET_TOOLCHAIN_KEY; + const char *toolChainConstant = Internal::Constants::KIT_MCUTARGET_TOOLCHAIN_KEY; QStringList arguments = { Utils::ProcessArgs::quoteArg(buildSystem()->projectFilePath().toString()), "--platform", findKitInformation(kit, "QUL_PLATFORM"), @@ -91,14 +84,14 @@ DeployMcuProcessStep::DeployMcuProcessStep(ProjectExplorer::BuildStepList *bc, U auto args = addAspect(); args->setSettingsKey("QmlProject.Mcu.ProcessStep.Arguments"); args->setDisplayStyle(Utils::StringAspect::LineEditDisplay); - args->setLabelText(Tr::tr("Arguments:")); + args->setLabelText(QmlProjectManager::Tr::tr("Arguments:")); args->setValue(Utils::ProcessArgs::joinArgs(arguments)); auto outDir = addAspect(); outDir->setSettingsKey("QmlProject.Mcu.ProcessStep.BuildDirectory"); outDir->setDisplayStyle(Utils::StringAspect::PathChooserDisplay); outDir->setExpectedKind(Utils::PathChooser::Directory); - outDir->setLabelText(Tr::tr("Build directory:")); + outDir->setLabelText(QmlProjectManager::Tr::tr("Build directory:")); outDir->setPlaceHolderText(m_tmpDir.path()); setCommandLineProvider([this, cmd, args, outDir]() -> Utils::CommandLine { @@ -116,7 +109,6 @@ DeployMcuProcessStep::DeployMcuProcessStep(ProjectExplorer::BuildStepList *bc, U QString DeployMcuProcessStep::findKitInformation(ProjectExplorer::Kit *kit, const QString &key) { - // This is (kind of) stolen from mcukitmanager.cpp. Might make sense to unify. using namespace CMakeProjectManager; const auto config = CMakeConfigurationKitAspect::configuration(kit).toList(); const auto keyName = key.toUtf8(); @@ -130,57 +122,50 @@ QString DeployMcuProcessStep::findKitInformation(ProjectExplorer::Kit *kit, cons MCUBuildStepFactory::MCUBuildStepFactory() : BuildStepFactory() { - setDisplayName(Tr::tr("Qt4MCU Deploy Step")); + setDisplayName(QmlProjectManager::Tr::tr("Qt for MCUs Deploy Step")); registerStep(DeployMcuProcessStep::id); } -void MCUBuildStepFactory::attachToTarget(ProjectExplorer::Target *target) -{ - if (!target) - return; - - ProjectExplorer::DeployConfiguration *deployConfiguration = target->activeDeployConfiguration(); - ProjectExplorer::BuildStepList *stepList = deployConfiguration->stepList(); - if (stepList->contains(DeployMcuProcessStep::id)) - return; - - if (!findMostRecentQulKit()) { - DeployMcuProcessStep::showError(Tr::tr("Failed to find valid Qt4MCU kit")); - return; - } - - for (BuildStepFactory *factory : BuildStepFactory::allBuildStepFactories()) { - if (factory->stepId() == DeployMcuProcessStep::id) { - ProjectExplorer::BuildStep *deployConfig = factory->create(stepList); - stepList->appendStep(deployConfig); - } - } -} - ProjectExplorer::Kit *MCUBuildStepFactory::findMostRecentQulKit() { - // Stolen from mcukitmanager.cpp - auto kitQulVersion = [](const ProjectExplorer::Kit *kit) -> QVersionNumber { - const char *sdkVersion = McuSupport::Internal::Constants::KIT_MCUTARGET_SDKVERSION_KEY; - return QVersionNumber::fromString(kit->value(sdkVersion).toString()); - }; - ProjectExplorer::Kit *mcuKit = nullptr; for (auto availableKit : ProjectExplorer::KitManager::kits()) { if (!availableKit) continue; - auto qulVersion = kitQulVersion(availableKit); + auto qulVersion = McuKitManager::kitQulVersion(availableKit); if (qulVersion.isNull()) continue; if (!mcuKit) mcuKit = availableKit; - if (qulVersion > kitQulVersion(mcuKit)) + if (qulVersion > McuKitManager::kitQulVersion(mcuKit)) mcuKit = availableKit; } return mcuKit; } -} // namespace QmlProjectManager +void MCUBuildStepFactory::updateDeployStep(ProjectExplorer::Target *target, bool enabled) +{ + if (!target) + return; + + ProjectExplorer::DeployConfiguration *deployConfiguration = target->activeDeployConfiguration(); + ProjectExplorer::BuildStepList *stepList = deployConfiguration->stepList(); + ProjectExplorer::BuildStep *step = stepList->firstStepWithId(DeployMcuProcessStep::id); + if (!step && enabled) { + if (findMostRecentQulKit()) { + stepList->appendStep(DeployMcuProcessStep::id); + } else { + DeployMcuProcessStep::showError( + QmlProjectManager::Tr::tr("Failed to find valid Qt for MCUs kit")); + } + } else { + if (!step) + return; + step->setEnabled(enabled); + } +} + +} // namespace McuSupport::Internal diff --git a/src/plugins/qmlprojectmanager/mcubuildstep.h b/src/plugins/mcusupport/mcubuildstep.h similarity index 85% rename from src/plugins/qmlprojectmanager/mcubuildstep.h rename to src/plugins/mcusupport/mcubuildstep.h index 988284a8905..aebca09eba8 100644 --- a/src/plugins/qmlprojectmanager/mcubuildstep.h +++ b/src/plugins/mcusupport/mcubuildstep.h @@ -11,7 +11,7 @@ #include -namespace QmlProjectManager { +namespace McuSupport::Internal { class DeployMcuProcessStep : public ProjectExplorer::AbstractProcessStep { @@ -30,8 +30,8 @@ class MCUBuildStepFactory : public ProjectExplorer::BuildStepFactory { public: MCUBuildStepFactory(); - static void attachToTarget(ProjectExplorer::Target *target); static ProjectExplorer::Kit *findMostRecentQulKit(); + static void updateDeployStep(ProjectExplorer::Target *target, bool enabled); }; -} // namespace QmlProjectManager +} // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcusupportplugin.cpp b/src/plugins/mcusupport/mcusupportplugin.cpp index 6b4e851c476..274cd738e11 100644 --- a/src/plugins/mcusupport/mcusupportplugin.cpp +++ b/src/plugins/mcusupport/mcusupportplugin.cpp @@ -3,6 +3,7 @@ #include "mcusupportplugin.h" +#include "mcubuildstep.h" #include "mcukitinformation.h" #include "mcukitmanager.h" #include "mcuqmlprojectnode.h" @@ -98,6 +99,7 @@ public: McuSupportOptions m_options{m_settingsHandler}; McuSupportOptionsPage optionsPage{m_options, m_settingsHandler}; McuDependenciesKitAspect environmentPathsKitAspect; + MCUBuildStepFactory mcuBuildStepFactory; }; // class McuSupportPluginPrivate static McuSupportPluginPrivate *dd{nullptr}; @@ -219,4 +221,9 @@ void McuSupportPlugin::askUserAboutRemovingUninstalledTargetsKits() ICore::infoBar()->addInfo(info); } +void McuSupportPlugin::updateDeployStep(ProjectExplorer::Target *target, bool enabled) +{ + MCUBuildStepFactory::updateDeployStep(target, enabled); +} + } // namespace McuSupport::Internal diff --git a/src/plugins/mcusupport/mcusupportplugin.h b/src/plugins/mcusupport/mcusupportplugin.h index cb27b138464..c092f51d00f 100644 --- a/src/plugins/mcusupport/mcusupportplugin.h +++ b/src/plugins/mcusupport/mcusupportplugin.h @@ -7,6 +7,8 @@ #include +#include + namespace McuSupport::Internal { void printMessage(const QString &message, bool important); @@ -25,6 +27,8 @@ public: void askUserAboutMcuSupportKitsSetup(); static void askUserAboutMcuSupportKitsUpgrade(const SettingsHandler::Ptr &settingsHandler); static void askUserAboutRemovingUninstalledTargetsKits(); + + Q_INVOKABLE static void updateDeployStep(ProjectExplorer::Target *target, bool enabled); }; } // McuSupport::Internal diff --git a/src/plugins/qmlprojectmanager/CMakeLists.txt b/src/plugins/qmlprojectmanager/CMakeLists.txt index 9b6e7609176..3b7209d05c7 100644 --- a/src/plugins/qmlprojectmanager/CMakeLists.txt +++ b/src/plugins/qmlprojectmanager/CMakeLists.txt @@ -1,7 +1,7 @@ add_qtc_plugin(QmlProjectManager CONDITION TARGET Qt5::QuickWidgets PLUGIN_CLASS QmlProjectPlugin - DEPENDS QmlJS Qt5::QuickWidgets Utils McuSupport CMakeProjectManager + DEPENDS QmlJS Qt5::QuickWidgets Utils PLUGIN_DEPENDS Core ProjectExplorer QtSupport QmlDesignerBase SOURCES qmlprojectgen/qmlprojectgenerator.cpp qmlprojectgen/qmlprojectgenerator.h @@ -21,7 +21,6 @@ add_qtc_plugin(QmlProjectManager qmlprojectplugin.cpp qmlprojectplugin.h qmlprojectrunconfiguration.cpp qmlprojectrunconfiguration.h buildsystem/qmlbuildsystem.cpp buildsystem/qmlbuildsystem.h - mcubuildstep.cpp mcubuildstep.h "${PROJECT_SOURCE_DIR}/src/share/3rdparty/studiofonts/studiofonts.qrc" ) diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index 712aef92277..86645dc8c50 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -3,7 +3,6 @@ #include "qmlbuildsystem.h" #include "qmlprojectconstants.h" -#include "mcubuildstep.h" #include #include @@ -18,6 +17,10 @@ #include #include +#include +#include +#include + #include #include #include @@ -41,6 +44,31 @@ namespace { Q_LOGGING_CATEGORY(infoLogger, "QmlProjectManager.QmlBuildSystem", QtInfoMsg) } +ExtensionSystem::IPlugin *findMcuSupportPlugin() +{ + const ExtensionSystem::PluginSpec *pluginSpec = Utils::findOrDefault( + ExtensionSystem::PluginManager::plugins(), + Utils::equal(&ExtensionSystem::PluginSpec::name, QString("McuSupport"))); + + if (pluginSpec) + return pluginSpec->plugin(); + return nullptr; +} + +void updateMcuBuildStep(Target *target, bool mcuEnabled) +{ + if (auto plugin = findMcuSupportPlugin()) { + QMetaObject::invokeMethod( + plugin, + "updateDeployStep", + Qt::DirectConnection, + Q_ARG(ProjectExplorer::Target*, target), + Q_ARG(bool, mcuEnabled)); + } else if (mcuEnabled) { + qWarning() << "Failed to find McuSupport plugin but qtForMCUs is enabled in the project"; + } +} + QmlBuildSystem::QmlBuildSystem(Target *target) : BuildSystem(target) { @@ -52,11 +80,11 @@ QmlBuildSystem::QmlBuildSystem(Target *target) connect(target->project(), &Project::activeTargetChanged, [this](Target *target) { refresh(RefreshOptions::NoFileRefresh); - if (qtForMCUs()) - MCUBuildStepFactory::attachToTarget(target); + updateMcuBuildStep(target, qtForMCUs()); }); connect(target->project(), &Project::projectFileIsDirty, [this]() { refresh(RefreshOptions::Project); + updateMcuBuildStep(project()->activeTarget(), qtForMCUs()); }); // FIXME: Check. Probably bogus after the BuildSystem move. diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index dd33508636c..0a87ef9bc90 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -1,7 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "mcubuildstep.h" #include "qdslandingpage.h" #include "qmlprojectplugin.h" #include "qmlproject.h" @@ -94,7 +93,6 @@ public: QPointer lastMessageBox; QdsLandingPage *landingPage = nullptr; QdsLandingPageWidget *landingPageWidget = nullptr; - MCUBuildStepFactory mcuBuildStepFactory; }; QmlProjectPlugin::~QmlProjectPlugin()