CC = clang
LD = ld.lld

CFLAGS = -target x86_64-unknown-windows-gnu -nostdlib -ffreestanding -fno-stack-protector \
         -mno-red-zone -mgeneral-regs-only -mno-sse -mno-mmx \
         -I. -O2 -Wall -Wextra -Werror -Wno-unused-function -Wno-unused-parameter \
         -Wno-address-of-packed-member

LDFLAGS = -m i386pep -e efi_main --subsystem efi_application \
          --stack 0x100000,0x1000 --heap 0x100000,0x1000

OBJS = pe_symbols.o pe_stubs.o boot.o kernel.o gdt.o idt.o paging.o fb.o lapic.o ioapic.o printf.o util.o usbkbd.o

all: bootx64.efi

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

%.o: %.s
	$(CC) -target x86_64-unknown-windows-gnu -c $< -o $@

bootx64.efi: $(OBJS)
	$(LD) $(LDFLAGS) $(OBJS) -o $@

esp.img: bootx64.efi
	dd if=/dev/zero of=$@ bs=1M count=64 2>/dev/null
	mformat -F -i $@ ::
	mmd -i $@ ::/EFI
	mmd -i $@ ::/EFI/BOOT
	mcopy -i $@ bootx64.efi ::/EFI/BOOT/

prismos.iso: bootx64.efi
	rm -rf iso_root boot.fat
	mkdir -p iso_root/EFI/BOOT
	dd if=/dev/zero of=boot.fat bs=1M count=64 2>/dev/null
	mformat -F -i boot.fat ::
	mmd -i boot.fat ::/EFI
	mmd -i boot.fat ::/EFI/BOOT
	mcopy -i boot.fat bootx64.efi ::/EFI/BOOT/
	cp boot.fat iso_root/
	cp bootx64.efi iso_root/EFI/BOOT/
	xorriso -as mkisofs \
	        -eltorito-boot boot.fat -no-emul-boot \
	        -eltorito-alt-boot -e boot.fat -no-emul-boot \
	        -isohybrid-gpt-basdat \
	        --protective-msdos-label \
	        -o $@ -V "PRISMOS" iso_root/ 2>&1 | grep -E "Written|complet"

usb.img: bootx64.efi mkusb.py
	python3 mkusb.py bootx64.efi $@ 64

run: usb.img
	qemu-system-x86_64 -bios /usr/share/edk2/x64/OVMF.4m.fd -drive file=usb.img,format=raw -m 512M -serial stdio -device qemu-xhci -device usb-kbd

run_iso: prismos.iso
	qemu-system-x86_64 -bios /usr/share/edk2/x64/OVMF.4m.fd -cdrom prismos.iso -m 512M -serial stdio -device qemu-xhci -device usb-kbd

debug: usb.img
	@echo "Connect gdb with: gdb -ex 'target remote localhost:1234' -ex 'symbol-file bootx64.efi'"
	qemu-system-x86_64 -bios /usr/share/edk2/x64/OVMF.4m.fd -drive file=usb.img,format=raw -m 512M -s -S -serial stdio -device qemu-xhci -device usb-kbd

clean:
	rm -f *.o *.efi *.iso *.img boot.fat
	rm -rf iso_root

.PHONY: all run run_iso debug clean
