from argparse import ArgumentParser, Namespace from ...App import Scope from ...lib.log import DEBUG, log from .Cmd import Cmd, Parent # TODO: seems at least partly redundant to CmdPkgRequires / print_pkg_relations class CmdRequiredOsPkg(Cmd): # export def __init__(self, parent: Parent) -> None: super().__init__( parent, 'required-os-pkg', help = 'List distribution packages required for a package', ) def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) parser.add_argument('flavours', help = 'Dependency flavours', default = 'build') parser.add_argument('modules', nargs = '*', help = 'Modules') parser.add_argument( '--skip-excluded', action = 'store_true', default = False, help = 'Output empty prerequisite list for excluded modules', ) parser.add_argument( '--quote', action = 'store_true', default = False, help = 'Put double quotes around each listed dependency', ) async def _run(self, args: Namespace) -> None: modules = args.modules flavours = set(args.flavours.split(',')) if 'build' in flavours: # TODO: This adds too much. Only the run dependencies of the build # dependencies would be needed. flavours.add('run') if 'release' in flavours: flavours |= set(['run', 'devel', 'build']) log(DEBUG, 'flavours = ' + args.flavours) deps = self.app.get_project_refs( modules, ['pkg.requires.jw'], list(flavours), scope = Scope.Subtree, add_self = True, names_only = True, ) if args.skip_excluded: for d in deps: if self.app.is_excluded_from_build(d) is not None: deps.remove(d) subsecs = self.app.distro.os_cascade log(DEBUG, 'subsecs = ', subsecs) requires: set[str] = set() for sec in subsecs: for flavour in flavours: vals = self.app.get_values(deps, ['pkg.requires.' + sec], [flavour]) if vals: requires |= set(vals) if args.quote: out = [f'"{dep}"' for dep in requires] # TODO: add all not in build tree as -devel print(' '.join(out))