# This build script uses some GNU make specific extensions.

include config.mk

CFLAGS += -Wall -Wextra -ggdb3 -O0
# flag to check if we correctly initialized submodules before we use them
CFLAGS += -DINIT_ASSERTED

# Kernel sources which are specific to the x86_64 architecture.
# Add new source files (C or Assembler) here,
# preferentially in alphabetical order.
KERNEL_SOURCES_x86_64 := \
	src/x86_64/apic.c \
	src/x86_64/cmos.c \
	src/x86_64/interrupt.S \
	src/x86_64/loadcs.S \
	src/x86_64/uart.c \
	src/x86_64/string.S \
	src/x86_64/cpu.c \
	src/x86_64/paging.c \
	src/x86_64/asm.c \
	src/x86_64/address.c \
	src/x86_64/ps2_driver.c \
	src/x86_64/hwclock.c \
	# end of x86_64 specific kernel sources list

# Architecture-agnostic kernel sources.
# Add new source files (C or Assembler) here,
# preferentially in alphabetical order.
KERNEL_SOURCES := \
	src/acpi.c   \
	src/console.c \
	src/framebuffer.c \
	src/kernel.c \
	src/pci.c    \
	src/ram.c    \
	src/tar.c    \
	src/time.c   \
	src/std.c    \
	src/slab.c   \
	src/nodevec.c \
	src/sff.c    \
	src/snake.c  \
	src/keyboard.c    \
	src/unicode.c    \
	src/interpreter.c    \
	src/sync.c   \
	src/mem_range.c   \
	src/rect.c   \
	src/texture.c   \
	src/stack_protector.c \
	src/qoi.c \
	src/app.c \
	src/app_cursor.c \
	src/app_tron.c \
	$(KERNEL_SOURCES_$(ARCH)) \
	# end of kernel sources list

KERNEL_OBJECTS  := $(KERNEL_SOURCES:.c=.o)
KERNEL_OBJECTS  := $(KERNEL_OBJECTS:.S=.o)
KERNEL_OBJECTS  := $(KERNEL_OBJECTS:%.o=build/%.o)
KERNEL_DEPFILES := $(KERNEL_OBJECTS:.o=.d)
KERNEL_TARGET   := build/boot/sys/core

.PHONY: all clean

all: build/disk.img drive.img

drive.img:
	truncate -s 16M drive.img

clean:
	rm -rf build/*

TEST_MEM_RANGE_DEPS=build/src/test.o build/src/mem_range.o build/src/x86_64/address.o
build/tests/test_mem_range: tests/test_mem_range.c $(TEST_MEM_RANGE_DEPS) build/tests
	@printf "CC %s\n" $@
	@"$(CC)" $(CFLAGS) -c -o $@.o $< $(CPPFLAGS)
	@"$(CC)" -o $@ $@.o $(TEST_MEM_RANGE_DEPS)

build/tests:
	mkdir -p $@

build/src/%.o: src/%.[cS] | build/src
	@printf "CC %s\n" $@
	@"$(CC)" $(CFLAGS) -MMD -MP -c -o $@ $< $(CPPFLAGS)

build/src/$(ARCH)/%.o: src/$(ARCH)/%.[cS] | build/src/$(ARCH)
	@printf "CC %s\n" $@
	@"$(CC)" $(CFLAGS) -MMD -MP -c -o $@ $< $(CPPFLAGS)

$(KERNEL_TARGET): $(KERNEL_OBJECTS) kernel.ld | build/boot/sys
	@printf "LD %s\n" $@
	@"$(LD)" -T kernel.ld $(LDFLAGS) -o $@ $(KERNEL_OBJECTS)

build/disk.img: $(KERNEL_TARGET) kernel.json bootboot.cfg build/boot/font.sff
	$(MKBOOTIMG) kernel.json $@

build:
	mkdir -p $@

build/src:
	mkdir -p $@

build/boot:
	mkdir -p $@

build/boot/font.sff: font.sff build/boot
	@printf "CP %s\n" $@
	@cp $< $@

build/src/$(ARCH):
	mkdir -p $@

build/boot/sys:
	mkdir -p $@

config.mk: | config.default.mk
	cp config.default.mk $@

-include $(KERNEL_DEPFILES)
