Emit a build list and stack diff#

Goal: alongside stack.lock.json, get an install-ordered build list for a build pipeline and a markdown diff you can paste straight into a pull request.

Add the two flags to solve#

stack solve accepts --build-list-out and --stack-diff-out. They are independent: pass either, both, or neither.

eb-stack stack solve \
  --easyconfigs fixtures/gromacs_2025_to_next/easyconfigs \
  --policy fixtures/gromacs_2025_to_next/policies/prefer_newer.json \
  --baseline-easyconfigs fixtures/gromacs_2025_to_next/easyconfigs \
  --lock-out stack.lock.json \
  --sbom-out stack.cdx.json \
  --build-list-out build.list \
  --stack-diff-out stack.diff.md

--stack-diff-out requires --baseline-easyconfigs or the solve fails with an explicit error instead of skipping the diff without a warning.

Read the build list#

cat build.list

One easyconfig path per line, dependencies before the packages that need them (a topological sort over the co-selected stack, ties broken by package name for a deterministic order):

fixtures/.../foss-2025b/OpenBLAS-0.3.27-foss-2025b.eb
fixtures/.../foss-2025b/OpenMPI-4.1.6-foss-2025b.eb
fixtures/.../foss-2025b/FFTW-3.3.10-foss-2025b.eb
fixtures/.../foss-2025b/GROMACS-2025.0-foss-2025b.eb

Feed this straight into a sequential build pipeline: xargs -n1 eb build, a Jenkins matrix step, or a plain shell loop.

Read the stack diff#

Every co-selected package is classified against the baseline lock as unchanged, added, removed, or version-bumped:

# Stack diff

Baseline (`foss-2025a`) -> solved (`foss-2025b`).

## Summary

- **unchanged**: 1
- **added**: 0
- **removed**: 0
- **version-bumped**: 3

## Packages

### FFTW -- unchanged

- Baseline: `3.3.10` -- `.../FFTW-3.3.10-foss-2025a.eb`
- Solved: `3.3.10` -- `.../FFTW-3.3.10-foss-2025b.eb`

### GROMACS -- version-bumped

- Baseline: `2024.1` -- `.../GROMACS-2024.1-foss-2025a.eb`
- Solved: `2025.0` -- `.../GROMACS-2025.0-foss-2025b.eb`
- Change: `2024.1` -> `2025.0`

Paste the file body directly into a pull request description; every line names a real version and a real easyconfig path, not an internal solver identifier.

Next steps#