From a269631e920729e3c78e6410150fa6f753cece44 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Sun, 6 Sep 2026 17:19:06 +0200 Subject: [PATCH] CmdBuild.run_make(): Skip projects without buildable dir The iteration order contains every project the dependency walk resolved, including projects that are only installed as -devel packages below /opt. Running the target in such a project ran make in a read-only, source-less directory and failed the run. Resolve each module against the workspace root only, and skip the target with a notice when there is no buildable project directory. Factor the skip notice into log_skip() so the platform-exclusion path shares it. Signed-off-by: Jan Lindemann Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v0.84.2 --- src/python/jw/pkg/cmds/projects/CmdBuild.py | 25 ++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/python/jw/pkg/cmds/projects/CmdBuild.py b/src/python/jw/pkg/cmds/projects/CmdBuild.py index 3972bda5..6677e71b 100644 --- a/src/python/jw/pkg/cmds/projects/CmdBuild.py +++ b/src/python/jw/pkg/cmds/projects/CmdBuild.py @@ -94,6 +94,14 @@ class CmdBuild(Cmd): # export @override async def _run(self, args: Namespace) -> None: + @lru_cache(maxsize = None) + def proj_dir(module: str) -> str | None: + return self.app.find_dir( + module, + pretty = False, + projs_roots = [self.app.projs_root], + ) + @lru_cache(maxsize = None) def read_deps(cur: str, dep_flavour: str) -> list[str]: # dep cache doesn't make a difference at all @@ -172,20 +180,27 @@ class CmdBuild(Cmd): # export dep_tree[k].remove(d) return 1 + def log_skip(module: str, msg: str) -> None: + title = f'---- {module}' + log(NOTICE, f',{title} >') + log(NOTICE, f'| {msg}<') + log(NOTICE, f'`{title} <') + async def run_make( module: str, target: str, cur_project: int, num_projects: int ) -> None: patt = self.app.is_excluded_from_build(module) if patt is not None: - title = f'---- {module}' - log(NOTICE, f',{title} >') - log(NOTICE, f'| Configured to skip build on platform >{patt}<') - log(NOTICE, f'`{title} <') + log_skip(module, f'Configured to skip build on platform >{patt}<') + return + + wd = proj_dir(module) + if wd is None: + log_skip(module, 'Skipping: No buildable project directory') return make_cmd = ['make', target] - wd = self.app.find_dir(module, pretty = False) title = '---- [%d/%d]: Running "%s" in %s -' % ( cur_project, num_projects,