eb-stack
package plan · Resolvo · EasyBuild campaign
Parse conda-forge, Spack, and EasyBuild into one canonical manifest and planned SBOM; solve product profiles with Resolvo; emit conventional recipes; build-evaluate them on a declarative target.
recipe → manifest + SBOM → profiles + Resolvo → .eb set → campaign evidence
eb-stack¶
- Author:
Important
New here? → Tutorial: foreign recipe to verified EasyBuild package
Whole annual rebuild? → Run an annual toolchain-generation bump
New package from conda-forge/Spack? → Author a new package from conda-forge or Spack
Site Python extras on EESSI? → Site Python extras on EESSI
Site R extras on EESSI? → Site R extras on EESSI
Existing recipe bump? → Bump an existing EasyBuild recipe
CLI surface? → Command-line reference
Bundle schemas? → Package bundle reference
Build targets? → Build target configuration
Campaign findings? → Campaign state and typed findings
Repair a failed campaign? → Repair a failed campaign
Plan conda-forge eOn, inspect its lock/recipe, and drive a target campaign.
Generate canonical bump bundles, solve the stack, and repair typed findings.
Co-select a generation with resolvo; emit lock and build list.
Frozen real-recipe regressions, empirical claims, and limitations.
Manifest, planned SBOM, profile locks, residuals, and variant recipes.
Layered routing, container isolation, persisted findings, and repairs.
Getting Started
How-To Guides
- Run an annual toolchain-generation bump
- Author a new package from conda-forge or Spack
- Site Python extras on EESSI
- Site R extras on EESSI
- Repair a failed campaign
- Solve a consistent stack lock
- Emit a build list and stack diff
- Bump an existing EasyBuild recipe
- Declare root priority for multi-root optimization
Reference
Explanation
Project
What it is¶
Independent claim ladder: planning establishes only resolves; campaigns own builds and binary-verified.¶
eb-stack parses conda-forge, Spack, and EasyBuild recipes into one
canonical package plan. It emits a planned CycloneDX SBOM, materializes
independently installable profiles, applies distribution/site preferences
inside Resolvo, writes one lock and conventional .eb file per profile,
and drives the resulting bundle through a persisted target-routed build
campaign. Existing-recipe bumps use the same manifest, SBOM, solver, and
campaign artifacts as new packages.
What it is not¶
Not an EasyBuild replacement.
eb-stackrouteseb --robotthrough a configured target; EasyBuild still implements all build and install steps.Not a general-purpose Python dependency resolver. The domain model is EasyBuild’s
name/version/toolchain/dependenciesshape only.Not a post-install compliance scanner. The emitted SBOM is a planned inventory. Binary verification is a separate campaign claim.
Install¶
No public release is published. Build from source with Rust 1.88 or newer:
git clone https://github.com/HaoZeke/eb-stack.git
cd eb-stack
cargo test --locked
cargo build --locked --release
# binary: target/release/eb-stack
install -Dm755 target/release/eb-stack ~/.local/bin/eb-stack
Verify:
eb-stack --version
Inspect from a fresh clone¶
The bundled conda-forge eOn recipe and public profile make the parser and artifact boundary runnable without EasyBuild or an external robot tree:
eb-stack package inspect \
--source fixtures/foreign_ingest/conda_eon/recipe.yaml \
--format conda-forge \
--toolchain-name foss \
--toolchain-version 2026.1 \
--package-config examples/packages/common.toml \
--package-config examples/packages/eon.toml \
--out-dir /tmp/eon-inspect
python3 -m json.tool /tmp/eon-inspect/package.plan.json >/dev/null
python3 -m json.tool /tmp/eon-inspect/package.sbom.cdx.json >/dev/null
The two files are the canonical build manifest and planned CycloneDX SBOM. Inspection does not solve dependencies, emit recipes, or establish a build claim; those stages need an EasyBuild robot tree and configured target.
Documentation map¶
Tutorial: foreign recipe to verified EasyBuild package – start here.
How to run the annual toolchain-generation bump – operator guide for a whole rebuild (what it closes, the residual, the claim ladder, and the CI-known bumps).
Author a new package from conda-forge or Spack – canonical plan + profiles + Resolvo + campaign.
How-to guides: site Python extras, site R extras, solve a stack lock, repair a failed campaign, emit a build list and stack diff, bump a recipe, declare root priority.
Reference: CLI, package bundles, build targets, campaign state and findings, policy JSON schema, and whole-stack output formats.
Explanation: architecture, the optimization model, the parser approach, reproduction fidelity and limitations, from recipe to installed stack.
Project: contributing, changelog.
Citation¶
For unreleased source, cite the repository revision you used. The CITATION.cff file provides structured author and project metadata.
Rohit Goswami, eb-stack (source revision <commit>), https://github.com/HaoZeke/eb-stack
License¶
MIT. See LICENSE in the repository.
Build these docs¶
cd eb-stack
pixi run -e docs docbld
# HTML -> docs/build/index.html
Org sources live under docs/orgmode/; Emacs ox-rst publishes to
docs/source/; Sphinx + Shibuya builds the site.