KERNEL_EXEC := socks_kernel

ARCH := x86_64

MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
ROOT_DIR := $(patsubst %/,%,$(dir $(MAKEFILE_PATH)))

include tools/make/gcc-cross-compile.mk
include arch/$(ARCH)/config.mk

BUILD_DIR := build

####################################
# Architecture-specific source files
####################################

ARCH_C_FILES := $(wildcard arch/$(ARCH)/*.c)
ARCH_ASM_FILES := $(wildcard arch/$(ARCH)/*.S)
ARCH_OBJ := $(addprefix $(BUILD_DIR)/,$(ARCH_C_FILES:.c=.o) $(ARCH_ASM_FILES:.S=.o))

####################################
# Platform-independent kernel source files
####################################

KERNEL_SRC_DIRS := init kernel vm
KERNEL_C_FILES := $(foreach dir,$(KERNEL_SRC_DIRS),$(wildcard $(dir)/*.c))
KERNEL_OBJ := $(addprefix $(BUILD_DIR)/,$(KERNEL_C_FILES:.c=.o))

####################################
# Kernel libc source files
####################################

LIBC_SRC_DIRS := stdio string ctype
LIBC_C_FILES := $(foreach dir,$(LIBC_SRC_DIRS),$(wildcard libc/$(dir)/*.c))
LIBC_OBJ := $(addprefix $(BUILD_DIR)/,$(LIBC_C_FILES:.c=.o))

BUILD_ID := $(shell tools/generate_build_id.py --arch $(ARCH))

CFLAGS := $(CFLAGS) -DBUILD_ID=\"$(BUILD_ID)\" -g -Wall -Werror -pedantic \
	-Iinclude -Iarch/$(ARCH)/include -Ilibc/include

ASMFLAGS := $(ASMFLAGS) -DBUILD_ID=\"$(BUILD_ID)\"
LDFLAGS := $(LDFLAGS) -g

ALL_KERNEL_OBJECT_FILES := $(KERNEL_OBJ) $(ARCH_OBJ) $(LIBC_OBJ)

all: $(BUILD_DIR)/$(KERNEL_EXEC) sandbox

$(BUILD_DIR)/$(KERNEL_EXEC): $(ALL_KERNEL_OBJECT_FILES)
	@printf "    \033[1;36mLD\033[0m     \033[1mbuild/\033[35m$(KERNEL_EXEC)\033[0m\n"
	@mkdir -p $(@D)
	@$(LD) $^ -o $@ $(LDFLAGS) $(ARCH_LDFLAGS)

$(BUILD_DIR)/%.o: %.S
	@printf "    \033[1;32mAS\033[0m     \033[35m$(KERNEL_EXEC)\033[0m/$<\n"
	@mkdir -p $(@D)
	@$(ASM) $< -o $@ -c $(ASMFLAGS) $(ARCH_ASMFLAGS)

$(BUILD_DIR)/%.o: %.c
	@printf "    \033[1;32mCC\033[0m     \033[35m$(KERNEL_EXEC)\033[0m/$<\n"
	@mkdir -p $(@D)
	@$(CC) $< -o $@ -c $(CFLAGS) $(ARCH_CFLAGS)

clean:
	@printf "    \033[1;93mRM\033[0m     Deleting build files.\n"
	@rm -rf $(BUILD_DIR)

$(BUILD_DIR)/compile_commands.json:
	@$(MAKE) clean

	@printf "    \033[1;93mGEN\033[0m    Generating compiler database.\n"

	@./tools/make/generate_compile_commands.py

sandbox:
	@$(MAKE) -C sandbox

compile-db: $(BUILD_DIR)/compile_commands.json

include arch/$(ARCH)/extra.mk

.PHONY: all compile-db sandbox

.INTERMEDIATE: $(ARCH_TEMP_FILES)
