Skip to content

Building and Testing

This page is for building AmiPilot from source and running its on-target conformance check — not needed if you're just using the released AmiInspect binary (see Installation).

Cross-building

The Amiga build uses the Bebbo m68k-amigaos-gcc cross-toolchain.

make docker   # cross-compiles build/AmiInspect and the conformance
              # fixtures inside a pinned Docker image -- no local
              # toolchain needed

Or, with a local m68k-amigaos-gcc on PATH:

make amiga      # AmiInspect only
make fixtures   # + the conformance fixtures (gadtools-app, classact-app,
                # second-screen-app, wbapp)
make server     # + AmiPilotServer itself, and the internal
                # AmiClickTest/AmiSetMouse test helpers

Building and testing the host Python package

The wire client, host object API, and pytest plugin live under host/ as a real, installable package:

pip install -e 'host/[test]'   # editable install, with test extras
make test-host                 # = pip install -e 'host/[test]' + pytest host/tests

test-host runs entirely against a scripted transport (no emulator needed) — it's testing the wire framing, the TREE/MENU/SCREENS/ file-API parsers, the object API's exception mapping, and the pytest plugin's own boot/skip logic. Installing editable first matters: it's what makes amipilot.pytest_plugin register via its real pytest11 entry point, the same way a real consumer of the package sees it, rather than being force-loaded.

On-target testing under Copperline

AmiPilot's conformance check runs the actual compiled binaries and fixture applications under the Copperline Amiga emulator — not Amiberry; Copperline's headless, deterministic --control protocol is a much better fit for scripted, repeatable verification than driving an interactive emulator's GUI by hand.

make test-target

This is a whole suite (tests/copperline/run.sh), not just the original AmiInspect classification check: AmiInspect structural walking against both fixtures and a real stock Prefs editor (WBPattern), the action engine (CLICK/TYPE/DRAG), the ARexx port and manifest locators, the wire protocol over both serial and TCP, LAUNCH/WBLAUNCH, SCREENSHOT, the MUI-ARexx bridge, the file API, MENU/MENUPICK, SCREENS, WINDOWMOVE/WINDOWSIZE, the checked-in golden-tree fixture regression check, and (if the host package is installed) the phase 0.3 pytest release-gate scenario itself. It's proven to actually catch a regression, not just written to look like it does: a real crash bug (a gadget-type bitmask check that misidentified plain GadTools gadgets as BOOPSI objects) was deliberately reintroduced during 0.1 development, and this check caught it before being reverted — and a second, genuine deadlock bug (found live against AmigaOS 3.2's own WBPattern, GitHub issue #36) is now a permanent regression check (run_wbpattern_check) too.

Needs tests/copperline/copperline.local.toml (gitignored — a machine-specific Kickstart ROM + Workbench install path; see tests/copperline/copperline.example.toml and that directory's own README for setup). Skips cleanly, not a false pass, when that file is absent — which is why public CI's test-target run is currently a no-op: there's no redistributable AmigaOS 3.x Workbench + ReAction image this project can ship for CI to use yet. This is tracked as real, outstanding follow-up work, not treated as done.

Building the docs

The user documentation you're reading is built with MkDocs Material from userdocs/:

pip install -r tools/docs-requirements.txt
mkdocs serve   # live preview at http://127.0.0.1:8000
mkdocs build   # static site into site/

An AmigaGuide version (for reading on-Amiga in MultiView) is generated from the same userdocs/ source:

make guide     # -> build/amipilot.guide

Building the release archive

make dist   # -> build/dist/amipilot.lha, build/dist/amipilot.readme

Builds AmiInspect, AmiPilotServer, the guide, and packages them with LICENSE and amipilot.readme into the same amipilot.lha this project's releases ship — including building a real lha archiver from source first (Homebrew's and most Linux distros' lha is Lhasa, extract-only, useless for packaging), pinned to a known-good commit. Override with your own archiver: make dist LHA=/path/to/real/lha.

Linting

make lint   # semgrep --config auto over the C sources