Skip to content

Manifest Format

A manifest is a TOML file describing one complete Amiga setup: a base OS, a machine, a set of packages, and what to emit. One manifest = one setup; a test matrix is a directory of manifests.

TOML is deliberate: it has no implicit typing, so version = "5.20" can never silently become the float 5.2. Every version value in a manifest or recipe is a string, always.

# manifests/os32-p96-amissl.toml
base     = "os3.2.2"
machine  = { cpu = "68030", fpu = true, mmu = true, ram = "fast:8M", rtg = true }
packages = [
  "picasso96-3 >= 3.2",
  "amissl = 5.20",
  "classact = 3.3",
]
output   = ["hdf", "dir"]
emit     = ["copperline", "amiberry"]

This is the full authoritative reference: docs/manifest.md in the repository — the exact schema the codebase itself is tested against. This page is a task-oriented walkthrough of the same ground.

base

Names a base recipe — aros68k, wb1.3, os3.1.4, os3.2.2 (see the Recipe Library for what each needs). A base with its own options (e.g. wb1.3's boot choice between a full Workbench desktop and a minimal CLI-only Startup-Sequence) takes a table instead of a bare string:

base = { name = "wb1.3", boot = "cli" }

A base always resolves to the newest version it declares — there's no version = on a base entry the way there is on a package.

machine

An optional table asserting hardware floors/features; the resolver validates every package's [requires] against it.

machine = { cpu = "68030", fpu = true, mmu = true, ram = "fast:8M", rtg = true, chipset = "aga" }
Key Type Notes
cpu string 68000 .. 68060
fpu bool Independent axis — an EC030 is cpu = "68030", fpu = false
mmu bool Independent axis — required by Enforcer/MuForce-style setups
ram string <kind>:<size>, kind ∈ chip/fast/slow/z3; comma-separated for several: "chip:2M,fast:8M"
rtg bool RTG board present
chipset string ocs, ecs, aga

Omitting machine entirely means no hardware constraints are asserted — fine for a base-only smoke build, not for anything that needs a specific CPU floor or RTG board.

packages

Each entry is either a plain constraint string or a table (for a package with options to answer):

packages = [
  "amissl = 5.20",                       # exact version
  "picasso96-3 >= 3.2",                  # constraint: =, >=, <=, >, <
  "mui >= 3.8, < 4.0",                   # conjunction
  { name = "picasso96-3", version = ">= 3.2", card = "uaegfx" },  # + option answers
]

Package names are lower-case slugs (amissl, picasso96-3, bsdsocket-emulation). Version strings are dotted decimal (3.2.2.1, 5.20, 2.9a) compared as real Amiga versions, never as floats — 5.20 is greater than 5.3.

output

Which build artifact formats to write. Default ["hdf"].

Value What it is
hdf A bootable RDB/partitioned hard-disk image.
dir A plain host directory tree (with .uaem sidecars for Amiga metadata a host filesystem can't represent).
tgz A deterministic tarball.
zip A deterministic zip.

emit

Which emulator configs to write alongside the build, once [verify] passes. Default: none.

emit = ["copperline", "amiberry"]   # also: "winuae"

Needs a dir entry in output and a Kickstart ROM at assets/roms/kickstart-{the base's kickstart-version}.rom — see Emulator Configs for the full picture, including what a recipe can itself contribute to an emitted config (the bsdsocket-emulation and picasso96-3 recipes both do).

providers

Resolves ambiguity when more than one installed package could satisfy the same capability (e.g. two different bsdsocket providers):

providers = { bsdsocket = "roadshow" }

Validation: lint time vs. resolve time

amibake lint checks shape, types, known keys, and constraint syntax — purely local to the manifest file, no recipe library needed to be consistent. amibake resolve (and build, which calls it internally) does the cross-document checks: do the named packages actually exist, does their [requires] accept this base and machine, is every capability provided exactly once. Resolve-time errors always name the package, the requirement that failed, and the remedy — never a bare stack trace.

Where to go next