From a580b3d1745ffb554bea0774300d925bd33ffc99 Mon Sep 17 00:00:00 2001 From: Carles Cufi Date: Tue, 9 Aug 2022 11:13:54 +0200 Subject: [PATCH] west: Fix handling of modules in the boards command The boards command was not properly using the zephyr_module functionality to obtain the board roots of all modules. Fix that by moving the functionality required to the core zephyr_module file and reuse it from external scripts. Signed-off-by: Carles Cufi --- doc/_extensions/zephyr/kconfig/__init__.py | 4 +- scripts/pylib/twister/twisterlib/testplan.py | 7 +-- scripts/west_commands/boards.py | 2 +- scripts/zephyr_module.py | 50 ++++++++++---------- 4 files changed, 28 insertions(+), 35 deletions(-) diff --git a/doc/_extensions/zephyr/kconfig/__init__.py b/doc/_extensions/zephyr/kconfig/__init__.py index fab8eefe2a2..da435b61576 100644 --- a/doc/_extensions/zephyr/kconfig/__init__.py +++ b/doc/_extensions/zephyr/kconfig/__init__.py @@ -71,9 +71,7 @@ import kconfiglib def kconfig_load(app: Sphinx) -> Tuple[kconfiglib.Kconfig, Dict[str, str]]: """Load Kconfig""" with TemporaryDirectory() as td: - projects = zephyr_module.west_projects() - projects = [p.posixpath for p in projects["projects"]] if projects else None - modules = zephyr_module.parse_modules(ZEPHYR_BASE, projects) + modules = zephyr_module.parse_modules(ZEPHYR_BASE) # generate Kconfig.modules file kconfig = "" diff --git a/scripts/pylib/twister/twisterlib/testplan.py b/scripts/pylib/twister/twisterlib/testplan.py index 83f87166236..117312f5dc6 100755 --- a/scripts/pylib/twister/twisterlib/testplan.py +++ b/scripts/pylib/twister/twisterlib/testplan.py @@ -30,7 +30,7 @@ from twisterlib.config_parser import TwisterConfigParser from twisterlib.testinstance import TestInstance -from zephyr_module import west_projects, parse_modules +from zephyr_module import parse_modules ZEPHYR_BASE = os.getenv("ZEPHYR_BASE") if not ZEPHYR_BASE: @@ -226,10 +226,7 @@ class TestPlan: def handle_modules(self): # get all enabled west projects - west_proj = west_projects() - modules_meta = parse_modules(ZEPHYR_BASE, - [p.posixpath for p in west_proj['projects']] - if west_proj else None, None) + modules_meta = parse_modules(ZEPHYR_BASE) self.modules = [module.meta.get('name') for module in modules_meta] diff --git a/scripts/west_commands/boards.py b/scripts/west_commands/boards.py index 8d492e5b34f..b3d53da4f2a 100644 --- a/scripts/west_commands/boards.py +++ b/scripts/west_commands/boards.py @@ -73,7 +73,7 @@ class Boards(WestCommand): modules_board_roots = [] - for module in zephyr_module.parse_modules(ZEPHYR_BASE): + for module in zephyr_module.parse_modules(ZEPHYR_BASE, self.manifest): board_root = module.meta.get('build', {}).get('settings', {}).get('board_root') if board_root is not None: modules_board_roots.append(Path(module.project) / board_root) diff --git a/scripts/zephyr_module.py b/scripts/zephyr_module.py index 59679a6ea8c..4033f652a0f 100755 --- a/scripts/zephyr_module.py +++ b/scripts/zephyr_module.py @@ -247,7 +247,7 @@ def process_twister(module, meta): return out -def process_meta(zephyr_base, west_projects, modules, extra_modules=None, +def process_meta(zephyr_base, west_projs, modules, extra_modules=None, propagate_state=False): # Process zephyr_base, projects, and modules and create a dictionary # with meta information for each input. @@ -299,16 +299,16 @@ def process_meta(zephyr_base, west_projects, modules, extra_modules=None, meta['workspace'] = {} workspace_dirty |= zephyr_dirty - if west_projects is not None: + if west_projs is not None: from west.manifest import MANIFEST_REV_BRANCH - projects = west_projects['projects'] + projects = west_projs['projects'] meta_projects = [] # Special treatment of manifest project. - manifest_path = PurePath(projects[0].posixpath).as_posix() - manifest_revision, manifest_dirty = git_revision(manifest_path) + manifest_proj_path = PurePath(projects[0].posixpath).as_posix() + manifest_revision, manifest_dirty = git_revision(manifest_proj_path) workspace_dirty |= manifest_dirty - manifest_project = {'path': manifest_path, + manifest_project = {'path': manifest_proj_path, 'revision': manifest_revision} meta_projects.append(manifest_project) @@ -323,7 +323,7 @@ def process_meta(zephyr_base, west_projects, modules, extra_modules=None, 'revision': revision} meta_projects.append(meta_project) - meta.update({'west': {'manifest': west_projects['manifest'], + meta.update({'west': {'manifest': west_projs['manifest_path'], 'projects': meta_projects}}) meta['workspace'].update({'off': workspace_off}) @@ -350,7 +350,7 @@ def process_meta(zephyr_base, west_projects, modules, extra_modules=None, zephyr_revision += '-off' zephyr_project.update({'revision': zephyr_revision}) - if west_projects is not None: + if west_projs is not None: if workspace_dirty and not manifest_dirty: manifest_revision += '-dirty' if workspace_extra: @@ -362,8 +362,8 @@ def process_meta(zephyr_base, west_projects, modules, extra_modules=None, return meta -def west_projects(): - manifest_file = None +def west_projects(manifest = None): + manifest_path = None projects = [] # West is imported here, as it is optional # (and thus maybe not installed) @@ -378,14 +378,15 @@ def west_projects(): from packaging import version try: - manifest = Manifest.from_file() + if not manifest: + manifest = Manifest.from_file() if version.parse(WestVersion) >= version.parse('0.9.0'): projects = [p for p in manifest.get_projects([]) if manifest.is_active(p)] else: projects = manifest.get_projects([]) - manifest_file = manifest.path - return {'manifest': manifest_file, 'projects': projects} + manifest_path = manifest.path + return {'manifest_path': manifest_path, 'projects': projects} except WestNotFound: # Only accept WestNotFound, meaning we are not in a west # workspace. Such setup is allowed, as west may be installed @@ -394,9 +395,13 @@ def west_projects(): return None -def parse_modules(zephyr_base, modules=None, extra_modules=None): +def parse_modules(zephyr_base, manifest=None, west_projs=None, modules=None, + extra_modules=None): + if modules is None: - modules = [] + west_projs = west_projs or west_projects(manifest) + modules = ([p.posixpath for p in west_projs['projects']] + if west_projs else []) if extra_modules is None: extra_modules = [] @@ -498,16 +503,9 @@ def main(): settings = "" twister = "" - west_proj = None - if args.modules is None: - west_proj = west_projects() - modules = parse_modules(args.zephyr_base, - [p.posixpath for p in west_proj['projects']] - if west_proj else None, - args.extra_modules) - else: - modules = parse_modules(args.zephyr_base, args.modules, - args.extra_modules) + west_projs = west_projects() + modules = parse_modules(args.zephyr_base, None, west_projs, + args.modules, args.extra_modules) for module in modules: kconfig += process_kconfig(module.project, module.meta) @@ -542,7 +540,7 @@ def main(): fp.write(twister) if args.meta_out: - meta = process_meta(args.zephyr_base, west_proj, modules, + meta = process_meta(args.zephyr_base, west_projs, modules, args.extra_modules, args.meta_state_propagate) with open(args.meta_out, 'w', encoding="utf-8") as fp: