.PHONY: check fmt clippy test kani build all image run ci kernel-fmt kernel-clippy kernel-test

RISCV_TARGET = riscv64gc-unknown-none-elf
KERNEL_BIN = target/$(RISCV_TARGET)/release/adapter-riscv

KERNEL_CRATES = -p types -p domain -p kernel -p platform

all: check fmt clippy test

# Gate for kernel work: formatting, lints, unit tests, Kani proofs, RISC-V build.
ci: kernel-fmt kernel-clippy kernel-test kani build

kernel-fmt:
	cargo fmt $(KERNEL_CRATES) -p adapter-riscv -- --check

kernel-clippy:
	cargo clippy $(KERNEL_CRATES) --all-targets -- -D warnings
	cargo clippy -p adapter-riscv --target $(RISCV_TARGET) --no-deps -- -D warnings

kernel-test:
	cargo test $(KERNEL_CRATES)

check:
	cargo check --workspace

fmt:
	cargo fmt --all -- --check

clippy:
	cargo clippy --workspace -- -D warnings

test:
	cargo test --workspace

# CBMC can eat all RAM and take the desktop down with it; cap each run.
KANI = systemd-run --user --scope -q -p MemoryMax=12G -p MemorySwapMax=0 cargo kani

kani-types:
	$(KANI) -p types

kani-domain:
	$(KANI) -p domain

kani-kernel:
	$(KANI) -p kernel

kani: kani-types kani-domain kani-kernel

build:
	cargo build --target $(RISCV_TARGET) --release \
		-p adapter-riscv -p init -p echo -p snake \
		-p display-qemu -p input-qemu -p storage-qemu \
		-p log-server -p permission-manager -p session-server

image: build
	scripts/make-disk-image.sh

run: build
	qemu-system-riscv64 -machine virt -nographic -bios default \
		-kernel $(KERNEL_BIN)

run-disk: image
	qemu-system-riscv64 -machine virt -nographic -bios default \
		-kernel $(KERNEL_BIN) \
		-drive file=boot.img,if=none,format=raw,id=hd0 \
		-device virtio-blk-device,drive=hd0

run-gui: image
	qemu-system-riscv64 -machine virt -bios default \
		-kernel $(KERNEL_BIN) \
		-drive file=boot.img,if=none,format=raw,id=hd0 \
		-device virtio-blk-device,drive=hd0 \
		-device virtio-gpu-device \
		-device virtio-keyboard-device \
		-serial stdio
