ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
CFLAGS = -I $(ROOT_DIR)/include -I/usr/local/include -I/opt/homebrew/include -O0 -g -Wall -Wextra -MMD -MP
LDFLAGS = -lfreetype -lz -lglfw -lvulkan -ldl -Xlinker -rpath -Xlinker /opt/homebrew/lib

CFLAGS += $(shell pkg-config --cflags lua)
LDFLAGS += $(shell pkg-config --libs lua)

ENGINE_SOURCES = src/engine.c src/draw.c src/ui.c src/ui_lua.c src/gpu.c src/hex.c src/hsv.c lib/spng.c lib/vma.cpp
APP_SOURCES = src/main.c $(ENGINE_SOURCES)
EDITOR_SOURCES = src/editor.c $(ENGINE_SOURCES)
TEST_SOURCES = test/hsv.c $(ENGINE_SOURCES)

APP_OBJECTS = $(addsuffix .o, $(basename $(APP_SOURCES)))
EDITOR_OBJECTS = $(addsuffix .o, $(basename $(EDITOR_SOURCES)))
TEST_OBJECTS = $(addsuffix .o, $(basename $(TEST_SOURCES)))

ALL_OBJECTS = $(sort $(APP_OBJECTS) $(EDITOR_OBJECTS) $(TEST_OBJECTS))
DEP_FILES = $(ALL_OBJECTS:.o=.d)

VERT_SPV = $(addsuffix .vert.spv, $(basename $(wildcard shader/*.vert)))
FRAG_SPV = $(addsuffix .frag.spv, $(basename $(wildcard shader/*.frag)))
COMP_SPV = $(addsuffix .comp.spv, $(basename $(wildcard shader/*.comp)))
SPV_FILES = $(VERT_SPV) $(FRAG_SPV) $(COMP_SPV)

EXTRA_DEBUG_REQUIREMENTS :=
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
	GDB = gdb
	CFLAGS += -I /usr/include/freetype2
endif
ifeq ($(UNAME_S),Darwin)
	export MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS=1
	export VK_ICD_FILENAMES=$(shell brew --prefix molten-vk)/etc/vulkan/icd.d/MoltenVK_icd.json
	DSYM = dsymutil
	GDB = lldb
	EXTRA_DEBUG_REQUIREMENTS = roleplay.dSYM
endif

CC ?= clang
CXX ?= clang++


.PHONY: all
all: roleplay $(SPV_FILES)

roleplay: $(APP_OBJECTS) | $(SPV_FILES)
	$(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $^

editor: $(EDITOR_OBJECTS) | $(SPV_FILES)
	$(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $^

test/test_hsv: $(TEST_OBJECTS)
	$(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $^

.PHONY: test
test: test/test_hsv
	./test/test_hsv

%.o: %.cpp
	$(CXX) $(CFLAGS) -std=c++17 -Wno-nullability-completeness -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-private-field -Wno-unused-variable -c -o $@ $<

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

.PHONY: compdb
compdb: compile_commands.json

compile_commands.json: Makefile
	rm -f $(ALL_OBJECTS)
	bear --output $@ -- $(MAKE) $(ALL_OBJECTS)

.PHONY: clean clean_compdb run run_editor

clean:
	rm -f $(SPV_FILES)
	rm -f $(ALL_OBJECTS) $(DEP_FILES)
	rm -f roleplay editor test/test_hsv
	rm -rf $(EXTRA_DEBUG_REQUIREMENTS)

clean_compdb:
	rm -rf .compdb
	rm -f compile_commands.json

run: roleplay $(SPV_FILES)
	./roleplay

run_editor: editor $(SPV_FILES)
	./editor

.PHONY: debug-sign
debug-sign:
	codesign --entitlements ./ent.plist -f -s "fake-apple-signing" ./roleplay

roleplay.dSYM: roleplay
	$(DSYM) roleplay

debug: roleplay $(EXTRA_DEBUG_REQUIREMENTS) $(SPV_FILES)
	$(GDB) roleplay

%.vert.spv: %.vert
	glslc -o $@ $<

%.frag.spv: %.frag
	glslc -o $@ $<

%.comp.spv: %.comp
	glslc -o $@ $<

-include $(DEP_FILES)
