# environment

include ../Makevars.mk

# CFLAGS

CFLAGS += -O0
CFLAGS += -g
CFLAGS += -nostdlib
CFLAGS += -march=armv8-a
# CFLAGS += -std=c99
# CFLAGS += -pedantic
CFLAGS += -Wall
CFLAGS += -Wmissing-prototypes
CFLAGS += -Wstrict-prototypes
CFLAGS += -Wold-style-definition

INCS += -I./

# SOURCES

LD_SCRIPT = aarch64/aarch64.ld

SOURCE_FILES = \
	aarch64/aarch64_boot.S \
	aarch64/aarch64.S \
	\
	leos/irq.c \
	leos/leos.c \
	leos/log.c \
	leos/memory.c \
	leos/task.c \
	\
	drivers/timer/timer.c \
	drivers/uart/uart_mini.c \
	drivers/uart/uart_qemu.c \

SOURCE_LIST  := $(wildcard $(SOURCE_FILES))
OBJECT_FILES := $(addsuffix .o, $(addprefix $(BUILD_DIR), ${SOURCE_LIST}))

# rules 

all: kernel

default: kernel

kernel: $(BUILD_DIR)kernel.elf $(BUILD_DIR)kernel.list $(BUILD_DIR)kernel.bin

$(BUILD_DIR)kernel.elf: $(OBJECT_FILES)
	$(info linking target: $@)
	$(AARCH64_LD) -T$(LD_SCRIPT) -nostdlib $^ -o $@
	$(info done: $@)

$(BUILD_DIR)kernel.list: $(BUILD_DIR)kernel.elf
	$(AARCH64_OBJCOPY) -D $(BUILD_DIR)kernel.elf > $@

$(BUILD_DIR)kernel.bin: $(BUILD_DIR)/kernel.elf
	$(AARCH64_OBJCOPY) -O binary $< $@
	cp $@ $(BUILD_DIR)kernel8.img

$(BUILD_DIR)kernel.sym: $(BUILD_DIR)/kernel.elf
	$(AARCH64_OBJCOPY) --only-keep-debug $< $@
	$(AARCH64_OBJCOPY) --strip-debug $@

$(BUILD_DIR)%.o: %
	$(info compiling file: $<)
	@mkdir -p $(dir ./$(BUILD_DIR)$<)
	$(AARCH64_CC) $(INCS) $(CFLAGS) -c $< -o $@