UNAME_S = $(shell uname -s) CC = clang CFLAGS = -Wall -Wextra -std=c11 CFLAGS_DEBUG = $(CFLAGS) -g -O0 CFLAGS_RELEASE = $(CFLAGS) -O2 TARGET = ogl SRC_DIR = src VENDOR_DIR = vendor OUT_DIR = out LIBS = -lglfw -lGLEW -lcglm DEBUG_DIR = $(OUT_DIR)/debug RELEASE_DIR = $(OUT_DIR)/release INSTALL_DIR = /usr/local/bin # Find all .c files in the src directory SRCS = $(wildcard $(SRC_DIR)/*.c) # Generate lists of object files for debug and release builds OBJS_DEBUG = $(patsubst $(SRC_DIR)/%.c,$(DEBUG_DIR)/%.o,$(SRCS)) OBJS_RELEASE = $(patsubst $(SRC_DIR)/%.c,$(RELEASE_DIR)/%.o,$(SRCS)) # Include paths for vendor libraries INCLUDES = $(addprefix -I,$(VENDOR_DIR) $(wildcard $(VENDOR_DIR)/*/)) ifeq ($(UNAME_S), Darwin) LIBS += -framework OpenGL endif ifeq ($(UNAME_S), Linux) LDFLAGS += -lGL endif all: debug release debug: $(DEBUG_DIR)/$(TARGET) release: $(RELEASE_DIR)/$(TARGET) # Debug build $(DEBUG_DIR)/$(TARGET): $(OBJS_DEBUG) | $(DEBUG_DIR) $(CC) $(CFLAGS_DEBUG) $(INCLUDES) $(LIBS) -o $@ $(OBJS_DEBUG) $(DEBUG_DIR)/%.o: $(SRC_DIR)/%.c | $(DEBUG_DIR) $(CC) $(CFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ # Release build $(RELEASE_DIR)/$(TARGET): $(OBJS_RELEASE) | $(RELEASE_DIR) $(CC) $(CFLAGS_RELEASE) $(INCLUDES) $(LIBS) -o $@ $(OBJS_RELEASE) $(RELEASE_DIR)/%.o: $(SRC_DIR)/%.c | $(RELEASE_DIR) $(CC) $(CFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ $(DEBUG_DIR) $(RELEASE_DIR): mkdir -p $@ clean: rm -rf $(OUT_DIR) install: $(RELEASE_DIR)/$(TARGET) install -m 755 $< $(INSTALL_DIR) .PHONY: all debug release clean install