| #!/usr/bin/env python3 |
| |
| # Copyright (c) 2024 Vestas Wind Systems A/S |
| # Copyright (c) 2020 Nordic Semiconductor ASA |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| import argparse |
| from dataclasses import dataclass |
| from pathlib import Path |
| |
| # |
| # This is shared code between the build system's 'shields' target |
| # and the 'west shields' extension command. If you change it, make |
| # sure to test both ways it can be used. |
| # |
| # (It's done this way to keep west optional, making it possible to run |
| # 'ninja shields' in a build directory without west installed.) |
| # |
| |
| @dataclass(frozen=True) |
| class Shield: |
| name: str |
| dir: Path |
| |
| def shield_key(shield): |
| return shield.name |
| |
| def find_shields(args): |
| ret = [] |
| |
| for root in args.board_roots: |
| for shields in find_shields_in(root): |
| ret.append(shields) |
| |
| return sorted(ret, key=shield_key) |
| |
| def find_shields_in(root): |
| shields = root / 'boards' / 'shields' |
| ret = [] |
| |
| for maybe_shield in (shields).iterdir(): |
| if not maybe_shield.is_dir(): |
| continue |
| for maybe_kconfig in maybe_shield.iterdir(): |
| if maybe_kconfig.name == 'Kconfig.shield': |
| for maybe_overlay in maybe_shield.iterdir(): |
| file_name = maybe_overlay.name |
| if file_name.endswith('.overlay'): |
| shield_name = file_name[:-len('.overlay')] |
| ret.append(Shield(shield_name, maybe_shield)) |
| |
| return sorted(ret, key=shield_key) |
| |
| def parse_args(): |
| parser = argparse.ArgumentParser(allow_abbrev=False) |
| add_args(parser) |
| return parser.parse_args() |
| |
| def add_args(parser): |
| # Remember to update west-completion.bash if you add or remove |
| # flags |
| parser.add_argument("--board-root", dest='board_roots', default=[], |
| type=Path, action='append', |
| help='add a board root, may be given more than once') |
| |
| def dump_shields(shields): |
| for shield in shields: |
| print(f' {shield.name}') |
| |
| if __name__ == '__main__': |
| dump_shields(find_shields(parse_args())) |