CC = i686-elf-gcc
LD = i686-elf-ld
OBJCOPY = i686-elf-objcopy

CFLAGS = -m32 -ffreestanding -O2 -Wall -Wextra -nostdlib
ASFLAGS = -m32

BOOT_DIR   := boot
KERNEL_DIR := kernel
BUILD_DIR  := build

BOOT_BIN   := $(BUILD_DIR)/boot.bin
KERNEL_BIN := $(BUILD_DIR)/kernel.bin
IMAGE      := os.img

.PHONY: all clean run

all: $(IMAGE)

$(BUILD_DIR)/%.o: $(BOOT_DIR)/%.s | $(BUILD_DIR)
	$(CC) $(ASFLAGS) -c $< -o $@

$(BUILD_DIR)/%.o: $(KERNEL_DIR)/%.s | $(BUILD_DIR)
	$(CC) $(ASFLAGS) -c $< -o $@

$(BUILD_DIR)/%.o: $(KERNEL_DIR)/%.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/boot.elf: $(BUILD_DIR)/boot.o $(BOOT_DIR)/boot.ld
	$(LD) -T $(BOOT_DIR)/boot.ld -o $@ $(BUILD_DIR)/boot.o

$(BOOT_BIN): $(BUILD_DIR)/boot.elf
	$(OBJCOPY) -O binary $< $@

KERNEL_OBJS := $(BUILD_DIR)/prekernel.o $(BUILD_DIR)/kmain.o

$(BUILD_DIR)/kernel.elf: $(KERNEL_OBJS) $(KERNEL_DIR)/kernel.ld
	$(LD) -T $(KERNEL_DIR)/kernel.ld -o $@ $(KERNEL_OBJS)

$(KERNEL_BIN): $(BUILD_DIR)/kernel.elf
	$(OBJCOPY) -O binary $< $@

$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

$(IMAGE): $(BOOT_BIN) $(KERNEL_BIN)
	dd if=$(BOOT_BIN) of=$@ bs=512 count=1
	dd if=$(KERNEL_BIN) of=$@ bs=512 seek=1
	truncate -s 1440k $@

run: $(IMAGE)
	qemu-system-i386 -drive format=raw,file=$(IMAGE)

clean: 
	rm -rf $(BUILD_DIR) $(IMAGE)
