Allow dev-platform to provide extra debug configuration using BsePlatform::configure_debug_options API

This commit is contained in:
Ivan Kravets
2020-10-26 18:24:46 +02:00
parent 7230556d1b
commit b8cc867ba4
3 changed files with 37 additions and 31 deletions

View File

@ -24,7 +24,10 @@ import click
from platformio import app, exception, fs, proc from platformio import app, exception, fs, proc
from platformio.commands.debug import helpers from platformio.commands.debug import helpers
from platformio.commands.debug.exception import DebugInvalidOptionsError 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.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.config import ProjectConfig
from platformio.project.exception import ProjectEnvsNotAvailableError from platformio.project.exception import ProjectEnvsNotAvailableError
from platformio.project.helpers import is_platformio_project, load_project_ide_data 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) env_options = config.items(env=env_name, as_dict=True)
if not set(env_options.keys()) >= set(["platform", "board"]): if not set(env_options.keys()) >= set(["platform", "board"]):
raise ProjectEnvsNotAvailableError() 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 assert debug_options
if not interface: if not interface:
return helpers.predebug_project(ctx, project_dir, env_name, False, verbose) return helpers.predebug_project(ctx, project_dir, env_name, False, verbose)
configuration = load_project_ide_data(project_dir, env_name) ide_data = load_project_ide_data(project_dir, env_name)
if not configuration: if not ide_data:
raise DebugInvalidOptionsError("Could not load debug configuration") raise DebugInvalidOptionsError("Could not load a build configuration")
if "--version" in __unprocessed: 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: if result["returncode"] == 0:
return click.echo(result["out"]) return click.echo(result["out"])
raise exception.PlatformioException("\n".join([result["out"], result["err"]])) 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, nl=False,
) )
debug_options["load_cmds"] = helpers.configure_esp32_load_cmds( try:
debug_options, configuration 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 rebuild_prog = False
preload = debug_options["load_cmds"] == ["preload"] preload = debug_options["load_cmds"] == ["preload"]
load_mode = debug_options["load_mode"] load_mode = debug_options["load_mode"]
if load_mode == "always": if load_mode == "always":
rebuild_prog = preload or not helpers.has_debug_symbols( rebuild_prog = preload or not helpers.has_debug_symbols(ide_data["prog_path"])
configuration["prog_path"]
)
elif load_mode == "modified": elif load_mode == "modified":
rebuild_prog = helpers.is_prog_obsolete( rebuild_prog = helpers.is_prog_obsolete(
configuration["prog_path"] ide_data["prog_path"]
) or not helpers.has_debug_symbols(configuration["prog_path"]) ) or not helpers.has_debug_symbols(ide_data["prog_path"])
else: 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"): if preload or (not rebuild_prog and load_mode != "always"):
# don't load firmware through debug server # 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 # save SHA sum of newly created prog
if load_mode == "modified": 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") raise DebugInvalidOptionsError("Program/firmware is missed")
# run debugging client # 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 from platformio.commands.debug.process.client import GDBClient, reactor
client = GDBClient(project_dir, __unprocessed, debug_options, env_options) 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) signal.signal(signal.SIGINT, lambda *args, **kwargs: None)
reactor.run() reactor.run()

View File

@ -23,11 +23,8 @@ from os.path import isfile
from platformio import fs, util from platformio import fs, util
from platformio.commands import PlatformioCLI from platformio.commands import PlatformioCLI
from platformio.commands.debug.exception import DebugInvalidOptionsError 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.commands.run.command import cli as cmd_run
from platformio.compat import is_bytes 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.config import ProjectConfig
from platformio.project.options import ProjectOptions from platformio.project.options import ProjectOptions
@ -89,21 +86,11 @@ def predebug_project(ctx, project_dir, env_name, preload, verbose):
time.sleep(5) time.sleep(5)
def validate_debug_options(cmd_ctx, env_options): def configure_initial_debug_options(platform, env_options):
def _cleanup_cmds(items): def _cleanup_cmds(items):
items = ProjectConfig.parse_multi_values(items) items = ProjectConfig.parse_multi_values(items)
return ["$LOAD_CMDS" if item == "$LOAD_CMD" else item for item in 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"]) board_config = platform.board_config(env_options["board"])
tool_name = board_config.get_debug_tool_name(env_options.get("debug_tool")) tool_name = board_config.get_debug_tool_name(env_options.get("debug_tool"))
tool_settings = board_config.get("debug", {}).get("tools", {}).get(tool_name, {}) tool_settings = board_config.get("debug", {}).get("tools", {}).get(tool_name, {})

View File

@ -203,6 +203,9 @@ class PlatformBase( # pylint: disable=too-many-instance-attributes,too-many-pub
elif "nobuild" in targets and opts.get("type") != "framework": elif "nobuild" in targets and opts.get("type") != "framework":
self.packages[name]["optional"] = True self.packages[name]["optional"] = True
def configure_debug_options(self, initial_debug_options, ide_data):
raise NotImplementedError
def get_lib_storages(self): def get_lib_storages(self):
storages = {} storages = {}
for opts in (self.frameworks or {}).values(): for opts in (self.frameworks or {}).values():