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)) LINK_SOURCES = $(shell find link/ -name *.c) LINK_OBJECTS = $(patsubst %.c,build/%.o,$(LINK_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/link 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/link: $(LINK_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) .PHONY: run_kern clean run_kern_main_asm: bin/asm bin/vm ./bin/asm kern/main.asm ./bin/vm -i out.o link_kern: bin/asm bin/link ./bin/asm kern/main.asm -o build/kern_main.o ./bin/link -p kern -o build/kern.out build/kern_main.o clean: rm -rf build/ bin/