CC := gcc
AS := nasm
LD := ld

INCDIRS := . arch crypto drivers drivers/wifi fs lib net ui
INCFLAGS := $(addprefix -I,$(INCDIRS))

CFLAGS := -m32 -ffreestanding -fno-pie -fno-stack-protector -fno-builtin \
          -nostdlib -Wall -Wextra -Wno-unused-parameter -O2 \
          -fno-asynchronous-unwind-tables -mgeneral-regs-only -mno-red-zone $(INCFLAGS)

SRCDIRS := . arch crypto drivers drivers/wifi fs lib net ui
CSRCS := $(foreach d,$(SRCDIRS),$(wildcard $(d)/*.c))
COBJS := $(CSRCS:.c=.o)

ASMSRC := multiboot_entry.asm
ASMOBJ := multiboot_entry.o

KERNEL := kernel_mb.elf

all: $(KERNEL)

$(ASMOBJ): $(ASMSRC)
	$(AS) -f elf32 $< -o $@

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

$(KERNEL): $(ASMOBJ) $(COBJS)
	$(LD) -m elf_i386 -T linker_mb.ld -o $@ $(ASMOBJ) $(COBJS)

clean:
	rm -f $(COBJS) $(ASMOBJ) $(KERNEL)

.PHONY: all clean

ISODIR := build/iso
PAYDIR := build/payload
FWDIR  := firmware

iso: kernel_mb.elf
	@rm -rf $(ISODIR) $(PAYDIR)
	@# ---- 1) install_payload.img : a bootable clone of THIS build ----
	@mkdir -p $(PAYDIR)/boot/grub/themes/zapczos $(PAYDIR)/boot/grub/fonts
	@cp kernel_mb.elf $(PAYDIR)/boot/kernel_mb.elf
	@cp grub.cfg $(PAYDIR)/boot/grub/grub.cfg
	@cp grub_theme/* $(PAYDIR)/boot/grub/themes/zapczos/ 2>/dev/null || true
	@for d in /usr/share/grub/unicode.pf2 /usr/lib/grub/unicode.pf2 /boot/grub/fonts/unicode.pf2; do \
		if [ -f $$d ]; then cp $$d $(PAYDIR)/boot/grub/fonts/unicode.pf2; break; fi; \
	done
	@if [ -f $(FWDIR)/iwlwifi-8265-36.ucode ]; then cp $(FWDIR)/iwlwifi-8265-36.ucode $(PAYDIR)/boot/iwlwifi8265.ucode; fi
	@if [ -f $(FWDIR)/iwlwifi-3160-17.ucode ]; then cp $(FWDIR)/iwlwifi-3160-17.ucode $(PAYDIR)/boot/iwlwifi3160.ucode; fi
	@if [ -f $(FWDIR)/iwlwifi-7265D-29.ucode ]; then cp $(FWDIR)/iwlwifi-7265D-29.ucode $(PAYDIR)/boot/iwlwifi7265.ucode; fi
	@if [ -f $(FWDIR)/iwlwifi-9260-th-b0-jf-b0-46.ucode ]; then cp $(FWDIR)/iwlwifi-9260-th-b0-jf-b0-46.ucode $(PAYDIR)/boot/iwlwifi9260.ucode; fi
	@sh tools/build_partimg.sh $(PAYDIR) install_payload.img
	@# ---- 2) zapczos.iso : same tree plus the payload, so the installer can clone this system ----
	@cp -rT $(PAYDIR) $(ISODIR)
	@cp install_payload.img $(ISODIR)/boot/install_payload.img
	@if [ -f payloads/doom.wad ]; then cp payloads/doom.wad $(ISODIR)/boot/doom.wad; fi
	@grub-mkrescue -o zapczos.iso $(ISODIR) >/dev/null 2>&1
	@ls -la zapczos.iso install_payload.img

.PHONY: iso
