ENTRYPOINT  = 0x30400

ENTRYOFFSET = 0x400

ASM         = nasm
CC          = x86_64-elf-gcc
LD          = x86_64-elf-ld
ASMBFLAGS   = -I boot/include/
ASMKFLAGS   = -I include/ -f elf
CFLAGS      = -m32 -I include/ -c -fno-builtin
LDFLAGS     = -s -Ttext $(ENTRYPOINT) -m elf_i386

MERGEBOOT   = out/boot.bin out/loader.bin
MERGEKERNEL = out/kernel.bin
OBJS        = out/kernel.o out/start.o out/gdt.o out/i8259.o out/global.o \
			out/intr.o out/exc.o out/main.o out/binfo.o out/memory.o \
			out/clock.o out/process.o out/syscall.o out/proc.o \
			out/keyboard.o out/keydrive.o out/fifo.o \
			out/palette.o out/font.o out/text.o out/rect.o \
			out/kliba.o out/string.o out/klib.o out/assert.o out/istatus.o

.PHONY : everything all image clear run buildimg stat

everything : $(MERGEBOOT) $(MERGEKERNEL)

all : clear everything

image : all buildimg

run : image
	qemu-system-i386 -fda a.img

clear :
	del /f /s /q out

buildimg :
	dd if=out/boot.bin of=a.img bs=512 count=1
	edimg imgin:a.img copy from:out/loader.bin to:@: copy from:out/kernel.bin to:@: imgout:a.img

stat :
	@cloc .

out/%.bin : boot/%.asm
	$(ASM) $(ASMBFLAGS) -o $@ $<

$(MERGEKERNEL) : $(OBJS)
	$(LD) $(LDFLAGS) -o $(MERGEKERNEL) $(OBJS)
	del out\*.o

out/%.o : kernel/%.asm
	$(ASM) $(ASMKFLAGS) -o $@ $<

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

out/%.o : lib/%.asm
	$(ASM) $(ASMKFLAGS) -o $@ $<

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

out/%.o : graphics/%.asm
	$(ASM) $(ASMKFLAGS) -o $@ $<

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

out/%.o : device/keyboard/%.asm
	$(ASM) $(ASMKFLAGS) -o $@ $<

out/%.o : device/keyboard/%.c
	$(CC) $(CFLAGS) -o $@ $<