INC := include
LIB := lib
OBJ := obj
SRC := src
EXE := Game
REL := Release

CC := gcc
CFLAGS := -w -I$(INC) -L$(LIB)/SDL2 -L$(LIB)/glew -DGLEW_STATIC -L$(LIB)/cglm
LIBS := -Wl,-Bstatic -lSDL2 -lGLEW -lcglm -Wl,-Bdynamic -lGLU -lGL -lm

OBJFILES := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(shell find $(SRC) -name '*.c'))
OBJDIRS := $(patsubst $(SRC)%, $(OBJ)%, $(shell find $(SRC) -type d))
CLEANDIRS := $(addsuffix /.clean, $(OBJDIRS));

# Explicit targets
.PHONY: all release clean rebuild run
.DEFAULT_GOAL := all

# Build executable
all: CFLAGS += -ggdb -O0
all: $(EXE)
$(EXE): $(OBJFILES) | $(OBJDIRS) $(INC) $(LIB)
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)

# Compile object files
$(OBJ)/%.o: $(SRC)/%.c | $(OBJDIRS) $(INC) $(LIB)
	$(CC) -c -o $@ $(SRC)/$*.c $(CFLAGS)

# Create directory tree
$(OBJDIRS):
	mkdir -p $@
$(INC):
	mkdir -p $@
	ln -rs ../SDL2/include $(INC)/SDL2
	ln -rs ../glew/include/GL $(INC)/GL
	ln -rs ../cglm/include/cglm $(INC)/cglm
$(LIB):
	mkdir -p $@
	ln -rs ../SDL2/build/.libs $(LIB)/SDL2
	ln -rs ../glew/lib $(LIB)/glew
	ln -rs ../cglm/.libs $(LIB)/cglm

release: CFLAGS += -O3 -s
release: $(REL)
$(REL): $(OBJFILES) | $(OBJDIRS) $(INC) $(LIB)
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)

# Delete previously built files
clean: $(CLEANDIRS)
	rm -f $(EXE) $(REL)
%.clean:
	rm -f $**.o

rebuild:
	make clean
	make all

run:
	make all
	./$(EXE)
