forked from platformio/platformio-core
Allow dev-platform to provide extra debug configuration using BsePlatform::configure_debug_options API
This commit is contained in:
@ -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()
|
||||||
|
@ -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, {})
|
||||||
|
@ -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():
|
||||||
|
Reference in New Issue
Block a user