projects: Make the build order and package list deterministic #119

Merged
Jan Lindemann merged 2 commits from jan/feature/20260922-deterministic-output into master 2026-09-22 09:17:55 +02:00 AGit
2 changed files with 6 additions and 4 deletions

View file

@ -162,15 +162,16 @@ class CmdBuild(Cmd): # export
log(DEBUG, f'--- Adding dependency tree of module "{m}"')
add_dep_tree(m, dep_flavours, dep_tree, all_deps)
while len(all_deps):
# Find any leaf
for d in all_deps:
# Find any leaf, deterministically: sorted, so that the
# order is reproducible across runs
for d in sorted(all_deps):
# Dependency d doesn't have dependencies itself
if not len(dep_tree[d]):
break # found
else: # no Leaf found
raise Exception(
'Fatal: Dependencies between these modules are unresolvable: '
', '.join(all_deps)
', '.join(sorted(all_deps))
)
order.append(d) # do it
# bookkeep it

View file

@ -66,6 +66,7 @@ class CmdRequiredOsPkg(Cmd): # export
vals = self.app.get_values(deps, ['pkg.requires.' + sec], [flavour])
if vals:
requires |= set(vals)
out = [f'"{dep}"' for dep in requires] if args.quote else requires
out = sorted(requires)
out = [f'"{dep}"' for dep in out] if args.quote else out
# TODO: add all not in build tree as -devel
print(' '.join(out))