0.37.1
Improvements
avocado initnow generates the avocado-bsp extension reference using{{ avocado.target.board }}, so projects targeting boards within a shared target (e.g. multiple SoMs on one machine) resolve to the right BSP package. Defaults to the resolved target when no board is set, so existing single-board projects are unaffected.
0.37.0
New features
{{ avocado.target.board }} interpolation
A sibling concept to {{ avocado.target }} for the physical board variant within a target. Resolved (in precedence order) from the env var AVOCADO_TARGET_BOARD, then the top-level config field default_target_board, falling back to the resolved avocado.target value when neither is set:
default_target: imx8mp-evk
default_target_board: imx8mp-evk-rev3
Use it anywhere {{ ... }} templates are evaluated — extension names, source URLs, sparse-checkout paths, and so on:
extensions:
avocado-bsp-{{ avocado.target.board }}:
source:
type: package
version: '*'
Stone include paths composed from runtime + extensions
Extensions can now declare their own stone_include_paths; the runtime's effective list is composed as runtime entries first, then per-extension entries in extensions: [...] array order. Duplicates are deduplicated with the highest-priority occurrence preserved.
Each path is emitted scoped to its origin. Runtime and local/inline extension entries map to /opt/src/<resolved>; remote extensions (package / git / path source) map to the absolute container path /opt/_avocado/<target>/includes/<ext-name>/<path>. This matches the scoping rule the existing overlay: field already follows and lets BSP extensions ship their own carrier-overlay files without consumers hand-wiring runtimes.<n>.stone_include_paths.
Path-source rootfs, initramfs, and kernel
rootfs:, initramfs:, and kernel: can now be sourced from a local project directory:
rootfs:
source:
type: path
path: configs/avocado-os-rootfs
Image-type option for rootfs, initramfs, and kernel
Each section now accepts an image_type option (matching the existing extension pattern) so rootfs / initramfs / kernel images can be wrapped into KABs and signed with the same keyset.
Signed AMF assembly
Runtime AMF assembly gains an option to sign the produced AMF. The signed AMF carries a meta.auth block with the SHA256-RSA signature over the meta-stripped canonical JSON, plus the full leaf-first certificate chain (base64-encoded DER) — the same primitives and keyset used to sign KABs.
Rootfs, initramfs, and kernel metadata in AMF
The runtime assembly manifest now exports per-component metadata for rootfs, initramfs, and kernel — version, image ID, and SHA256 — so downstream tooling can verify each component independently:
{
"manifest_version": 2,
"id": "<uuid>",
"built_at": "...",
"runtime": { "name": "kos-bootloader", "version": "..." },
"rootfs": { "version": "<VERSION_ID>", "image_id": "<uuidv5>", "sha256": "..." },
"initramfs": { "version": "<VERSION_ID>", "image_id": "<uuidv5>", "sha256": "..." },
"kernel": { "version": "<VERSION_ID>", "image_id": "<uuidv5>", "sha256": "..." },
"extensions": [ ... ],
"os_bundle": { ... }
}
Bug fixes
- Full config-tree interpolation now runs before reading extension sources, so
{{ ... }}templates insource.url,source.ref, andsource.sparse_checkoutresolve correctly. Previously only the extension name was interpolated; templates inside the source body were passed verbatim to git, producing empty checkouts. stone_include_pathsfor remote extensions now emit absolute container paths instead of$AVOCADO_PREFIX/...literal strings. Bash does not re-expand variables inside env-var values, so the previous form survived into stone's-iflag and resolved to a non-existent path.- Composed config is now loaded before computing
stone_include_paths, so remote-extension paths defined in the extension's own config are visible (previously only the on-disk consumer view was read). avocado savenow handles long hardlink and symlink targets via GNU/PAX long-name extensions. Projects with built Cargo artifacts in the SDK volume (paths like.../build/<crate>-<hash>/...) no longer hit the 100-byte limit and abort.