Skip to content

Build System

VyomaOS uses a Docker-based build system to ensure fully reproducible builds across any development machine.

make kernel → out/bzImage (2.3 MB)
make supervisor → supervisor binary (697 KB, static musl)
make apps → 200+ .wasm binaries (1-10 KB each)
make rootfs → out/initramfs.cpio.gz (18 MB compressed)
make run → QEMU boot

All compilation happens inside a Docker container:

  • Base image: Ubuntu 22.04
  • Kernel build deps: gcc, make, bc, flex, bison
  • Rust toolchain: Stable, with x86_64-unknown-linux-musl and wasm32-wasip2 targets
  • Verified binaries: Wasmtime 43.0.0 and BusyBox 1.35.0 (SHA-256 checked)

Build the Docker image:

Terminal window
make image
TargetDescription
make buildFull build: kernel + supervisor + apps + rootfs + disk
make kernelCompile Linux 5.10 kernel (allnoconfig)
make supervisorCompile Rust supervisor for musl
make appsCompile all WASM apps (incremental)
make rootfsPackage initramfs from all artifacts
make runBoot headless in QEMU
make run-guiBoot with virtio-gpu display
make run-netBoot with virtio-net networking
make run-gui-netDisplay + networking
make shellOpen bash inside builder container
make cleanRemove out/ directory
make clean-imageRemove Docker builder image

Per-app stamp files (out/.apps/<name>.stamp) ensure only changed apps recompile:

Terminal window
# Only the touched app recompiles
touch apps/snake/src/main.rs
make apps
ArtifactPathSize
Linux kernelout/bzImage2.3 MB
Initramfsout/initramfs.cpio.gz18 MB
Data diskout/disk.img64 MB (ext4, created once)
Supervisorsupervisor/target/.../supervisor697 KB
WASM appsapps/*/target/.../release/*.wasm1-10 KB each
Terminal window
# Full CI suite
make test
# Unit tests only (cargo test in Docker)
make unit-test
# Manifest validation
make check-manifests
# Headless QEMU smoke test (30s timeout)
make smoke

make smoke boots QEMU headless, waits for [lifecycle] all apps spawned on serial output, then exits. Pass/fail is printed as SMOKE: PASS or SMOKE: FAIL: <reason>.

Unit tests live in supervisor/tests/ and cover manifest parsing, IPC routing, process lifecycle, display commands, font rendering, input handling, mouse events, watchdog, and window management.

Terminal window
cd supervisor
cargo build --target x86_64-unknown-linux-musl --release
cd ..
make rootfs && make run
Terminal window
cd apps/my-app
cargo build --target wasm32-wasip2 --release
cd ../..
make rootfs && make run
Terminal window
make shell # Opens bash in the Docker container