CC = gcc
GCCPARAMS = -m32 -fno-pie -nostdlib -fstrength-reduce -fomit-frame-pointer -finline-functions -fno-builtin -nostdinc -fno-stack-protector
ASPARAMS = -f elf32
LDPARAMS = -m elf_i386
INCBULDNUM = sh make_buildnum.sh

SRC := kernel
OBJ := obj

SOURCES := $(wildcard $(SRC)/*.c)
ASMSOURCES := $(wildcard $(SRC)/*.asm)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
ASMOBJECTS := $(patsubst $(SRC)/%.asm, $(OBJ)/%.o, $(ASMSOURCES))

run:kernel.iso
	qemu-system-x86_64 -serial pipe:/tmp/guest -m 256M -cdrom kernel.iso &

$(OBJ)/%.o: $(SRC)/%.c
	mkdir -p $(@D)
	$(CC) $(GCCPARAMS) $(SRC) -c -o $@ $<

$(OBJ)/%.o: $(SRC)/%.asm
	mkdir -p $(@D)
	nasm $(ASPARAMS) -o $@ $<
	
kernel.bin: $(OBJECTS) $(ASMOBJECTS)
	@#Crap way to increment the build number, but will do for now
	@#thanks to my limited knowledge of Makefiles.
	@#Sadly this number in the compiled code will always be off by one with this method....
	@sh make_buildnum.sh
	mkdir -p obj/bin
	ld $(LDPARAMS) -T linker.ld -o obj/bin/$@ $(OBJECTS) $(ASMOBJECTS)

kernel.iso: kernel.bin
	mkdir iso
	mkdir iso/boot
	mkdir iso/boot/grub
	cp obj/bin/kernel.bin iso/boot/kernel.bin
	echo 'set timeout=0' > iso/boot/grub/grub.cfg
	echo 'set default=0' >> iso/boot/grub/grub.cfg
	echo '' >> iso/boot/grub/grub.cfg
	echo 'menuentry "SDOS" {'  >> iso/boot/grub/grub.cfg
	echo '  multiboot /boot/kernel.bin'    	 >> iso/boot/grub/grub.cfg
	echo '  boot'                            >> iso/boot/grub/grub.cfg
	echo '}'                                 >> iso/boot/grub/grub.cfg
	grub-mkrescue --output=kernel.iso iso
	rm -rf iso
	
.PHONY: clean
clean:
	rm -rf obj/* kernel.iso

.PHONY: resetbuild
resetbuild:
	echo 0 > build.number
