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)