MAKEFLAGS += -j $(shell nproc)

CC = gcc

C_FLAGS = \
	 -I. \
	-std=c17 \
	-Wall -Wextra -Wpedantic -Wconversion \
	-pedantic -pedantic-errors \
	-Wno-unused-function \

L_FLAGS = -pthread


C_FLAGS += $(shell pkg-config sdl2 --cflags)
L_FLAGS += $(shell pkg-config sdl2 --libs)

F_FLAGS =
OPTIMIZATION =

RELEASE=0

ifeq ($(RELEASE),1)
	C_FLAGS += -Werror
	F_FLAGS += -flto=auto
	OPTIMIZATION += -O3
else
	C_FLAGS += -g -Wno-unused-variable
	F_FLAGS += -fsanitize=address,undefined,leak
	OPTIMIZATION += -Og
endif

HEADERS = $(shell find . -name *.h)

ASM_SOURCES = $(shell find asm/ -name *.c -not -name main.c)
ASM_OBJECTS = $(patsubst %.c,build/%.o,$(ASM_SOURCES))

VM_SOURCES = $(shell find vm/ -name *.c)
VM_OBJECTS = $(patsubst %.c,build/%.o,$(VM_SOURCES))

KERN_SOURCES = $(shell find kern/ -name *.c)
KERN_OBJECTS = $(patsubst %.c,build/%.o,$(KERN_SOURCES))

all: bin/vm bin/build_disk_image bin/asm

bin/vm: $(VM_OBJECTS) $(ASM_OBJECTS) build/image
	@mkdir -p $(dir $@)
	$(CC) $(VM_OBJECTS) $(ASM_OBJECTS) -o $@ $(F_FLAGS) $(OPTIMIZATION) $(L_FLAGS)

build/image: bin/build_disk_image
	@mkdir -p $(dir $@)
	./bin/build_disk_image

bin/build_disk_image: $(KERN_OBJECTS) $(ASM_OBJECTS)
	@mkdir -p $(dir $@)
	$(CC) $^ -o $@ $(F_FLAGS) $(OPTIMIZATION) $(L_FLAGS)

bin/asm: $(ASM_OBJECTS) build/asm/main.o
	@mkdir -p $(dir $@)
	$(CC) $^ -o $@ $(F_FLAGS) $(OPTIMIZATION) $(L_FLAGS)

build/%.o: %.c $(HEADERS)
	@mkdir -p $(dir $@)
	$(CC) $< -c -o $@ $(C_FLAGS) $(OPTIMIZATION) $(F_FLAGS)


clean:
	rm -rf build/ bin/