diff options
Diffstat (limited to 'src/plugins/baremetal')
29 files changed, 282 insertions, 366 deletions
diff --git a/src/plugins/baremetal/CMakeLists.txt b/src/plugins/baremetal/CMakeLists.txt index f9d9bc0dc5..0a811d37b9 100644 --- a/src/plugins/baremetal/CMakeLists.txt +++ b/src/plugins/baremetal/CMakeLists.txt @@ -10,7 +10,6 @@ add_qtc_plugin(BareMetal baremetaldeviceconfigurationwidget.cpp baremetaldeviceconfigurationwidget.h baremetaldeviceconfigurationwizard.cpp baremetaldeviceconfigurationwizard.h baremetaldeviceconfigurationwizardpages.cpp baremetaldeviceconfigurationwizardpages.h - baremetalgdbcommandsdeploystep.cpp baremetalgdbcommandsdeploystep.h baremetalplugin.cpp baremetalplugin.h baremetalrunconfiguration.cpp baremetalrunconfiguration.h defaultgdbserverprovider.cpp defaultgdbserverprovider.h diff --git a/src/plugins/baremetal/baremetal.pro b/src/plugins/baremetal/baremetal.pro index ac49b0041f..76cd5ac308 100644 --- a/src/plugins/baremetal/baremetal.pro +++ b/src/plugins/baremetal/baremetal.pro @@ -7,7 +7,6 @@ SOURCES += baremetalplugin.cpp \ baremetalcustomrunconfiguration.cpp\ baremetaldevice.cpp \ baremetalrunconfiguration.cpp \ - baremetalgdbcommandsdeploystep.cpp \ baremetaldeviceconfigurationwizardpages.cpp \ baremetaldeviceconfigurationwizard.cpp \ baremetaldeviceconfigurationwidget.cpp \ @@ -32,7 +31,6 @@ HEADERS += baremetalplugin.h \ baremetalcustomrunconfiguration.h \ baremetaldevice.h \ baremetalrunconfiguration.h \ - baremetalgdbcommandsdeploystep.h \ baremetaldeviceconfigurationwidget.h \ baremetaldeviceconfigurationwizard.h \ baremetaldeviceconfigurationwizardpages.h \ diff --git a/src/plugins/baremetal/baremetal.qbs b/src/plugins/baremetal/baremetal.qbs index 018c2dc23b..b50db5769e 100644 --- a/src/plugins/baremetal/baremetal.qbs +++ b/src/plugins/baremetal/baremetal.qbs @@ -20,7 +20,6 @@ QtcPlugin { "baremetaldeviceconfigurationwidget.cpp", "baremetaldeviceconfigurationwidget.h", "baremetaldeviceconfigurationwizard.cpp", "baremetaldeviceconfigurationwizard.h", "baremetaldeviceconfigurationwizardpages.cpp", "baremetaldeviceconfigurationwizardpages.h", - "baremetalgdbcommandsdeploystep.cpp", "baremetalgdbcommandsdeploystep.h", "baremetalplugin.cpp", "baremetalplugin.h", "baremetalrunconfiguration.cpp", "baremetalrunconfiguration.h", "baremetaldebugsupport.cpp", "baremetaldebugsupport.h", diff --git a/src/plugins/baremetal/baremetaldebugsupport.cpp b/src/plugins/baremetal/baremetaldebugsupport.cpp index cda24139df..a8f20e197a 100644 --- a/src/plugins/baremetal/baremetaldebugsupport.cpp +++ b/src/plugins/baremetal/baremetaldebugsupport.cpp @@ -25,7 +25,6 @@ #include "baremetaldebugsupport.h" #include "baremetaldevice.h" -#include "baremetalgdbcommandsdeploystep.h" #include "gdbserverprovider.h" #include "gdbserverprovidermanager.h" @@ -48,12 +47,25 @@ using namespace Debugger; using namespace ProjectExplorer; +using namespace Utils; namespace BareMetal { namespace Internal { // BareMetalDebugSupport +class BareMetalGdbServer : public SimpleTargetRunner +{ +public: + BareMetalGdbServer(RunControl *runControl, const Runnable &runnable) + : SimpleTargetRunner(runControl) + { + setId("BareMetalGdbServer"); + // Baremetal's GDB servers are launched on the host, not on the target. + setStarter([this, runnable] { doStart(runnable, {}); }); + } +}; + BareMetalDebugSupport::BareMetalDebugSupport(RunControl *runControl) : Debugger::DebuggerRunTool(runControl) { @@ -75,9 +87,8 @@ BareMetalDebugSupport::BareMetalDebugSupport(RunControl *runControl) r.setCommandLine(p->command()); // Command arguments are in host OS style as the bare metal's GDB servers are launched // on the host, not on that target. - m_gdbServer = new SimpleTargetRunner(runControl); - m_gdbServer->setRunnable(r); - addStartDependency(m_gdbServer); + auto gdbServer = new BareMetalGdbServer(runControl, r); + addStartDependency(gdbServer); } } @@ -86,40 +97,21 @@ void BareMetalDebugSupport::start() const auto exeAspect = runControl()->aspect<ExecutableAspect>(); QTC_ASSERT(exeAspect, reportFailure(); return); - const QString bin = exeAspect->executable().toString(); + const FilePath bin = exeAspect->executable(); if (bin.isEmpty()) { reportFailure(tr("Cannot debug: Local executable is not set.")); return; } - if (!QFile::exists(bin)) { - reportFailure(tr("Cannot debug: Could not find executable for \"%1\".").arg(bin)); + if (!bin.exists()) { + reportFailure(tr("Cannot debug: Could not find executable for \"%1\".").arg(bin.toString())); return; } - const Target *target = runControl()->target(); - QTC_ASSERT(target, reportFailure(); return); - const auto dev = qSharedPointerCast<const BareMetalDevice>(device()); QTC_ASSERT(dev, reportFailure(); return); const GdbServerProvider *p = GdbServerProviderManager::findProvider(dev->gdbServerProviderId()); QTC_ASSERT(p, reportFailure(); return); -#if 0 - // Currently baremetal plugin does not provide way to configure deployments steps - // FIXME: Should it? - QString commands; - if (const BuildConfiguration *bc = target->activeBuildConfiguration()) { - if (BuildStepList *bsl = bc->stepList(BareMetalGdbCommandsDeployStep::stepId())) { - for (const BareMetalGdbCommandsDeployStep *bs : bsl->allOfType<BareMetalGdbCommandsDeployStep>()) { - if (!commands.endsWith("\n")) - commands.append("\n"); - commands.append(bs->gdbCommands()); - } - } - } - setCommandsAfterConnect(commands); -#endif - Runnable inferior; inferior.executable = bin; if (const auto aspect = runControl()->aspect<ArgumentsAspect>()) @@ -129,7 +121,7 @@ void BareMetalDebugSupport::start() setStartMode(AttachToRemoteServer); setCommandsAfterConnect(p->initCommands()); // .. and here? setCommandsForReset(p->resetCommands()); - setRemoteChannel(p->channel()); + setRemoteChannel(p->channelString()); setUseContinueInsteadOfRun(true); setUseExtendedRemote(p->useExtendedRemote()); diff --git a/src/plugins/baremetal/baremetaldebugsupport.h b/src/plugins/baremetal/baremetaldebugsupport.h index 3a59343a9e..cfc31017fb 100644 --- a/src/plugins/baremetal/baremetaldebugsupport.h +++ b/src/plugins/baremetal/baremetaldebugsupport.h @@ -41,8 +41,6 @@ public: private: void start() final; - - ProjectExplorer::SimpleTargetRunner *m_gdbServer = nullptr; }; } // namespace Internal diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index 340ca1a229..d9901ccc58 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -50,12 +50,24 @@ const char gdbServerProviderIdKeyC[] = "GdbServerProviderId"; // BareMetalDevice +BareMetalDevice::BareMetalDevice() +{ + setDisplayType(QCoreApplication::translate("BareMetal::Internal::BareMetalDevice", "Bare Metal")); + setDefaultDisplayName(defaultDisplayName()); + setOsType(Utils::OsTypeOther); +} + BareMetalDevice::~BareMetalDevice() { if (GdbServerProvider *provider = GdbServerProviderManager::findProvider(m_gdbServerProviderId)) provider->unregisterDevice(this); } +QString BareMetalDevice::defaultDisplayName() +{ + return QCoreApplication::translate("BareMetal::Internal::BareMetalDevice", "Bare Metal Device"); +} + QString BareMetalDevice::gdbServerProviderId() const { return m_gdbServerProviderId; @@ -90,7 +102,7 @@ void BareMetalDevice::providerUpdated(GdbServerProvider *provider) void BareMetalDevice::setChannelByServerProvider(GdbServerProvider *provider) { QTC_ASSERT(provider, return); - const QString channel = provider->channel(); + const QString channel = provider->channelString(); const int colon = channel.indexOf(QLatin1Char(':')); if (colon < 0) return; @@ -111,9 +123,8 @@ void BareMetalDevice::fromMap(const QVariantMap &map) } else { const QSsh::SshConnectionParameters sshParams = sshParameters(); const auto newProvider = new DefaultGdbServerProvider; + newProvider->setChannel(sshParams.url); newProvider->setDisplayName(name); - newProvider->m_host = sshParams.host(); - newProvider->m_port = sshParams.port(); if (GdbServerProviderManager::registerProvider(newProvider)) gdbServerProvider = newProvider->id(); else @@ -135,21 +146,11 @@ DeviceProcessSignalOperation::Ptr BareMetalDevice::signalOperation() const return DeviceProcessSignalOperation::Ptr(); } -QString BareMetalDevice::displayType() const -{ - return QCoreApplication::translate("BareMetal::Internal::BareMetalDevice", "Bare Metal"); -} - IDeviceWidget *BareMetalDevice::createWidget() { return new BareMetalDeviceConfigurationWidget(sharedFromThis()); } -Utils::OsType BareMetalDevice::osType() const -{ - return Utils::OsTypeOther; -} - DeviceProcess *BareMetalDevice::createProcess(QObject *parent) const { return new GdbServerProviderProcess(sharedFromThis(), parent); diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h index b4d1b3afce..eda3f957f2 100644 --- a/src/plugins/baremetal/baremetaldevice.h +++ b/src/plugins/baremetal/baremetaldevice.h @@ -45,9 +45,9 @@ public: static Ptr create() { return Ptr(new BareMetalDevice); } ~BareMetalDevice() final; - QString displayType() const final; + static QString defaultDisplayName(); + ProjectExplorer::IDeviceWidget *createWidget() final; - Utils::OsType osType() const final; ProjectExplorer::DeviceProcessSignalOperation::Ptr signalOperation() const final; @@ -63,7 +63,7 @@ public: QVariantMap toMap() const final; private: - explicit BareMetalDevice() = default; + BareMetalDevice(); void setChannelByServerProvider(GdbServerProvider *provider); QString m_gdbServerProviderId; diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp index a528bd4b8e..26257ef128 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp @@ -30,6 +30,7 @@ #include "gdbserverprovider.h" #include "gdbserverproviderchooser.h" +#include <utils/pathchooser.h> #include <utils/qtcassert.h> #include <QFormLayout> @@ -40,8 +41,8 @@ namespace Internal { // BareMetalDeviceConfigurationWidget BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget( - const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent) - : IDeviceWidget(deviceConfig, parent) + const ProjectExplorer::IDevice::Ptr &deviceConfig) + : IDeviceWidget(deviceConfig) { const auto dev = qSharedPointerCast<const BareMetalDevice>(device()); QTC_ASSERT(dev, return); @@ -56,6 +57,19 @@ BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget( connect(m_gdbServerProviderChooser, &GdbServerProviderChooser::providerChanged, this, &BareMetalDeviceConfigurationWidget::gdbServerProviderChanged); + + m_peripheralDescriptionFileChooser = new Utils::PathChooser(this); + m_peripheralDescriptionFileChooser->setExpectedKind(Utils::PathChooser::File); + m_peripheralDescriptionFileChooser->setPromptDialogFilter( + tr("Peripheral description files (*.svd)")); + m_peripheralDescriptionFileChooser->setPromptDialogTitle( + tr("Select Peripheral Description File")); + m_peripheralDescriptionFileChooser->setPath(dev->peripheralDescriptionFilePath()); + formLayout->addRow(tr("Peripheral description file:"), + m_peripheralDescriptionFileChooser); + + connect(m_peripheralDescriptionFileChooser, &Utils::PathChooser::pathChanged, + this, &BareMetalDeviceConfigurationWidget::peripheralDescriptionFileChanged); } void BareMetalDeviceConfigurationWidget::gdbServerProviderChanged() @@ -65,6 +79,13 @@ void BareMetalDeviceConfigurationWidget::gdbServerProviderChanged() dev->setGdbServerProviderId(m_gdbServerProviderChooser->currentProviderId()); } +void BareMetalDeviceConfigurationWidget::peripheralDescriptionFileChanged() +{ + const auto dev = qSharedPointerCast<BareMetalDevice>(device()); + QTC_ASSERT(dev, return); + dev->setPeripheralDescriptionFilePath(m_peripheralDescriptionFileChooser->path()); +} + void BareMetalDeviceConfigurationWidget::updateDeviceFromUi() { gdbServerProviderChanged(); diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h index ad8017f53f..abf0c3f3e1 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h @@ -28,6 +28,8 @@ #include <projectexplorer/devicesupport/idevicewidget.h> +namespace Utils { class PathChooser; } + namespace BareMetal { namespace Internal { @@ -41,14 +43,15 @@ class BareMetalDeviceConfigurationWidget final Q_OBJECT public: - explicit BareMetalDeviceConfigurationWidget( - const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent = nullptr); + explicit BareMetalDeviceConfigurationWidget(const ProjectExplorer::IDevice::Ptr &deviceConfig); private: void gdbServerProviderChanged(); + void peripheralDescriptionFileChanged(); void updateDeviceFromUi() final; GdbServerProviderChooser *m_gdbServerProviderChooser = nullptr; + Utils::PathChooser *m_peripheralDescriptionFileChooser = nullptr; }; } // namespace Internal diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp index 4e0e69b4f8..53634ec239 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp @@ -62,7 +62,7 @@ BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardS void BareMetalDeviceConfigurationWizardSetupPage::initializePage() { - m_nameLineEdit->setText(defaultConfigurationName()); + m_nameLineEdit->setText(BareMetalDevice::defaultDisplayName()); } bool BareMetalDeviceConfigurationWizardSetupPage::isComplete() const @@ -80,10 +80,5 @@ QString BareMetalDeviceConfigurationWizardSetupPage::gdbServerProviderId() const return m_gdbServerProviderChooser->currentProviderId(); } -QString BareMetalDeviceConfigurationWizardSetupPage::defaultConfigurationName() const -{ - return tr("Bare Metal Device"); -} - } // namespace Internal } // namespace BareMetal diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h index 27ac808108..05f16ba290 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h @@ -51,8 +51,6 @@ public: QString configurationName() const; QString gdbServerProviderId() const; - virtual QString defaultConfigurationName() const; - private: QLineEdit *m_nameLineEdit = nullptr; GdbServerProviderChooser *m_gdbServerProviderChooser = nullptr; diff --git a/src/plugins/baremetal/baremetalplugin.cpp b/src/plugins/baremetal/baremetalplugin.cpp index 0ce4c51835..d45367ac7d 100644 --- a/src/plugins/baremetal/baremetalplugin.cpp +++ b/src/plugins/baremetal/baremetalplugin.cpp @@ -63,6 +63,12 @@ public: BareMetalCustomRunConfigurationFactory customRunConfigurationFactory; GdbServerProvidersSettingsPage gdbServerProviderSettinsPage; GdbServerProviderManager gdbServerProviderManager; + + RunWorkerFactory runWorkerFactory{ + RunWorkerFactory::make<BareMetalDebugSupport>(), + {ProjectExplorer::Constants::NORMAL_RUN_MODE, ProjectExplorer::Constants::DEBUG_RUN_MODE}, + {runConfigurationFactory.id(), customRunConfigurationFactory.id()} + }; }; // BareMetalPlugin @@ -78,19 +84,6 @@ bool BareMetalPlugin::initialize(const QStringList &arguments, QString *errorStr Q_UNUSED(errorString) d = new BareMetalPluginPrivate; - - auto constraint = [](RunConfiguration *runConfig) { - const QByteArray idStr = runConfig->id().name(); - const bool res = idStr.startsWith(BareMetalRunConfiguration::IdPrefix) - || idStr == BareMetalCustomRunConfiguration::Id; - return res; - }; - - RunControl::registerWorker<BareMetalDebugSupport> - (ProjectExplorer::Constants::NORMAL_RUN_MODE, constraint); - RunControl::registerWorker<BareMetalDebugSupport> - (ProjectExplorer::Constants::DEBUG_RUN_MODE, constraint); - return true; } diff --git a/src/plugins/baremetal/defaultgdbserverprovider.cpp b/src/plugins/baremetal/defaultgdbserverprovider.cpp index 49d126479d..189e64524b 100644 --- a/src/plugins/baremetal/defaultgdbserverprovider.cpp +++ b/src/plugins/baremetal/defaultgdbserverprovider.cpp @@ -38,62 +38,14 @@ namespace BareMetal { namespace Internal { -static const char hostKeyC[] = "BareMetal.DefaultGdbServerProvider.Host"; -static const char portKeyC[] = "BareMetal.DefaultGdbServerProvider.Port"; - // DefaultGdbServerProvider DefaultGdbServerProvider::DefaultGdbServerProvider() : GdbServerProvider(QLatin1String(Constants::DEFAULT_PROVIDER_ID)) { -} - -DefaultGdbServerProvider::DefaultGdbServerProvider(const DefaultGdbServerProvider &other) = default; - -quint16 DefaultGdbServerProvider::port() const -{ - return m_port; -} - -void DefaultGdbServerProvider::setPort(const quint16 &port) -{ - m_port = port; -} - -QString DefaultGdbServerProvider::host() const -{ - return m_host; -} - -void DefaultGdbServerProvider::setHost(const QString &host) -{ - if (m_host == host) - return; - m_host = host; - providerUpdated(); -} - -QString DefaultGdbServerProvider::typeDisplayName() const -{ - return DefaultGdbServerProviderFactory::tr("Default"); -} - -QString DefaultGdbServerProvider::channel() const -{ - // Just return as "host:port" form. - if (m_port == 0) - return m_host; - return m_host + QLatin1Char(':') + QString::number(m_port); -} - -bool DefaultGdbServerProvider::isValid() const -{ - if (!GdbServerProvider::isValid()) - return false; - - if (m_host.isEmpty()) - return false; - return true; + setDefaultChannel("localhost", 3333); + setSettingsKeyBase("BareMetal.DefaultGdbServerProvider"); + setTypeDisplayName(DefaultGdbServerProviderFactory::tr("Default")); } GdbServerProvider *DefaultGdbServerProvider::clone() const @@ -101,33 +53,6 @@ GdbServerProvider *DefaultGdbServerProvider::clone() const return new DefaultGdbServerProvider(*this); } -QVariantMap DefaultGdbServerProvider::toMap() const -{ - auto data = GdbServerProvider::toMap(); - data.insert(QLatin1String(hostKeyC), m_host); - data.insert(QLatin1String(portKeyC), m_port); - return data; -} - -bool DefaultGdbServerProvider::fromMap(const QVariantMap &data) -{ - if (!GdbServerProvider::fromMap(data)) - return false; - - m_host = data.value(QLatin1String(hostKeyC)).toString(); - m_port = data.value(QLatin1String(portKeyC)).toInt(); - return true; -} - -bool DefaultGdbServerProvider::operator==(const GdbServerProvider &other) const -{ - if (!GdbServerProvider::operator==(other)) - return false; - - const auto p = static_cast<const DefaultGdbServerProvider *>(&other); - return m_host == p->m_host && m_port == p->m_port; -} - GdbServerProviderConfigWidget *DefaultGdbServerProvider::configurationWidget() { return new DefaultGdbServerProviderConfigWidget(this); @@ -206,8 +131,7 @@ void DefaultGdbServerProviderConfigWidget::applyImpl() auto p = static_cast<DefaultGdbServerProvider *>(provider()); Q_ASSERT(p); - p->setHost(m_hostWidget->host()); - p->setPort(m_hostWidget->port()); + p->setChannel(m_hostWidget->channel()); p->setUseExtendedRemote(m_useExtendedRemoteCheckBox->isChecked()); p->setInitCommands(m_initCommandsTextEdit->toPlainText()); p->setResetCommands(m_resetCommandsTextEdit->toPlainText()); @@ -224,8 +148,7 @@ void DefaultGdbServerProviderConfigWidget::setFromProvider() Q_ASSERT(p); const QSignalBlocker blocker(this); - m_hostWidget->setHost(p->m_host); - m_hostWidget->setPort(p->m_port); + m_hostWidget->setChannel(p->channel()); m_useExtendedRemoteCheckBox->setChecked(p->useExtendedRemote()); m_initCommandsTextEdit->setPlainText(p->initCommands()); m_resetCommandsTextEdit->setPlainText(p->resetCommands()); diff --git a/src/plugins/baremetal/defaultgdbserverprovider.h b/src/plugins/baremetal/defaultgdbserverprovider.h index 82b7e78160..8beb9b7b77 100644 --- a/src/plugins/baremetal/defaultgdbserverprovider.h +++ b/src/plugins/baremetal/defaultgdbserverprovider.h @@ -38,32 +38,11 @@ class DefaultGdbServerProviderFactory; class DefaultGdbServerProvider final : public GdbServerProvider { public: - QString typeDisplayName() const final; - - QVariantMap toMap() const final; - bool fromMap(const QVariantMap &data) final; - - bool operator==(const GdbServerProvider &) const final; - GdbServerProviderConfigWidget *configurationWidget() final; GdbServerProvider *clone() const final; - QString channel() const final; - - bool isValid() const final; - - QString host() const; - void setHost(const QString &host); - - quint16 port() const; - void setPort(const quint16 &port); - private: explicit DefaultGdbServerProvider(); - explicit DefaultGdbServerProvider(const DefaultGdbServerProvider &); - - QString m_host = QLatin1String("localhost"); - quint16 m_port = 3333; friend class DefaultGdbServerProviderConfigWidget; friend class DefaultGdbServerProviderFactory; diff --git a/src/plugins/baremetal/gdbserverprovider.cpp b/src/plugins/baremetal/gdbserverprovider.cpp index 520e8fb30f..a916146c38 100644 --- a/src/plugins/baremetal/gdbserverprovider.cpp +++ b/src/plugins/baremetal/gdbserverprovider.cpp @@ -49,6 +49,9 @@ const char initCommandsKeyC[] = "BareMetal.GdbServerProvider.InitCommands"; const char resetCommandsKeyC[] = "BareMetal.GdbServerProvider.ResetCommands"; const char useExtendedRemoteKeyC[] = "BareMetal.GdbServerProvider.UseExtendedRemote"; +const char hostKeySuffixC[] = ".Host"; +const char portKeySuffixC[] = ".Port"; + static QString createId(const QString &id) { QString newId = id.left(id.indexOf(QLatin1Char(':'))); @@ -128,6 +131,11 @@ bool GdbServerProvider::useExtendedRemote() const return m_useExtendedRemote; } +QString GdbServerProvider::typeDisplayName() const +{ + return m_typeDisplayName; +} + void GdbServerProvider::setUseExtendedRemote(bool useExtendedRemote) { m_useExtendedRemote = useExtendedRemote; @@ -143,6 +151,22 @@ void GdbServerProvider::setResetCommands(const QString &cmds) m_resetCommands = cmds; } +void GdbServerProvider::setChannel(const QUrl &channel) +{ + m_channel = channel; +} + +void GdbServerProvider::setDefaultChannel(const QString &host, int port) +{ + m_channel.setHost(host); + m_channel.setPort(port); +} + +QUrl GdbServerProvider::channel() const +{ + return m_channel; +} + Utils::CommandLine GdbServerProvider::command() const { return {}; @@ -158,12 +182,21 @@ bool GdbServerProvider::operator==(const GdbServerProvider &other) const // We ignore displayname return thisId == otherId + && m_channel == other.m_channel && m_startupMode == other.m_startupMode && m_initCommands == other.m_initCommands && m_resetCommands == other.m_resetCommands && m_useExtendedRemote == other.m_useExtendedRemote; } +QString GdbServerProvider::channelString() const +{ + // Just return as "host:port" form. + if (m_channel.port() <= 0) + return m_channel.host(); + return m_channel.host() + ':' + QString::number(m_channel.port()); +} + QVariantMap GdbServerProvider::toMap() const { return { @@ -173,12 +206,14 @@ QVariantMap GdbServerProvider::toMap() const {QLatin1String(initCommandsKeyC), m_initCommands}, {QLatin1String(resetCommandsKeyC), m_resetCommands}, {QLatin1String(useExtendedRemoteKeyC), m_useExtendedRemote}, + {m_settingsBase + hostKeySuffixC, m_channel.host()}, + {m_settingsBase + portKeySuffixC, m_channel.port()}, }; } bool GdbServerProvider::isValid() const { - return !channel().isNull(); + return !channelString().isEmpty(); } bool GdbServerProvider::canStartupMode(StartupMode m) const @@ -211,9 +246,22 @@ bool GdbServerProvider::fromMap(const QVariantMap &data) m_initCommands = data.value(QLatin1String(initCommandsKeyC)).toString(); m_resetCommands = data.value(QLatin1String(resetCommandsKeyC)).toString(); m_useExtendedRemote = data.value(QLatin1String(useExtendedRemoteKeyC)).toBool(); + m_channel.setHost(data.value(m_settingsBase + hostKeySuffixC).toString()); + m_channel.setPort(data.value(m_settingsBase + portKeySuffixC).toInt()); + return true; } +void GdbServerProvider::setTypeDisplayName(const QString &typeDisplayName) +{ + m_typeDisplayName = typeDisplayName; +} + +void GdbServerProvider::setSettingsKeyBase(const QString &settingsBase) +{ + m_settingsBase = settingsBase; +} + // GdbServerProviderFactory QString GdbServerProviderFactory::id() const @@ -410,26 +458,19 @@ HostWidget::HostWidget(QWidget *parent) this, &HostWidget::dataChanged); } -void HostWidget::setHost(const QString &host) -{ - const QSignalBlocker blocker(this); - m_hostLineEdit->setText(host); -} - -QString HostWidget::host() const -{ - return m_hostLineEdit->text(); -} - -void HostWidget::setPort(const quint16 &port) +void HostWidget::setChannel(const QUrl &channel) { const QSignalBlocker blocker(this); - m_portSpinBox->setValue(port); + m_hostLineEdit->setText(channel.host()); + m_portSpinBox->setValue(channel.port()); } -quint16 HostWidget::port() const +QUrl HostWidget::channel() const { - return m_portSpinBox->value(); + QUrl url; + url.setHost(m_hostLineEdit->text()); + url.setPort(m_portSpinBox->value()); + return url; } } // namespace Internal diff --git a/src/plugins/baremetal/gdbserverprovider.h b/src/plugins/baremetal/gdbserverprovider.h index 8d91408a2e..5a6bc246a5 100644 --- a/src/plugins/baremetal/gdbserverprovider.h +++ b/src/plugins/baremetal/gdbserverprovider.h @@ -72,14 +72,13 @@ public: QString initCommands() const; QString resetCommands() const; bool useExtendedRemote() const; + QString typeDisplayName() const; virtual bool operator==(const GdbServerProvider &) const; - virtual QString typeDisplayName() const = 0; - virtual GdbServerProviderConfigWidget *configurationWidget() = 0; - virtual QString channel() const = 0; + virtual QString channelString() const; virtual GdbServerProvider *clone() const = 0; virtual QVariantMap toMap() const; @@ -92,6 +91,10 @@ public: void registerDevice(BareMetalDevice *); void unregisterDevice(BareMetalDevice *); + QUrl channel() const; + void setChannel(const QUrl &channelString); + void setDefaultChannel(const QString &host, int port); + protected: explicit GdbServerProvider(const QString &id); explicit GdbServerProvider(const GdbServerProvider &); @@ -100,6 +103,8 @@ protected: void setInitCommands(const QString &); void setResetCommands(const QString &); void setUseExtendedRemote(bool); + void setSettingsKeyBase(const QString &settingsBase); + void setTypeDisplayName(const QString &typeDisplayName); void providerUpdated(); @@ -107,7 +112,10 @@ protected: private: QString m_id; + QString m_settingsBase; mutable QString m_displayName; + QString m_typeDisplayName; + QUrl m_channel; StartupMode m_startupMode = NoStartup; QString m_initCommands; QString m_resetCommands; @@ -195,10 +203,8 @@ class HostWidget final : public QWidget public: explicit HostWidget(QWidget *parent = nullptr); - void setHost(const QString &host); - QString host() const; - void setPort(const quint16 &port); - quint16 port() const; + void setChannel(const QUrl &host); + QUrl channel() const; signals: void dataChanged(); diff --git a/src/plugins/baremetal/gdbserverproviderchooser.cpp b/src/plugins/baremetal/gdbserverproviderchooser.cpp index 764a9ee0cd..768c2d205f 100644 --- a/src/plugins/baremetal/gdbserverproviderchooser.cpp +++ b/src/plugins/baremetal/gdbserverproviderchooser.cpp @@ -87,7 +87,7 @@ void GdbServerProviderChooser::manageButtonClicked() void GdbServerProviderChooser::currentIndexChanged(int index) { - Q_UNUSED(index); + Q_UNUSED(index) emit providerChanged(); } diff --git a/src/plugins/baremetal/gdbserverproviderssettingspage.cpp b/src/plugins/baremetal/gdbserverproviderssettingspage.cpp index b538ebce33..fb78ef713e 100644 --- a/src/plugins/baremetal/gdbserverproviderssettingspage.cpp +++ b/src/plugins/baremetal/gdbserverproviderssettingspage.cpp @@ -406,8 +406,7 @@ QModelIndex GdbServerProvidersSettingsWidget::currentIndex() const } -GdbServerProvidersSettingsPage::GdbServerProvidersSettingsPage(QObject *parent) - : Core::IOptionsPage(parent) +GdbServerProvidersSettingsPage::GdbServerProvidersSettingsPage() { setId(Constants::GDB_PROVIDERS_SETTINGS_ID); setDisplayName(tr("Bare Metal")); diff --git a/src/plugins/baremetal/gdbserverproviderssettingspage.h b/src/plugins/baremetal/gdbserverproviderssettingspage.h index a68515526e..c41389b307 100644 --- a/src/plugins/baremetal/gdbserverproviderssettingspage.h +++ b/src/plugins/baremetal/gdbserverproviderssettingspage.h @@ -87,7 +87,7 @@ class GdbServerProvidersSettingsPage final : public Core::IOptionsPage Q_OBJECT public: - explicit GdbServerProvidersSettingsPage(QObject *parent = nullptr); + GdbServerProvidersSettingsPage(); private: QWidget *widget() final; diff --git a/src/plugins/baremetal/iarewtoolchain.cpp b/src/plugins/baremetal/iarewtoolchain.cpp index c0684f008c..75dbee8cb5 100644 --- a/src/plugins/baremetal/iarewtoolchain.cpp +++ b/src/plugins/baremetal/iarewtoolchain.cpp @@ -71,8 +71,10 @@ static QString cppLanguageOption(const FilePath &compiler) const QString baseName = compiler.toFileInfo().baseName(); if (baseName == "iccarm") return QString("--c++"); - if (baseName == "icc8051" || baseName == "iccavr") + if (baseName == "icc8051" || baseName == "iccavr" + || baseName == "iccstm8" || baseName == "icc430") { return QString("--ec++"); + } return {}; } @@ -95,17 +97,16 @@ static Macros dumpPredefinedMacros(const FilePath &compiler, const Core::Id lang cpp.setEnvironment(env); cpp.setTimeoutS(10); - QStringList arguments; - arguments.push_back(fakeIn.fileName()); + CommandLine cmd(compiler, {fakeIn.fileName()}); if (languageId == ProjectExplorer::Constants::CXX_LANGUAGE_ID) - arguments.push_back(cppLanguageOption(compiler)); - arguments.push_back("--predef_macros"); - arguments.push_back(outpath); + cmd.addArg(cppLanguageOption(compiler)); + cmd.addArg("--predef_macros"); + cmd.addArg(outpath); - const SynchronousProcessResponse response = cpp.runBlocking(compiler.toString(), arguments); + const SynchronousProcessResponse response = cpp.runBlocking(cmd); if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) { - qWarning() << response.exitMessage(compiler.toString(), 10); + qWarning() << response.exitMessage(cmd.toUserOutput(), 10); return {}; } @@ -141,16 +142,14 @@ static HeaderPaths dumpHeaderPaths(const FilePath &compiler, const Core::Id lang cpp.setEnvironment(env); cpp.setTimeoutS(10); - QStringList arguments; - arguments.push_back(fakeIn.fileName()); + CommandLine cmd(compiler, {fakeIn.fileName()}); if (languageId == ProjectExplorer::Constants::CXX_LANGUAGE_ID) - arguments.push_back(cppLanguageOption(compiler)); - arguments.push_back("--preinclude"); - arguments.push_back("."); + cmd.addArg(cppLanguageOption(compiler)); + cmd.addArg("--preinclude"); + cmd.addArg("."); // Note: Response should retutn an error, just don't check on errors. - const SynchronousProcessResponse response = cpp.runBlocking(compiler.toString(), - arguments); + const SynchronousProcessResponse response = cpp.runBlocking(cmd); HeaderPaths headerPaths; @@ -192,6 +191,10 @@ static Abi::Architecture guessArchitecture(const Macros ¯os) return Abi::Architecture::Mcs51Architecture; if (macro.key == "__ICCAVR__") return Abi::Architecture::AvrArchitecture; + if (macro.key == "__ICCSTM8__") + return Abi::Architecture::Stm8Architecture; + if (macro.key == "__ICC430__") + return Abi::Architecture::Msp430Architecture; } return Abi::Architecture::UnknownArchitecture; } @@ -208,10 +211,13 @@ static unsigned char guessWordWidth(const Macros ¯os) static Abi::BinaryFormat guessFormat(Abi::Architecture arch) { - if (arch == Abi::Architecture::ArmArchitecture) + if (arch == Abi::Architecture::ArmArchitecture + || arch == Abi::Architecture::Stm8Architecture) { return Abi::BinaryFormat::ElfFormat; + } if (arch == Abi::Architecture::Mcs51Architecture - || arch == Abi::Architecture::AvrArchitecture) { + || arch == Abi::Architecture::AvrArchitecture + || arch == Abi::Architecture::Msp430Architecture) { return Abi::BinaryFormat::UbrofFormat; } return Abi::BinaryFormat::UnknownFormat; @@ -237,11 +243,8 @@ static QString buildDisplayName(Abi::Architecture arch, Core::Id language, IarToolChain::IarToolChain() : ToolChain(Constants::IAREW_TOOLCHAIN_TYPEID) -{ } - -QString IarToolChain::typeDisplayName() const { - return Internal::IarToolChainFactory::tr("IAREW"); + setTypeDisplayName(Internal::IarToolChainFactory::tr("IAREW")); } void IarToolChain::setTargetAbi(const Abi &abi) @@ -300,11 +303,12 @@ Utils::LanguageExtensions IarToolChain::languageExtensions(const QStringList &) WarningFlags IarToolChain::warningFlags(const QStringList &cxxflags) const { - Q_UNUSED(cxxflags); + Q_UNUSED(cxxflags) return WarningFlags::Default; } -ToolChain::BuiltInHeaderPathsRunner IarToolChain::createBuiltInHeaderPathsRunner() const +ToolChain::BuiltInHeaderPathsRunner IarToolChain::createBuiltInHeaderPathsRunner( + const Environment &) const { Environment env = Environment::systemEnvironment(); addToEnvironment(env); @@ -328,9 +332,10 @@ ToolChain::BuiltInHeaderPathsRunner IarToolChain::createBuiltInHeaderPathsRunner } HeaderPaths IarToolChain::builtInHeaderPaths(const QStringList &cxxFlags, - const FilePath &fileName) const + const FilePath &fileName, + const Environment &env) const { - return createBuiltInHeaderPathsRunner()(cxxFlags, fileName.toString(), ""); + return createBuiltInHeaderPathsRunner(env)(cxxFlags, fileName.toString(), ""); } void IarToolChain::addToEnvironment(Environment &env) const @@ -430,6 +435,8 @@ QList<ToolChain *> IarToolChainFactory::autoDetect(const QList<ToolChain *> &alr {{"EWARM"}, {"\\arm\\bin\\iccarm.exe"}}, {{"EWAVR"}, {"\\avr\\bin\\iccavr.exe"}}, {{"EW8051"}, {"\\8051\\bin\\icc8051.exe"}}, + {{"EWSTM8"}, {"\\stm8\\bin\\iccstm8.exe"}}, + {{"EW430"}, {"\\430\\bin\\icc430.exe"}}, }; QSettings registry(kRegistryNode, QSettings::NativeFormat); @@ -447,7 +454,7 @@ QList<ToolChain *> IarToolChainFactory::autoDetect(const QList<ToolChain *> &alr if (!compilerPath.isEmpty()) { // Build full compiler path. compilerPath += entry.subExePath; - const FileName fn = FileName::fromString(compilerPath); + const FilePath fn = FilePath::fromString(compilerPath); if (compilerExists(fn)) { // Note: threeLevelKey is a guessed toolchain version. candidates.push_back({fn, threeLevelKey}); diff --git a/src/plugins/baremetal/iarewtoolchain.h b/src/plugins/baremetal/iarewtoolchain.h index 019c9e7185..0ad3dd6ddc 100644 --- a/src/plugins/baremetal/iarewtoolchain.h +++ b/src/plugins/baremetal/iarewtoolchain.h @@ -52,8 +52,6 @@ class IarToolChain final : public ProjectExplorer::ToolChain Q_DECLARE_TR_FUNCTIONS(IarToolChain) public: - QString typeDisplayName() const final; - void setTargetAbi(const ProjectExplorer::Abi &abi); ProjectExplorer::Abi targetAbi() const final; @@ -65,9 +63,10 @@ public: Utils::LanguageExtensions languageExtensions(const QStringList &cxxflags) const final; ProjectExplorer::WarningFlags warningFlags(const QStringList &cxxflags) const final; - BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner() const final; + BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner(const Utils::Environment &) const final; ProjectExplorer::HeaderPaths builtInHeaderPaths(const QStringList &cxxFlags, - const Utils::FilePath &) const final; + const Utils::FilePath &, + const Utils::Environment &env) const final; void addToEnvironment(Utils::Environment &env) const final; ProjectExplorer::IOutputParser *outputParser() const final; diff --git a/src/plugins/baremetal/keiltoolchain.cpp b/src/plugins/baremetal/keiltoolchain.cpp index 303efa3440..eb6afe8e0e 100644 --- a/src/plugins/baremetal/keiltoolchain.cpp +++ b/src/plugins/baremetal/keiltoolchain.cpp @@ -102,13 +102,12 @@ static Macros dumpC51PredefinedMacros(const FilePath &compiler, const QStringLis cpp.setEnvironment(env); cpp.setTimeoutS(10); - QStringList arguments; - arguments.push_back(fakeIn.fileName()); + const CommandLine cmd(compiler, {fakeIn.fileName()}); - const SynchronousProcessResponse response = cpp.runBlocking(compiler.toString(), arguments); + const SynchronousProcessResponse response = cpp.runBlocking(cmd); if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) { - qWarning() << response.exitMessage(compiler.toString(), 10); + qWarning() << response.exitMessage(cmd.toUserOutput(), 10); return {}; } @@ -131,11 +130,9 @@ static Macros dumpArmPredefinedMacros(const FilePath &compiler, const QStringLis cpp.setEnvironment(env); cpp.setTimeoutS(10); - QStringList arguments; - arguments.push_back("-E"); - arguments.push_back("--list-macros"); + const CommandLine cmd(compiler, {"-E", "--list-macros"}); - const SynchronousProcessResponse response = cpp.runBlocking(compiler.toString(), arguments); + const SynchronousProcessResponse response = cpp.runBlocking(cmd); if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) { qWarning() << response.exitMessage(compiler.toString(), 10); @@ -241,11 +238,8 @@ static QString buildDisplayName(Abi::Architecture arch, Core::Id language, KeilToolchain::KeilToolchain() : ToolChain(Constants::KEIL_TOOLCHAIN_TYPEID) -{ } - -QString KeilToolchain::typeDisplayName() const { - return Internal::KeilToolchainFactory::tr("KEIL"); + setTypeDisplayName(Internal::KeilToolchainFactory::tr("KEIL")); } void KeilToolchain::setTargetAbi(const Abi &abi) @@ -300,11 +294,12 @@ Utils::LanguageExtensions KeilToolchain::languageExtensions(const QStringList &) WarningFlags KeilToolchain::warningFlags(const QStringList &cxxflags) const { - Q_UNUSED(cxxflags); + Q_UNUSED(cxxflags) return WarningFlags::Default; } -ToolChain::BuiltInHeaderPathsRunner KeilToolchain::createBuiltInHeaderPathsRunner() const +ToolChain::BuiltInHeaderPathsRunner KeilToolchain::createBuiltInHeaderPathsRunner( + const Environment &) const { const Utils::FilePath compilerCommand = m_compilerCommand; @@ -323,9 +318,10 @@ ToolChain::BuiltInHeaderPathsRunner KeilToolchain::createBuiltInHeaderPathsRunne } HeaderPaths KeilToolchain::builtInHeaderPaths(const QStringList &cxxFlags, - const FilePath &fileName) const + const FilePath &fileName, + const Environment &env) const { - return createBuiltInHeaderPathsRunner()(cxxFlags, fileName.toString(), ""); + return createBuiltInHeaderPathsRunner(env)(cxxFlags, fileName.toString(), ""); } void KeilToolchain::addToEnvironment(Environment &env) const diff --git a/src/plugins/baremetal/keiltoolchain.h b/src/plugins/baremetal/keiltoolchain.h index 5ccf9e05ff..b3ea5717b6 100644 --- a/src/plugins/baremetal/keiltoolchain.h +++ b/src/plugins/baremetal/keiltoolchain.h @@ -52,8 +52,6 @@ class KeilToolchain final : public ProjectExplorer::ToolChain Q_DECLARE_TR_FUNCTIONS(KeilToolchain) public: - QString typeDisplayName() const final; - void setTargetAbi(const ProjectExplorer::Abi &abi); ProjectExplorer::Abi targetAbi() const final; @@ -65,9 +63,11 @@ public: Utils::LanguageExtensions languageExtensions(const QStringList &cxxflags) const final; ProjectExplorer::WarningFlags warningFlags(const QStringList &cxxflags) const final; - BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner() const final; + BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner( + const Utils::Environment &) const final; ProjectExplorer::HeaderPaths builtInHeaderPaths(const QStringList &cxxFlags, - const Utils::FilePath &) const final; + const Utils::FilePath &, + const Utils::Environment &env) const final; void addToEnvironment(Utils::Environment &env) const final; ProjectExplorer::IOutputParser *outputParser() const final; diff --git a/src/plugins/baremetal/openocdgdbserverprovider.cpp b/src/plugins/baremetal/openocdgdbserverprovider.cpp index b7044defe0..04b1b88cc5 100644 --- a/src/plugins/baremetal/openocdgdbserverprovider.cpp +++ b/src/plugins/baremetal/openocdgdbserverprovider.cpp @@ -46,8 +46,6 @@ using namespace Utils; namespace BareMetal { namespace Internal { -const char hostKeyC[] = "BareMetal.OpenOcdGdbServerProvider.Host"; -const char portKeyC[] = "BareMetal.OpenOcdGdbServerProvider.Port"; const char executableFileKeyC[] = "BareMetal.OpenOcdGdbServerProvider.ExecutableFile"; const char rootScriptsDirKeyC[] = "BareMetal.OpenOcdGdbServerProvider.RootScriptsDir"; const char configurationFileKeyC[] = "BareMetal.OpenOcdGdbServerProvider.ConfigurationPath"; @@ -60,11 +58,11 @@ OpenOcdGdbServerProvider::OpenOcdGdbServerProvider() { setInitCommands(defaultInitCommands()); setResetCommands(defaultResetCommands()); + setDefaultChannel("localhost", 3333); + setSettingsKeyBase("BareMetal.OpenOcdGdbServerProvider"); + setTypeDisplayName(OpenOcdGdbServerProviderFactory::tr("OpenOCD")); } -OpenOcdGdbServerProvider::OpenOcdGdbServerProvider( - const OpenOcdGdbServerProvider &other) = default; - QString OpenOcdGdbServerProvider::defaultInitCommands() { return QLatin1String("set remote hardware-breakpoint-limit 6\n" @@ -79,19 +77,14 @@ QString OpenOcdGdbServerProvider::defaultResetCommands() return QLatin1String("monitor reset halt\n"); } -QString OpenOcdGdbServerProvider::typeDisplayName() const -{ - return OpenOcdGdbServerProviderFactory::tr("OpenOCD"); -} - -QString OpenOcdGdbServerProvider::channel() const +QString OpenOcdGdbServerProvider::channelString() const { switch (startupMode()) { case NoStartup: // fallback case StartupOnNetwork: // Just return as "host:port" form. - return m_host + QLatin1Char(':') + QString::number(m_port); + return GdbServerProvider::channelString(); case StartupOnPipe: { // In the pipe mode need to add quotes to each item of arguments; // otherwise running will be stuck. @@ -112,13 +105,13 @@ QString OpenOcdGdbServerProvider::channel() const CommandLine OpenOcdGdbServerProvider::command() const { - CommandLine cmd{m_executableFile, {}}; + CommandLine cmd{m_executableFile}; cmd.addArg("-c"); if (startupMode() == StartupOnPipe) cmd.addArg("gdb_port pipe"); else - cmd.addArg("gdb_port " + QString::number(m_port)); + cmd.addArg("gdb_port " + QString::number(channel().port())); if (!m_rootScriptsDir.isEmpty()) cmd.addArgs({"-s", m_rootScriptsDir}); @@ -127,7 +120,7 @@ CommandLine OpenOcdGdbServerProvider::command() const cmd.addArgs({"-f", m_configurationFile}); if (!m_additionalArguments.isEmpty()) - cmd.addArgs(m_additionalArguments); + cmd.addArgs(m_additionalArguments, CommandLine::Raw); return cmd; } @@ -145,7 +138,7 @@ bool OpenOcdGdbServerProvider::isValid() const const StartupMode m = startupMode(); if (m == NoStartup || m == StartupOnNetwork) { - if (m_host.isEmpty()) + if (channel().host().isEmpty()) return false; } @@ -165,8 +158,6 @@ GdbServerProvider *OpenOcdGdbServerProvider::clone() const QVariantMap OpenOcdGdbServerProvider::toMap() const { QVariantMap data = GdbServerProvider::toMap(); - data.insert(QLatin1String(hostKeyC), m_host); - data.insert(QLatin1String(portKeyC), m_port); data.insert(QLatin1String(executableFileKeyC), m_executableFile.toVariant()); data.insert(QLatin1String(rootScriptsDirKeyC), m_rootScriptsDir); data.insert(QLatin1String(configurationFileKeyC), m_configurationFile); @@ -179,8 +170,6 @@ bool OpenOcdGdbServerProvider::fromMap(const QVariantMap &data) if (!GdbServerProvider::fromMap(data)) return false; - m_host = data.value(QLatin1String(hostKeyC)).toString(); - m_port = data.value(QLatin1String(portKeyC)).toInt(); m_executableFile = FilePath::fromVariant(data.value(QLatin1String(executableFileKeyC))); m_rootScriptsDir = data.value(QLatin1String(rootScriptsDirKeyC)).toString(); m_configurationFile = data.value(QLatin1String(configurationFileKeyC)).toString(); @@ -194,9 +183,7 @@ bool OpenOcdGdbServerProvider::operator==(const GdbServerProvider &other) const return false; const auto p = static_cast<const OpenOcdGdbServerProvider *>(&other); - return m_host == p->m_host - && m_port == p->m_port - && m_executableFile == p->m_executableFile + return m_executableFile == p->m_executableFile && m_rootScriptsDir == p->m_rootScriptsDir && m_configurationFile == p->m_configurationFile && m_additionalArguments == p->m_additionalArguments; @@ -320,8 +307,7 @@ void OpenOcdGdbServerProviderConfigWidget::applyImpl() const auto p = static_cast<OpenOcdGdbServerProvider *>(provider()); Q_ASSERT(p); - p->m_host = m_hostWidget->host(); - p->m_port = m_hostWidget->port(); + p->setChannel(m_hostWidget->channel()); p->m_executableFile = m_executableFileChooser->fileName(); p->m_rootScriptsDir = m_rootScriptsDirChooser->fileName().toString(); p->m_configurationFile = m_configurationFileChooser->fileName().toString(); @@ -342,8 +328,7 @@ void OpenOcdGdbServerProviderConfigWidget::setFromProvider() const QSignalBlocker blocker(this); startupModeChanged(); - m_hostWidget->setHost(p->m_host); - m_hostWidget->setPort(p->m_port); + m_hostWidget->setChannel(p->channel()); m_executableFileChooser->setFileName(p->m_executableFile); m_rootScriptsDirChooser->setFileName(Utils::FilePath::fromString(p->m_rootScriptsDir)); m_configurationFileChooser->setFileName(Utils::FilePath::fromString(p->m_configurationFile)); diff --git a/src/plugins/baremetal/openocdgdbserverprovider.h b/src/plugins/baremetal/openocdgdbserverprovider.h index 229b12bf61..ceb5329c37 100644 --- a/src/plugins/baremetal/openocdgdbserverprovider.h +++ b/src/plugins/baremetal/openocdgdbserverprovider.h @@ -40,8 +40,6 @@ class OpenOcdGdbServerProviderFactory; class OpenOcdGdbServerProvider final : public GdbServerProvider { public: - QString typeDisplayName() const final; - QVariantMap toMap() const final; bool fromMap(const QVariantMap &data) final; @@ -50,7 +48,7 @@ public: GdbServerProviderConfigWidget *configurationWidget() final; GdbServerProvider *clone() const final; - QString channel() const final; + QString channelString() const final; Utils::CommandLine command() const final; bool canStartupMode(StartupMode mode) const final; @@ -58,13 +56,10 @@ public: private: explicit OpenOcdGdbServerProvider(); - explicit OpenOcdGdbServerProvider(const OpenOcdGdbServerProvider &); static QString defaultInitCommands(); static QString defaultResetCommands(); - QString m_host = QLatin1String("localhost"); - quint16 m_port = 3333; Utils::FilePath m_executableFile = Utils::FilePath::fromString("openocd"); QString m_rootScriptsDir; QString m_configurationFile; diff --git a/src/plugins/baremetal/sdcctoolchain.cpp b/src/plugins/baremetal/sdcctoolchain.cpp index b839a68fe8..199d8ef0aa 100644 --- a/src/plugins/baremetal/sdcctoolchain.cpp +++ b/src/plugins/baremetal/sdcctoolchain.cpp @@ -72,6 +72,8 @@ static QString compilerTargetFlag(const Abi &abi) switch (abi.architecture()) { case Abi::Architecture::Mcs51Architecture: return QString("-mmcs51"); + case Abi::Architecture::Stm8Architecture: + return QString("-mstm8"); default: return {}; } @@ -92,13 +94,9 @@ static Macros dumpPredefinedMacros(const FilePath &compiler, const QStringList & cpp.setEnvironment(env); cpp.setTimeoutS(10); - QStringList arguments; - arguments.push_back(compilerTargetFlag(abi)); - arguments.push_back("-dM"); - arguments.push_back("-E"); - arguments.push_back(fakeIn.fileName()); + const CommandLine cmd(compiler, {compilerTargetFlag(abi), "-dM", "-E", fakeIn.fileName()}); - const SynchronousProcessResponse response = cpp.runBlocking(compiler.toString(), arguments); + const SynchronousProcessResponse response = cpp.runBlocking(cmd); if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) { qWarning() << response.exitMessage(compiler.toString(), 10); @@ -119,11 +117,9 @@ static HeaderPaths dumpHeaderPaths(const FilePath &compiler, const QStringList & cpp.setEnvironment(env); cpp.setTimeoutS(10); - QStringList arguments; - arguments.push_back(compilerTargetFlag(abi)); - arguments.push_back("--print-search-dirs"); + const CommandLine cmd(compiler, {compilerTargetFlag(abi), "--print-search-dirs"}); - const SynchronousProcessResponse response = cpp.runBlocking(compiler.toString(), arguments); + const SynchronousProcessResponse response = cpp.runBlocking(cmd); if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) { qWarning() << response.exitMessage(compiler.toString(), 10); @@ -175,6 +171,8 @@ static Abi::Architecture guessArchitecture(const Macros ¯os) for (const Macro ¯o : macros) { if (macro.key == "__SDCC_mcs51") return Abi::Architecture::Mcs51Architecture; + if (macro.key == "__SDCC_stm8") + return Abi::Architecture::Stm8Architecture; } return Abi::Architecture::UnknownArchitecture; } @@ -218,11 +216,8 @@ static Utils::FilePath compilerPathFromEnvironment(const QString &compilerName) SdccToolChain::SdccToolChain() : ToolChain(Constants::SDCC_TOOLCHAIN_TYPEID) -{ } - -QString SdccToolChain::typeDisplayName() const { - return Internal::SdccToolChainFactory::tr("SDCC"); + setTypeDisplayName(Internal::SdccToolChainFactory::tr("SDCC")); } void SdccToolChain::setTargetAbi(const Abi &abi) @@ -279,38 +274,29 @@ Utils::LanguageExtensions SdccToolChain::languageExtensions(const QStringList &) WarningFlags SdccToolChain::warningFlags(const QStringList &cxxflags) const { - Q_UNUSED(cxxflags); + Q_UNUSED(cxxflags) return WarningFlags::Default; } -ToolChain::BuiltInHeaderPathsRunner SdccToolChain::createBuiltInHeaderPathsRunner() const +ToolChain::BuiltInHeaderPathsRunner SdccToolChain::createBuiltInHeaderPathsRunner( + const Environment &) const { Environment env = Environment::systemEnvironment(); addToEnvironment(env); const Utils::FilePath compilerCommand = m_compilerCommand; - const Core::Id languageId = language(); const Abi abi = m_targetAbi; - HeaderPathsCache headerPaths = headerPathsCache(); - - return [env, compilerCommand, headerPaths, languageId, abi](const QStringList &flags, - const QString &fileName, - const QString &) { - Q_UNUSED(flags) - Q_UNUSED(fileName) - - const HeaderPaths paths = dumpHeaderPaths(compilerCommand, env.toStringList(), abi); - headerPaths->insert({}, paths); - - return paths; + return [env, compilerCommand, abi](const QStringList &, const QString &, const QString &) { + return dumpHeaderPaths(compilerCommand, env.toStringList(), abi); }; } HeaderPaths SdccToolChain::builtInHeaderPaths(const QStringList &cxxFlags, - const FilePath &fileName) const + const FilePath &fileName, + const Environment &env) const { - return createBuiltInHeaderPathsRunner()(cxxFlags, fileName.toString(), ""); + return createBuiltInHeaderPathsRunner(env)(cxxFlags, fileName.toString(), ""); } void SdccToolChain::addToEnvironment(Environment &env) const @@ -461,21 +447,41 @@ QList<ToolChain *> SdccToolChainFactory::autoDetectToolchain( const Candidate &candidate, Core::Id language) const { const auto env = Environment::systemEnvironment(); - const Macros macros = dumpPredefinedMacros(candidate.compilerPath, env.toStringList(), {}); - if (macros.isEmpty()) - return {}; - const Abi abi = guessAbi(macros); - - const auto tc = new SdccToolChain; - tc->setDetection(ToolChain::AutoDetection); - tc->setLanguage(language); - tc->setCompilerCommand(candidate.compilerPath); - tc->setTargetAbi(abi); - tc->setDisplayName(buildDisplayName(abi.architecture(), language, candidate.compilerVersion)); - - const auto languageVersion = ToolChain::languageVersion(language, macros); - tc->predefinedMacrosCache()->insert({}, {macros, languageVersion}); - return {tc}; + + // Table of supported ABI's by SDCC compiler. + const Abi knownAbis[] = { + {Abi::Mcs51Architecture}, + {Abi::Stm8Architecture} + }; + + QList<ToolChain *> tcs; + + // Probe each ABI from the table, because the SDCC compiler + // can be compiled with or without the specified architecture. + for (const auto &knownAbi : knownAbis) { + const Macros macros = dumpPredefinedMacros(candidate.compilerPath, + env.toStringList(), knownAbi); + if (macros.isEmpty()) + continue; + const Abi abi = guessAbi(macros); + if (knownAbi.architecture() != abi.architecture()) + continue; + + const auto tc = new SdccToolChain; + tc->setDetection(ToolChain::AutoDetection); + tc->setLanguage(language); + tc->setCompilerCommand(candidate.compilerPath); + tc->setTargetAbi(abi); + tc->setDisplayName(buildDisplayName(abi.architecture(), language, + candidate.compilerVersion)); + + const auto languageVersion = ToolChain::languageVersion(language, macros); + tc->predefinedMacrosCache()->insert({}, {macros, languageVersion}); + + tcs.push_back(tc); + } + + return tcs; } // SdccToolChainConfigWidget diff --git a/src/plugins/baremetal/sdcctoolchain.h b/src/plugins/baremetal/sdcctoolchain.h index 15ed599524..58fd92e0d5 100644 --- a/src/plugins/baremetal/sdcctoolchain.h +++ b/src/plugins/baremetal/sdcctoolchain.h @@ -52,8 +52,6 @@ class SdccToolChain final : public ProjectExplorer::ToolChain Q_DECLARE_TR_FUNCTIONS(SdccToolChain) public: - QString typeDisplayName() const final; - void setTargetAbi(const ProjectExplorer::Abi &abi); ProjectExplorer::Abi targetAbi() const final; @@ -65,9 +63,11 @@ public: Utils::LanguageExtensions languageExtensions(const QStringList &cxxflags) const final; ProjectExplorer::WarningFlags warningFlags(const QStringList &cxxflags) const final; - BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner() const final; + BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner( + const Utils::Environment &) const final; ProjectExplorer::HeaderPaths builtInHeaderPaths(const QStringList &cxxFlags, - const Utils::FilePath &) const final; + const Utils::FilePath &, + const Utils::Environment &env) const final; void addToEnvironment(Utils::Environment &env) const final; ProjectExplorer::IOutputParser *outputParser() const final; diff --git a/src/plugins/baremetal/stlinkutilgdbserverprovider.cpp b/src/plugins/baremetal/stlinkutilgdbserverprovider.cpp index 552f890c80..35e83322e3 100644 --- a/src/plugins/baremetal/stlinkutilgdbserverprovider.cpp +++ b/src/plugins/baremetal/stlinkutilgdbserverprovider.cpp @@ -47,8 +47,6 @@ using namespace Utils; namespace BareMetal { namespace Internal { -const char hostKeyC[] = "BareMetal.StLinkUtilGdbServerProvider.Host"; -const char portKeyC[] = "BareMetal.StLinkUtilGdbServerProvider.Port"; const char executableFileKeyC[] = "BareMetal.StLinkUtilGdbServerProvider.ExecutableFile"; const char verboseLevelKeyC[] = "BareMetal.StLinkUtilGdbServerProvider.VerboseLevel"; const char extendedModeKeyC[] = "BareMetal.StLinkUtilGdbServerProvider.ExtendedMode"; @@ -62,13 +60,14 @@ StLinkUtilGdbServerProvider::StLinkUtilGdbServerProvider() { setInitCommands(defaultInitCommands()); setResetCommands(defaultResetCommands()); + setDefaultChannel("localhost", 4242); + setSettingsKeyBase("BareMetal.StLinkUtilGdbServerProvider"); + setTypeDisplayName(StLinkUtilGdbServerProviderFactory::tr("ST-LINK Utility")); } StLinkUtilGdbServerProvider::StLinkUtilGdbServerProvider( const StLinkUtilGdbServerProvider &other) : GdbServerProvider(other) - , m_host(other.m_host) - , m_port(other.m_port) , m_executableFile(other.m_executableFile) , m_verboseLevel(0) , m_extendedMode(false) @@ -87,19 +86,14 @@ QString StLinkUtilGdbServerProvider::defaultResetCommands() return {}; } -QString StLinkUtilGdbServerProvider::typeDisplayName() const -{ - return StLinkUtilGdbServerProviderFactory::tr("ST-LINK Utility"); -} - -QString StLinkUtilGdbServerProvider::channel() const +QString StLinkUtilGdbServerProvider::channelString() const { switch (startupMode()) { case NoStartup: // fallback case StartupOnNetwork: // Just return as "host:port" form. - return m_host + QLatin1Char(':') + QString::number(m_port); + return GdbServerProvider::channelString(); case StartupOnPipe: // Unsupported mode return {}; @@ -119,7 +113,7 @@ CommandLine StLinkUtilGdbServerProvider::command() const cmd.addArg("--no-reset"); cmd.addArg("--stlink_version=" + QString::number(m_transport)); - cmd.addArg("--listen_port=" + QString::number(m_port)); + cmd.addArg("--listen_port=" + QString::number(channel().port())); cmd.addArg("--verbose=" + QString::number(m_verboseLevel)); return cmd; @@ -138,7 +132,7 @@ bool StLinkUtilGdbServerProvider::isValid() const const StartupMode m = startupMode(); if (m == NoStartup || m == StartupOnNetwork) { - if (m_host.isEmpty()) + if (channel().host().isEmpty()) return false; } @@ -158,8 +152,6 @@ GdbServerProvider *StLinkUtilGdbServerProvider::clone() const QVariantMap StLinkUtilGdbServerProvider::toMap() const { QVariantMap data = GdbServerProvider::toMap(); - data.insert(QLatin1String(hostKeyC), m_host); - data.insert(QLatin1String(portKeyC), m_port); data.insert(QLatin1String(executableFileKeyC), m_executableFile.toVariant()); data.insert(QLatin1String(verboseLevelKeyC), m_verboseLevel); data.insert(QLatin1String(extendedModeKeyC), m_extendedMode); @@ -173,9 +165,7 @@ bool StLinkUtilGdbServerProvider::fromMap(const QVariantMap &data) if (!GdbServerProvider::fromMap(data)) return false; - m_host = data.value(QLatin1String(hostKeyC)).toString(); - m_port = data.value(QLatin1String(portKeyC)).toInt(); - m_executableFile = FileName::fromVariant(data.value(QLatin1String(executableFileKeyC))); + m_executableFile = FilePath::fromVariant(data.value(QLatin1String(executableFileKeyC))); m_verboseLevel = data.value(QLatin1String(verboseLevelKeyC)).toInt(); m_extendedMode = data.value(QLatin1String(extendedModeKeyC)).toBool(); m_resetBoard = data.value(QLatin1String(resetBoardKeyC)).toBool(); @@ -190,9 +180,7 @@ bool StLinkUtilGdbServerProvider::operator==(const GdbServerProvider &other) con return false; const auto p = static_cast<const StLinkUtilGdbServerProvider *>(&other); - return m_host == p->m_host - && m_port == p->m_port - && m_executableFile == p->m_executableFile + return m_executableFile == p->m_executableFile && m_verboseLevel == p->m_verboseLevel && m_extendedMode == p->m_extendedMode && m_resetBoard == p->m_resetBoard @@ -329,8 +317,7 @@ void StLinkUtilGdbServerProviderConfigWidget::applyImpl() const auto p = static_cast<StLinkUtilGdbServerProvider *>(provider()); Q_ASSERT(p); - p->m_host = m_hostWidget->host(); - p->m_port = m_hostWidget->port(); + p->setChannel(m_hostWidget->channel()); p->m_executableFile = m_executableFileChooser->fileName(); p->m_verboseLevel = m_verboseLevelSpinBox->value(); p->m_extendedMode = m_extendedModeCheckBox->isChecked(); @@ -387,8 +374,7 @@ void StLinkUtilGdbServerProviderConfigWidget::setFromProvider() const QSignalBlocker blocker(this); startupModeChanged(); - m_hostWidget->setHost(p->m_host); - m_hostWidget->setPort(p->m_port); + m_hostWidget->setChannel(p->channel()); m_executableFileChooser->setFileName(p->m_executableFile); m_verboseLevelSpinBox->setValue(p->m_verboseLevel); m_extendedModeCheckBox->setChecked(p->m_extendedMode); diff --git a/src/plugins/baremetal/stlinkutilgdbserverprovider.h b/src/plugins/baremetal/stlinkutilgdbserverprovider.h index 18b75ad405..5416cb5b8b 100644 --- a/src/plugins/baremetal/stlinkutilgdbserverprovider.h +++ b/src/plugins/baremetal/stlinkutilgdbserverprovider.h @@ -45,7 +45,6 @@ class StLinkUtilGdbServerProvider final : public GdbServerProvider { public: enum TransportLayer { ScsiOverUsb = 1, RawUsb = 2 }; - QString typeDisplayName() const final; QVariantMap toMap() const final; bool fromMap(const QVariantMap &data) final; @@ -55,7 +54,7 @@ public: GdbServerProviderConfigWidget *configurationWidget() final; GdbServerProvider *clone() const final; - QString channel() const final; + QString channelString() const final; Utils::CommandLine command() const final; bool canStartupMode(StartupMode mode) const final; @@ -68,8 +67,6 @@ private: static QString defaultInitCommands(); static QString defaultResetCommands(); - QString m_host = QLatin1String("localhost"); - quint16 m_port = 4242; Utils::FilePath m_executableFile = Utils::FilePath::fromString("st-util"); int m_verboseLevel = 0; // 0..99 bool m_extendedMode = false; // Listening for connections after disconnect |