CmdBuild.run(): Build projects that only have a Makefile
All checks were successful
CI / Packaging - Kali Linux (pull_request) Successful in 5m31s
CI / Packaging - OpenSUSE Tumbleweed (pull_request) Successful in 4m42s
CI / Packaging test (pull_request) Successful in 0s
CI / Packaging - Kali Linux (push) Successful in 5m7s
CI / Packaging - OpenSUSE Tumbleweed (push) Successful in 4m25s
CI / Packaging test (push) Successful in 0s

A workspace project directory that has a Makefile but no package proofs -
no project.conf, no VERSION - is buildable with a plain make, yet the build
fails on it: calculate_order() walks the requested modules, and the walk in
App.__get_project_refs() raises an unmet dependency, because the
installation state of such a project is unprovable.  The walk has to stay
strict: its proofs are package proofs, and loosening App.is_installed()
would weaken the unmet dependency detection for every get_project_refs()
caller.

This commit therefore keeps the tolerance in the build: before calculating
the order, run() partitions the requested modules. A module that is not
installed in any flavour but resolves to a workspace directory with a
Makefile is appended to the build order as a dependency-less leaf and built
with a plain make; modules without any directory at all still raise the
unmet dependency error. A jw dependency declared in a project.conf on such
a project still raises, which is correct: it is a declared dependency on a
package that does not exist.

Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v0.85.1
Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-09-19 16:54:09 +02:00
commit 9961d4b5f4
Signed by: Jan Lindemann
GPG key ID: 3750640C9E25DD61

View file

@ -283,7 +283,29 @@ class CmdBuild(Cmd): # export
log(NOTICE, 'Using prerequisite flavours ' + ' '.join(dep_flavours))
log(NOTICE, 'Calculating order for modules ... ')
calculate_order(order, modules, dep_flavours)
def is_makefile_only(m: str) -> bool:
# Not installed as a package (no project.conf, no VERSION),
# but a project directory with a Makefile in the workspace:
# buildable with a plain make, no jw dependencies to read.
if self.app.is_installed(m, devel = True) \
or self.app.is_installed(m, devel = False):
return False
try:
wd = proj_dir(m)
except Exception:
return False
return wd is not None and os.path.exists(f'{wd}/Makefile')
makefile_only = {m for m in modules if is_makefile_only(m)}
for m in sorted(makefile_only):
log(
NOTICE,
f'Project {m} is not installed, building it as a plain '
f'Makefile project'
)
calculate_order(order, modules - makefile_only, dep_flavours)
for m in sorted(makefile_only):
order.append(m)
if args.ignore_deps:
order = [m for m in order if m in args.modules]
order = [m for m in order if m not in exclude]