diff --git a/src/python/jw/pkg/cmds/projects/CmdBuild.py b/src/python/jw/pkg/cmds/projects/CmdBuild.py index 3a29b899..e92a5b22 100644 --- a/src/python/jw/pkg/cmds/projects/CmdBuild.py +++ b/src/python/jw/pkg/cmds/projects/CmdBuild.py @@ -62,6 +62,14 @@ class CmdBuild(Cmd): # export 'comma or space separated' ) ) + parser.add_argument( + '--pkg-relations', + default = 'requires', + help = ( + 'Relations between packages to take into consideration for build, ' + 'comma or space separated' + ) + ) parser.add_argument( '--env-reinit', action = 'store_true', @@ -103,7 +111,11 @@ class CmdBuild(Cmd): # export ) @lru_cache(maxsize = None) - def read_deps(cur: str, dep_flavour: str) -> list[str]: + def read_deps( + cur: str, + dep_flavour: str, + relations: tuple[str, ...], + ) -> Iterable[str]: # dep cache doesn't make a difference at all if dep_flavour in dep_cache: if cur in dep_cache[dep_flavour]: @@ -113,13 +125,13 @@ class CmdBuild(Cmd): # export ret = self.app.get_project_refs( [cur], - ['pkg.requires.jw'], + [f'pkg.{rel}.jw' for rel in relations], dep_flavour, scope = Scope.Subtree, add_self = False, names_only = True, ) - log(DEBUG, f'Prerequisites: {" ".join(ret)}') + log(DEBUG, f'Prerequisites ({"/".join(relations)}): {" ".join(ret)}') if cur in ret: ret.remove(cur) @@ -134,6 +146,7 @@ class CmdBuild(Cmd): # export def add_dep_tree( cur: str, dep_flavours: Iterable[str], + relations: tuple[str, ...], tree: DepNode, all_deps: set[str], ) -> int: @@ -145,9 +158,9 @@ class CmdBuild(Cmd): # export all_deps.add(cur) for t in dep_flavours: log(DEBUG, f'Checking deps of type "{t}"') - deps.update(read_deps(cur, t)) + deps.update(read_deps(cur, t, relations)) for d in deps: - add_dep_tree(d, dep_flavours, tree, all_deps) + add_dep_tree(d, dep_flavours, relations, tree, all_deps) tree[cur] = deps return len(deps) @@ -158,9 +171,10 @@ class CmdBuild(Cmd): # export ) -> int: all_deps: set[str] = set() dep_tree: DepNode = {} + relations = tuple(re.split(r'[,\s]+', args.pkg_relations)) for m in modules: log(DEBUG, f'--- Adding dependency tree of module "{m}"') - add_dep_tree(m, dep_flavours, dep_tree, all_deps) + add_dep_tree(m, dep_flavours, relations, dep_tree, all_deps) while len(all_deps): # Find any leaf, deterministically: sorted, so that the # order is reproducible across runs diff --git a/test/integration/jw-pkg/help/test-expected.txt b/test/integration/jw-pkg/help/test-expected.txt index 8560a11c..c7b895c9 100644 --- a/test/integration/jw-pkg/help/test-expected.txt +++ b/test/integration/jw-pkg/help/test-expected.txt @@ -256,7 +256,8 @@ Available subcommands of projects: tmpl-dir Print directory containing templates of a given module ============= Running: jw-pkg.py -t ../../../.. --log-level info projects build --help usage: jw-pkg.py projects build [-h] [--exclude EXCLUDE] [-n] [-O] [-I] - [--dep-flavours DEP_FLAVOURS] [--env-reinit] + [--dep-flavours DEP_FLAVOURS] + [--pkg-relations PKG_RELATIONS] [--env-reinit] [--env-keep ENV_KEEP] target modules [modules ...] @@ -279,6 +280,10 @@ options: --dep-flavours DEP_FLAVOURS Dependency flavours to take into consideration for build, comma or space separated (default: auto) + --pkg-relations PKG_RELATIONS + Relations between packages to take into consideration + for build, comma or space separated (default: + requires) --env-reinit Source /etc/profile before each build step. Discard environment unless --env-keep is specified (default: False)