# shellcheck shell=sh disable=SC2046,SC2091,SC2086,SC2155
# NOTE: $(VAR) in this file is MAKE syntax, not shell substitution.
export TARGET=x86_64-unknown-uefi
export PROFILE=debug
export OUT_DIR=target/$(TARGET)/$(PROFILE)
export ESP_DIR=esp
export KERNEL=$(OUT_DIR)/rsdos.efi
export BZIMAGE=$(ESP_DIR)/bzImage
export INITRD=$(ESP_DIR)/initramfs.cpio.gz
export BOOTLOADER=rsboot/rsboot.efi
export OVMF=/usr/share/edk2/x64/OVMF.4m.fd
export BOOT_EFI=$(ESP_DIR)/EFI/BOOT/BOOTX64.EFI

.PHONY: all run run-gui clean image debug release fmt

# ---- Build ---------------------------------------------------------------

all: $(BZIMAGE) $(INITRD)

release: PROFILE=release
release: export PROFILE=release
release: export OUT_DIR=target/$(TARGET)/release
release: CARGO_FLAGS=--release
release: all

# shellcheck disable=SC2034
CARGO_FLAGS=

$(OUT_DIR)/rsdos.efi: $(shell find rsnix shell rsdos -name '*.rs') Cargo.toml rsnix/Cargo.toml shell/Cargo.toml rsdos/Cargo.toml
	cargo build --package rsdos --target $(TARGET) $(CARGO_FLAGS)

$(BZIMAGE): $(KERNEL) | $(ESP_DIR)
	cp "$<" "$@"

$(ESP_DIR):
	mkdir -p $(ESP_DIR)

$(INITRD): | $(ESP_DIR)
	printf '' | gzip > "$@"

# ---- QEMU runners --------------------------------------------------------

run: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=fat:rw:$(ESP_DIR),format=raw \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none

run-gui: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=fat:rw:$(ESP_DIR),format=raw \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -vga std

# GDB stub on :1234
debug: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=fat:rw:$(ESP_DIR),format=raw \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none \
	  -s -S

# Boot from a raw disk image (created by tools/boot-image.sh)
run-image: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=$(IMG),format=raw,if=none,id=hd \
	  -device ide-hd,drive=hd \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none

# ---- Disk image ----------------------------------------------------------

image: all
	./tools/boot-image.sh rs-dos.img

# ---- Utilities -----------------------------------------------------------

fmt:
	cargo fmt

clean:
	cargo clean
	rm -rf $(ESP_DIR) rs-dos.img

help:
	@echo "rs-dos — Make targets"
	@echo ""
	@echo "  make              build kernel + ESP (default)"
	@echo "  make release      build with --release (smaller binary)"
	@echo "  make image        create bootable USB image (rs-dos.img)"
	@echo "  make run          QEMU serial console (no graphics)"
	@echo "  make run-gui      QEMU with graphical window (GOP/PS2)"
	@echo "  make debug        QEMU + GDB stub on :1234"
	@echo "  make clean        remove build artifacts"
	@echo "  make fmt          format Rust source"
	@echo ""
	@echo "Scripts:"
	@echo "  ./tools/qemu.sh           flexible QEMU launcher"
	@echo "  ./tools/boot-image.sh     create bootable disk image"
	@echo "  ./tools/debug-kernel.py   GDB plugin (attach after 'make debug')"
