zephyr/scripts/west_commands/runners/misc.py
Martí Bolívar f8e8e9229d runners: enforce RunnerCaps via create() indirection
Require all implementations to provide a do_create(), a new
ZephyrBinaryRunner abstract class method, and make create() itself
concrete.

This allows us to enforce common conventions related to individual
runner capabilities as each runner provides to the core via
RunnerCaps.

For now, just enforce that:

- common options related to capabilities are always added, so runners
  can't reuse them for different ends

- common options provided for runners which don't support them emit
  sensible error messages that should be easy to diagnose and support

Signed-off-by: Martí Bolívar <marti.bolivar@nordicsemi.no>
2020-06-25 12:14:25 +02:00

52 lines
1.7 KiB
Python

# Copyright (c) 2019, Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0
'''Catch-all module for miscellaneous devices which can't use a
generic or widely used tool like J-Link, OpenOCD, etc.
Please use this sparingly and only when your setup is exotic and
you're willing to handle requests for help. E.g. if your "board" is a
core on a special-purpose SoC which requires a complicated script to
network boot.'''
from runners.core import ZephyrBinaryRunner, RunnerCaps
import argparse
class MiscFlasher(ZephyrBinaryRunner):
'''Runner for handling special purpose flashing commands.'''
def __init__(self, cfg, cmd, args):
super().__init__(cfg)
if not cmd:
# This is a board definition error, not a user error,
# so we can do it now and not in do_run().
raise ValueError('no command was given')
self.cmd = cmd
self.args = args
@classmethod
def name(cls):
return 'misc-flasher'
@classmethod
def capabilities(cls):
return RunnerCaps(commands={'flash'})
@classmethod
def do_add_parser(cls, parser):
parser.add_argument('cmd',
help='''command to run; it will be passed the
build directory as its first argument''')
parser.add_argument('args', nargs=argparse.REMAINDER,
help='''additional arguments to pass after the build
directory''')
@classmethod
def do_create(cls, cfg, args):
return MiscFlasher(cfg, args.cmd, args.args)
def do_run(self, *args, **kwargs):
self.require(self.cmd)
self.check_call([self.cmd, self.cfg.build_dir] + self.args)