SHELL := /bin/bash .SHELLFLAGS := -eu -o pipefail -c .DEFAULT_GOAL := help .NOTPARALLEL: .PHONY: console-vm cartridge-test data-test desktop-test .PHONY: help bootstrap smoke-test check dasung dasung-test rootfs rootfs-test init-test vm tooling tooling-test kernel initramfs system-card boot-volume boot-test console-test performance-test help: @printf '%s\n' 'FDS/OS — static Rust tools and native s6' \ 'make workstation Build native Linux software/cartridge and QEMU command-line tools' \ 'make workstation-test Verify software builds, multi-partition images and file write/readback' \ 'make emulator-test Boot FDS and test cartridge hotplug with the public emulator' \ 'make bootstrap Prepare Arch x86_64 host and Void build container' \ 'make packages Build and export every FDS base package' \ 'make all Build CLI, development, recovery, Pi boot and complete internal images' \ 'make smoke-test Cross-build and verify GNU hello + static-musl Rust' \ 'make check Run validation failure-path tests and formatting checks' \ 'make kernel Cross-build the pinned Raspberry Pi 5 kernel' \ 'make initramfs Build early Rust userspace in four archive formats' \ 'make system-card PROFILE=cli Make GPT/EROFS from the exported rootfs' \ 'make boot-volume BOOT_MODE=production Make a Pi FAT32 boot partition' \ 'make boot-test Test stage0, media insertion, recovery and all archive formats' \ 'make desktop-test Verify ARM WindowMaker, PROGRAM and on-demand DHCP' \ 'make media-image-test Check SYSTEM/DATA/ENVIRONMENT creation and legacy PROGRAM compatibility' \ 'make media-test Verify confirmed writes to disposable virtual USB media' \ 'make eeprom EEPROM_PROFILE=production Prepare a reversible EEPROM preview' \ 'make eeprom-test Verify EEPROM configuration and rollback without hardware' \ 'make stress-test Verify twelve USB devices and media I/O failure paths' \ 'make media-fault-test Verify write/flush/readback errors and interrupted writes' \ 'make power-test Verify ordered ARM shutdown, DATA safety and blocked failure paths' \ 'make data-test Verify writable DATA and sustained-write safe eject' \ 'make cartridge-test Verify virtual USB bays, metadata, mounts and eject' \ 'make console-test Verify the FDS user prompt and boot-event reporting' \ 'make console-vm Open the ordinary-user FDS console in an ARM VM' \ 'make performance-test Compare z/2/3 stage0 builds in the ARM VM' \ 'make tooling Build the static ARM FDS CLI and stage0 tools' \ 'make tooling-test Test shared contracts and execute the ARM tools' \ 'make dasung Build static ARM dasungd, XBPS package and s6 database' \ 'make dasung-test Test the daemon with simulated hardware and inspect its package' \ 'make rootfs PROFILE=cli Assemble, configure and test the ARM base filesystem' \ 'make recovery Build the independent recovery rootfs and EROFS payload' \ 'make recovery-test Verify SYSTEM-independent recovery and DATA repair in ARM VMs' \ 'make internal-image Assemble FDS_BOOT, FDS_RECOVERY and machine settings as one GPT disk' \ 'make internal-test Verify virtual NVMe settings, persistence and rejection paths' \ 'make development-test Compile, execute and debug C/C++/Rust in the development SYSTEM' \ 'make clock-test Verify that native startup preserves a newer guest clock' \ 'make signing Build the host release signer and static ARM verifier' \ 'make signing-test Check signatures, corruption rejection and OpenSSL interoperability' \ 'make release-contract-test Check frozen-lock and complete-build comparison rejection paths' \ 'make rootfs-test Verify the exported archive and rejection checks' \ 'make init-test Boot an ARM VM and verify s6 PID 1 and service control' \ 'make vm Open a temporary root shell in the verified test VM' bootstrap: @mkdir -p out/logs ./tools/bootstrap-host 2>&1 | tee out/logs/bootstrap.log .PHONY: packages all packages: @mkdir -p out/logs ./tools/build-base-packages 2>&1 | tee out/logs/packages-build.log all: $(MAKE) bootstrap $(MAKE) packages $(MAKE) rootfs PROFILE=cli $(MAKE) system-card PROFILE=cli $(MAKE) rootfs PROFILE=development $(MAKE) system-card PROFILE=development $(MAKE) recovery $(MAKE) initramfs $(MAKE) boot-volume BOOT_MODE=production $(MAKE) internal-image $(MAKE) signing $(MAKE) eeprom EEPROM_PROFILE=production smoke-test: @mkdir -p out/logs ./tools/smoke-test 2>&1 | tee out/logs/smoke-test.log check: ./tests/integration/m0-checks cargo fmt --all -- --check dasung: @mkdir -p out/logs ./tools/build-dasungd 2>&1 | tee out/logs/dasung-build.log dasung-test: @mkdir -p out/logs ./tests/integration/dasung-checks 2>&1 | tee out/logs/dasung-checks.log rootfs: @mkdir -p out/logs PROFILE=$(or $(PROFILE),cli) ./tools/build-rootfs 2>&1 | tee out/logs/rootfs-build.log rootfs-test: @mkdir -p out/logs ./tests/integration/m1-checks 2>&1 | tee out/logs/rootfs-checks.log init-test: @mkdir -p out/logs ./tests/integration/m2-checks 2>&1 | tee out/logs/init-checks.log vm: ./tools/run-vm out/m2-vm-latest --shell tooling: @mkdir -p out/logs ./tools/build-fds 2>&1 | tee out/logs/fds-tools-build.log tooling-test: @mkdir -p out/logs ./tests/integration/m3-checks 2>&1 | tee out/logs/fds-tools-checks.log kernel: @mkdir -p out/logs ./tools/build-kernel 2>&1 | tee out/logs/kernel-build.log initramfs: tooling dasung ./image/build-initramfs 2>&1 | tee out/logs/initramfs-build.log system-card: ./tools/prepare-image-tools ./image/build-system-cartridge --profile $(or $(PROFILE),cli) --rootfs out/rootfs-$(or $(PROFILE),cli).tar 2>&1 | tee out/logs/system-card-build.log boot-volume: ./image/build-boot-volume --mode $(or $(BOOT_MODE),production) 2>&1 | tee out/logs/boot-volume-build.log boot-test: ./tests/integration/m4-checks 2>&1 | tee out/logs/boot-checks.log console-test: python3 tests/integration/m5-runtime.py 2>&1 | tee out/logs/console-checks.log console-vm: ./tools/run-system-vm performance-test: ./tools/compare-rust-profiles 2>&1 | tee out/logs/performance-checks.log cartridge-test: cargo test --locked --offline --target x86_64-unknown-linux-gnu -p fds-common -p fds-cartridged ./tools/cargo-build --locked --offline --release --target aarch64-unknown-linux-musl -p fds-test-helpers --bin m6-client cp target/aarch64-unknown-linux-musl/release/m6-client out/m6-client python3 tests/integration/m6-runtime.py 2>&1 | tee out/logs/cartridge-checks.log data-test: ./tools/cargo-build --locked --offline --release --target aarch64-unknown-linux-musl -p fds-test-helpers --bin m7-writer cp target/aarch64-unknown-linux-musl/release/m7-writer out/m7-writer python3 tests/integration/m7-runtime.py 2>&1 | tee out/logs/data-checks.log desktop-test: python3 tests/integration/m8-runtime.py 2>&1 | tee out/logs/desktop-checks.log .PHONY: media-image-test media-test media-image-test: tooling python3 tests/integration/m9-images.py 2>&1 | tee out/logs/media-image-checks.log media-test: tooling python3 tests/integration/m9-runtime.py 2>&1 | tee out/logs/media-checks.log python3 tests/integration/m9-system.py 2>&1 | tee out/logs/media-system-checks.log .PHONY: power-test power-test: ./tools/cargo-build --locked --offline --release --target aarch64-unknown-linux-musl -p fds-test-helpers --bin m7-writer cp target/aarch64-unknown-linux-musl/release/m7-writer out/m7-writer python3 tests/integration/m10-runtime.py 2>&1 | tee out/logs/power-checks.log .PHONY: stress-test media-fault-test stress-test: @mkdir -p out/logs ./tools/cargo-build --locked --offline --release --target aarch64-unknown-linux-musl -p fds-test-helpers --bin m11-stress cp target/aarch64-unknown-linux-musl/release/m11-stress out/m11-stress ./tools/cargo-build --locked --offline --release --target aarch64-unknown-linux-musl -p fds-test-helpers --bin m7-writer cp target/aarch64-unknown-linux-musl/release/m7-writer out/m7-writer python3 tests/integration/m11-runtime.py 2>&1 | tee out/logs/stress-checks.log $(MAKE) media-fault-test media-fault-test: @mkdir -p out/logs python3 tests/integration/m11-media-faults.py 2>&1 | tee out/logs/media-fault-checks.log .PHONY: eeprom eeprom-test eeprom: ./tools/configure-pi-eeprom --profile $(or $(EEPROM_PROFILE),production) eeprom-test: @mkdir -p out/logs python3 tests/integration/m12-eeprom.py 2>&1 | tee out/logs/eeprom-checks.log .PHONY: recovery recovery-test recovery: $(MAKE) rootfs PROFILE=recovery ./tools/prepare-image-tools ./image/build-recovery 2>&1 | tee out/logs/recovery-build.log recovery-test: python3 tests/integration/m12-recovery.py 2>&1 | tee out/logs/recovery-checks.log .PHONY: internal-image internal-test internal-image: ./image/build-internal $(if $(MACHINE_CONFIG),--machine-config "$(MACHINE_CONFIG)") 2>&1 | tee out/logs/internal-build.log internal-test: python3 tests/integration/m12-internal.py 2>&1 | tee out/logs/internal-checks.log .PHONY: development-test clock-test development-test: python3 tests/integration/m12-development.py 2>&1 | tee out/logs/development-checks.log clock-test: python3 tests/integration/m12-clock.py 2>&1 | tee out/logs/clock-checks.log .PHONY: signing signing-test signing: @mkdir -p out/logs ./tools/cargo-build --locked --offline --release --target x86_64-unknown-linux-gnu -p fds-release ./tools/cargo-build --locked --offline --release --target aarch64-unknown-linux-musl -p fds-release ./tools/verify-elf target/aarch64-unknown-linux-musl/release/fds-release aarch64 static signing-test: signing cargo test --locked --offline --target x86_64-unknown-linux-gnu -p fds-release python3 tests/integration/m12-signing.py 2>&1 | tee out/logs/signing-checks.log .PHONY: release-contract-test release-contract-test: @mkdir -p out/logs python3 tests/integration/m12-release-build.py 2>&1 | tee out/logs/release-contract-checks.log .PHONY: workstation workstation-test emulator-test workstation: @mkdir -p out/logs ./tools/build-workstation 2>&1 | tee out/logs/workstation-build.log workstation-test: workstation cargo test --locked --offline --target $$(rustc -vV | sed -n 's/^host: //p') -p fds-common -p fds-burn -p fds-software -p fds-workstation python3 tests/integration/workstation-images.py --cli out/workstation/fds-cartridge --image-tool-runner tools/in-image-tools --cc "$(CURDIR)/tools/in-void" aarch64-linux-gnu-gcc 2>&1 | tee out/logs/workstation-images.log emulator-test: workstation python3 tests/integration/workstation-emulator.py --cli out/workstation/fds-emulator --qemu-runner tools/in-void 2>&1 | tee out/logs/workstation-emulator.log