.PHONY: build FORCE

KERNEL         = $(shell uname -s)
MACHINE        = $(shell uname -m)
PLATFORM       = $(KERNEL)_$(MACHINE)
CC             = clang
CXX            = clang++
SLANGC         = slangc
C_SRCS         = src/main.c
C_UNITY_SRCS   = src/wapp/wapp.c         \
                 src/config/config_src.c \
                 src/window/window_src.c \
                 src/gpu/gpu_c_src.c
CXX_UNITY_SRCS = src/gpu/gpu_cc_src.cpp
CFLAGS         = -g -c -DWP_DEBUG_ASSERT -DCGLM_DEFINE_PRINTS
CXXFLAGS       = -g -c -Wno-nullability-completeness -DWP_DEBUG_ASSERT
LDFLAGS        = -g -DWP_DEBUG_ASSERT
LDLIBS         = -lm
WND_BKND       = SDL
GPU_BKND       = Vulkan
SLANGC_FLAGS   = -entry vertMain -entry fragMain
SHADER_SRC     = src/shaders/shader.slang
BUILD_ROOT     = .build
BUILDDIR       = $(BUILD_ROOT)/$(PLATFORM)
OBJDIR         = $(BUILDDIR)/obj
COBJDIR        = $(OBJDIR)/c
CXXOBJDIR      = $(OBJDIR)/cxx
SHADER_OUTDIR  = $(BUILDDIR)/shaders
ASSETS_DIR     = assets

ifeq ($(WND_BKND), SDL)
	CFLAGS += -DUSE_SDL_WINDOW_BACKEND
	LDLIBS += -lSDL3
endif

ifeq ($(GPU_BKND), Vulkan)
	C_SRCS   += vendor/vulkan/include/volk/volk.c
	CFLAGS   += -DUSE_VULKAN_RENDER_BACKEND -DVK_NO_PROTOTYPES -Ivendor/vulkan/include
	CXXFLAGS += -DUSE_VULKAN_RENDER_BACKEND -DVK_NO_PROTOTYPES -Ivendor/vulkan/include
	LDFLAGS  += -Lvendor/vulkan/lib -Wl,-rpath,$(shell realpath vendor/vulkan/lib)
endif

COBJS          = $(patsubst %.c, $(COBJDIR)/%.o, $(C_SRCS))
C_UNITY_OBJS   = $(patsubst %.c, $(COBJDIR)/%.o, $(C_UNITY_SRCS))
CXX_UNITY_OBJS = $(patsubst %.cpp, $(CXXOBJDIR)/%.o, $(CXX_UNITY_SRCS))
OBJS           = $(COBJS) $(C_UNITY_OBJS) $(CXX_UNITY_OBJS)
OUT_NAME       = main
OUT            = $(BUILDDIR)/$(OUT_NAME)
SHADER_OUT     = $(SHADER_OUTDIR)/shader.spv

build: $(OUT) $(SHADER_OUT) copy-assets

$(OUT): $(OBJS)
	$(CXX) $(LDFLAGS) -o "$@" $^ $(LDLIBS)

$(COBJS): $(COBJDIR)/%.o: %.c
	@mkdir -p "$(@D)"
	$(CC) $(CFLAGS) "$<" -o "$@"

$(C_UNITY_OBJS): $(COBJDIR)/%.o: %.c FORCE
	@mkdir -p "$(@D)"
	$(CC) $(CFLAGS) "$<" -o "$@"

$(CXX_UNITY_OBJS): $(CXXOBJDIR)/%.o: %.cpp FORCE
	@mkdir -p "$(@D)"
	$(CXX) $(CXXFLAGS) "$<" -o "$@"

$(SHADER_OUT): $(SHADER_SRC)
	@mkdir -p $(SHADER_OUTDIR)
	$(SLANGC) $(SHADER_SRC) $(SLANGC_FLAGS) -o $(SHADER_OUT)

copy-assets:
	@cp -r $(ASSETS_DIR) $(BUILDDIR)

run:
	@cd $(BUILDDIR) && ./$(OUT_NAME)

clean:
	@rm -rf $(BUILD_ROOT)

FORCE:
