From b8cc867ba46395bf144eb5e313ce6f1305706ab4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Mon, 26 Oct 2020 18:24:46 +0200 Subject: [PATCH] Allow dev-platform to provide extra debug configuration using BsePlatform::configure_debug_options API --- platformio/commands/debug/command.py | 50 ++++++++++++++++++---------- platformio/commands/debug/helpers.py | 15 +-------- platformio/platform/base.py | 3 ++ 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/platformio/commands/debug/command.py b/platformio/commands/debug/command.py index fc83405c..2ff96932 100644 --- a/platformio/commands/debug/command.py +++ b/platformio/commands/debug/command.py @@ -24,7 +24,10 @@ import click from platformio import app, exception, fs, proc from platformio.commands.debug import helpers from platformio.commands.debug.exception import DebugInvalidOptionsError +from platformio.commands.platform import platform_install as cmd_platform_install from platformio.package.manager.core import inject_contrib_pysite +from platformio.platform.exception import UnknownPlatform +from platformio.platform.factory import PlatformFactory from platformio.project.config import ProjectConfig from platformio.project.exception import ProjectEnvsNotAvailableError from platformio.project.helpers import is_platformio_project, load_project_ide_data @@ -73,18 +76,29 @@ def cli(ctx, project_dir, project_conf, environment, verbose, interface, __unpro env_options = config.items(env=env_name, as_dict=True) if not set(env_options.keys()) >= set(["platform", "board"]): raise ProjectEnvsNotAvailableError() - debug_options = helpers.validate_debug_options(ctx, env_options) + + try: + platform = PlatformFactory.new(env_options["platform"]) + except UnknownPlatform: + ctx.invoke( + cmd_platform_install, + platforms=[env_options["platform"]], + skip_default_package=True, + ) + platform = PlatformFactory.new(env_options["platform"]) + + debug_options = helpers.configure_initial_debug_options(platform, env_options) assert debug_options if not interface: return helpers.predebug_project(ctx, project_dir, env_name, False, verbose) - configuration = load_project_ide_data(project_dir, env_name) - if not configuration: - raise DebugInvalidOptionsError("Could not load debug configuration") + ide_data = load_project_ide_data(project_dir, env_name) + if not ide_data: + raise DebugInvalidOptionsError("Could not load a build configuration") if "--version" in __unprocessed: - result = proc.exec_command([configuration["gdb_path"], "--version"]) + result = proc.exec_command([ide_data["gdb_path"], "--version"]) if result["returncode"] == 0: return click.echo(result["out"]) raise exception.PlatformioException("\n".join([result["out"], result["err"]])) @@ -99,23 +113,25 @@ def cli(ctx, project_dir, project_conf, environment, verbose, interface, __unpro nl=False, ) - debug_options["load_cmds"] = helpers.configure_esp32_load_cmds( - debug_options, configuration - ) + try: + debug_options = platform.configure_debug_options(debug_options, ide_data) + except NotImplementedError: + # legacy for ESP32 dev-platform <=2.0.0 + debug_options["load_cmds"] = helpers.configure_esp32_load_cmds( + debug_options, ide_data + ) rebuild_prog = False preload = debug_options["load_cmds"] == ["preload"] load_mode = debug_options["load_mode"] if load_mode == "always": - rebuild_prog = preload or not helpers.has_debug_symbols( - configuration["prog_path"] - ) + rebuild_prog = preload or not helpers.has_debug_symbols(ide_data["prog_path"]) elif load_mode == "modified": rebuild_prog = helpers.is_prog_obsolete( - configuration["prog_path"] - ) or not helpers.has_debug_symbols(configuration["prog_path"]) + ide_data["prog_path"] + ) or not helpers.has_debug_symbols(ide_data["prog_path"]) else: - rebuild_prog = not isfile(configuration["prog_path"]) + rebuild_prog = not isfile(ide_data["prog_path"]) if preload or (not rebuild_prog and load_mode != "always"): # don't load firmware through debug server @@ -139,9 +155,9 @@ def cli(ctx, project_dir, project_conf, environment, verbose, interface, __unpro # save SHA sum of newly created prog if load_mode == "modified": - helpers.is_prog_obsolete(configuration["prog_path"]) + helpers.is_prog_obsolete(ide_data["prog_path"]) - if not isfile(configuration["prog_path"]): + if not isfile(ide_data["prog_path"]): raise DebugInvalidOptionsError("Program/firmware is missed") # run debugging client @@ -151,7 +167,7 @@ def cli(ctx, project_dir, project_conf, environment, verbose, interface, __unpro from platformio.commands.debug.process.client import GDBClient, reactor client = GDBClient(project_dir, __unprocessed, debug_options, env_options) - client.spawn(configuration["gdb_path"], configuration["prog_path"]) + client.spawn(ide_data["gdb_path"], ide_data["prog_path"]) signal.signal(signal.SIGINT, lambda *args, **kwargs: None) reactor.run() diff --git a/platformio/commands/debug/helpers.py b/platformio/commands/debug/helpers.py index 445fe57d..62ce4f73 100644 --- a/platformio/commands/debug/helpers.py +++ b/platformio/commands/debug/helpers.py @@ -23,11 +23,8 @@ from os.path import isfile from platformio import fs, util from platformio.commands import PlatformioCLI from platformio.commands.debug.exception import DebugInvalidOptionsError -from platformio.commands.platform import platform_install as cmd_platform_install from platformio.commands.run.command import cli as cmd_run from platformio.compat import is_bytes -from platformio.platform.exception import UnknownPlatform -from platformio.platform.factory import PlatformFactory from platformio.project.config import ProjectConfig from platformio.project.options import ProjectOptions @@ -89,21 +86,11 @@ def predebug_project(ctx, project_dir, env_name, preload, verbose): time.sleep(5) -def validate_debug_options(cmd_ctx, env_options): +def configure_initial_debug_options(platform, env_options): def _cleanup_cmds(items): items = ProjectConfig.parse_multi_values(items) return ["$LOAD_CMDS" if item == "$LOAD_CMD" else item for item in items] - try: - platform = PlatformFactory.new(env_options["platform"]) - except UnknownPlatform: - cmd_ctx.invoke( - cmd_platform_install, - platforms=[env_options["platform"]], - skip_default_package=True, - ) - platform = PlatformFactory.new(env_options["platform"]) - board_config = platform.board_config(env_options["board"]) tool_name = board_config.get_debug_tool_name(env_options.get("debug_tool")) tool_settings = board_config.get("debug", {}).get("tools", {}).get(tool_name, {}) diff --git a/platformio/platform/base.py b/platformio/platform/base.py index b214da5f..81d9b085 100644 --- a/platformio/platform/base.py +++ b/platformio/platform/base.py @@ -203,6 +203,9 @@ class PlatformBase( # pylint: disable=too-many-instance-attributes,too-many-pub elif "nobuild" in targets and opts.get("type") != "framework": self.packages[name]["optional"] = True + def configure_debug_options(self, initial_debug_options, ide_data): + raise NotImplementedError + def get_lib_storages(self): storages = {} for opts in (self.frameworks or {}).values():