96 lines
3.2 KiB
Python
96 lines
3.2 KiB
Python
# Copyright (c) 2019 Nordic Semiconductor ASA
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import argparse
|
|
import collections
|
|
import os
|
|
import re
|
|
import textwrap
|
|
|
|
from west import log
|
|
from west.commands import WestCommand
|
|
from zcmake import run_cmake
|
|
|
|
class Boards(WestCommand):
|
|
|
|
def __init__(self):
|
|
super().__init__(
|
|
'boards',
|
|
# Keep this in sync with the string in west-commands.yml.
|
|
'display information about supported boards',
|
|
'Display information about boards',
|
|
accepts_unknown_args=False)
|
|
|
|
def do_add_parser(self, parser_adder):
|
|
default_fmt = '{name}'
|
|
parser = parser_adder.add_parser(
|
|
self.name,
|
|
help=self.help,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
description=self.description,
|
|
epilog=textwrap.dedent('''\
|
|
FORMAT STRINGS
|
|
|
|
Boards are listed using a Python 3 format string. Arguments
|
|
to the format string are accessed by name.
|
|
|
|
The default format string is:
|
|
|
|
"{}"
|
|
|
|
The following arguments are available:
|
|
|
|
- name: board name
|
|
- arch: board architecture
|
|
'''.format(default_fmt)))
|
|
|
|
# Remember to update scripts/west-completion.bash if you add or remove
|
|
# flags
|
|
parser.add_argument('-f', '--format', default=default_fmt,
|
|
help='''Format string to use to list each board;
|
|
see FORMAT STRINGS below.''')
|
|
|
|
return parser
|
|
|
|
def do_run(self, args, unknown_args):
|
|
zb = os.environ.get('ZEPHYR_BASE')
|
|
if not zb:
|
|
log.die('Internal error: ZEPHYR_BASE not set in the environment, '
|
|
'and should have been by the main script')
|
|
|
|
cmake_args = ['-DBOARD_ROOT_SPACE_SEPARATED={}'.format(zb),
|
|
'-P', '{}/cmake/boards.cmake'.format(zb)]
|
|
lines = run_cmake(cmake_args, capture_output=True)
|
|
arch_re = re.compile(r'\s*([\w-]+)\:')
|
|
board_re = re.compile(r'\s*([\w-]+)\s*')
|
|
arch = None
|
|
boards = collections.OrderedDict()
|
|
for line in lines:
|
|
match = arch_re.match(line)
|
|
if match:
|
|
arch = match.group(1)
|
|
boards[arch] = []
|
|
continue
|
|
match = board_re.match(line)
|
|
if match:
|
|
if not arch:
|
|
log.die('Invalid board output from CMake: {}'.
|
|
format(lines))
|
|
board = match.group(1)
|
|
boards[arch].append(board)
|
|
|
|
for arch in boards:
|
|
for board in boards[arch]:
|
|
try:
|
|
result = args.format.format(
|
|
name=board,
|
|
arch=arch)
|
|
print(result)
|
|
except KeyError as e:
|
|
# The raised KeyError seems to just put the first
|
|
# invalid argument in the args tuple, regardless of
|
|
# how many unrecognizable keys there were.
|
|
log.die('unknown key "{}" in format string "{}"'.
|
|
format(e.args[0], args.format))
|