CROSS ?= x86_64-elf-
CC := $(CROSS)gcc
LD := $(CROSS)ld
NASM := nasm
OBJCOPY := $(CROSS)objcopy

CFLAGS := -std=c11 -O2 -Wall -Wextra -Werror -ffreestanding -fno-stack-protector \
          -fno-pic -fno-pie -m64 -mno-red-zone -mcmodel=small \
          -mno-mmx -mno-sse -mno-sse2 -Iinclude
ASFLAGS := -f elf64
LDFLAGS := -nostdlib -z max-page-size=0x1000 -T linker.ld

KERNEL_C := kernel/main.c kernel/log.c kernel/panic.c kernel/serial.c \
            arch/x86_64/gdt.c arch/x86_64/idt.c arch/x86_64/paging.c \
            arch/x86_64/user.c kernel/syscall.c process/elf.c libc/memory.c libc/string.c
KERNEL_S := boot/entry.asm arch/x86_64/interrupts.asm
KERNEL_O := $(patsubst %.c,build/%.o,$(KERNEL_C)) $(patsubst %.asm,build/%.o,$(KERNEL_S))

.PHONY: all clean run
all: build/minios.iso

build/user.elf: user/init.c user/linker.ld | build
	$(CC) $(CFLAGS) -nostdlib -Wl,-T,user/linker.ld -Wl,--build-id=none -o $@ user/init.c

build/user.bin: build/user.elf
	$(OBJCOPY) -O binary $< $@

build/user_blob.o: build/user.elf
	cd build && $(LD) -r -b binary -o user_blob.o user.elf

build/%.o: %.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c $< -o $@

build/%.o: %.asm
	@mkdir -p $(dir $@)
	$(NASM) $(ASFLAGS) $< -o $@

build/minios.elf: $(KERNEL_O) build/user_blob.o linker.ld
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(KERNEL_O) build/user_blob.o -lgcc

build/minios.iso: build/minios.elf grub/grub.cfg
	mkdir -p build/iso/boot/grub
	cp build/minios.elf build/iso/boot/minios.elf
	cp grub/grub.cfg build/iso/boot/grub/grub.cfg
	grub-mkrescue -o $@ build/iso

build:
	mkdir -p build

run: build/minios.iso
	qemu-system-x86_64 -cdrom build/minios.iso -serial stdio -no-reboot -no-shutdown

clean:
	rm -rf build
