Add the cross-build sysroot recipe, verified on the device

packaging/make-sysroot.sh populates a minimal Alpine aarch64 rootfs with
apk-tools-static, so a cross build needs no root, no qemu and no phone. Adapted
from imsd's, plus glib-dev for the bus layer that is coming.

Building against a real Alpine sysroot means the binary links dynamically
against the phone's own musl and libc++ -- libc++, libc++abi, libunwind and
libgcc_s are all already on pmOS. The harness this daemon replaces had to be
built -static, but only because it was built with the host's glibc toolchain;
that constraint was never about the target.

The pipeline is proven end to end rather than assumed: the cross-built binary
runs on the phone, and all five core suites pass there too -- on the real
hardware, not just under qemu-aarch64. That matters for modules that are almost
entirely little-endian field packing and offset arithmetic.
This commit is contained in:
Jorijn van der Graaf 2026-09-02 17:34:27 +02:00
commit 93692c9505
2 changed files with 67 additions and 2 deletions

View file

@ -56,11 +56,23 @@ crafter-build test # the unit suites
Cross-compiling for the phone:
```sh
packaging/make-sysroot.sh # once; no root, no qemu, no device
crafter-build -- --target=aarch64-alpine-linux-musl \
--sysroot=<alpine-aarch64-sysroot> --march=armv8-a --mtune=generic
crafter-build test --target=aarch64-alpine-linux-musl
--sysroot=~/.cache/fingerprintd/sysroot-aarch64-alpine \
--march=armv8-a --mtune=generic
crafter-build test --target=aarch64-alpine-linux-musl --sysroot=... \
--march=armv8-a --mtune=generic # runs the suites under qemu-aarch64
```
The result links dynamically against the phone's own musl and libc++
(`libc++`, `libc++abi`, `libunwind`, `libgcc_s`, all already present on pmOS).
The research harness this replaces had to be built `-static`, but only because
it was built with the host's glibc toolchain — that constraint does not apply
to a real Alpine sysroot.
Verified on the device: all five suites pass cross-built and run **on the phone
itself**, not only under emulation.
## Status
**The core is complete; the daemon does not run yet.** Everything was ported