COMPILATION_MODE ?= Debug ENABLE_WARNINGS ?= 1 WARNINGS_AS_ERRORS ?= 0 EXECUTABLE_PREFIX ?= main C_COMPILER ?= gcc C_STANDARD ?= gnu11 ifeq ($(COMPILATION_MODE), Debug) C_COMPILER_FLAGS = -g -O0 -std=$(C_STANDARD) EXECUTABLE_NAME = $(EXECUTABLE_PREFIX)Debug ifeq ($(ENABLE_WARNINGS), 1) C_COMPILER_FLAGS += -Wall -Wextra -Wpedantic -Wconversion endif else C_COMPILER_FLAGS = -O3 -Wall -std=$(C_STANDARD) EXECUTABLE_NAME = $(EXECUTABLE_PREFIX)Release endif ifeq ($(WARNINGS_AS_ERRORS), 1) C_COMPILER_FLAGS += -Werror endif C_COMPILER_CALL = $(C_COMPILER) $(C_COMPILER_FLAGS) INCLUDE_DIR = include SOURCE_DIR = src BUILD_DIR = build C_SRCS = $(wildcard $(SOURCE_DIR)/*.c) C_OBJECTS = $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.o, $(C_SRCS)) build: $(BUILD_DIR)/$(EXECUTABLE_NAME) $(BUILD_DIR)/$(EXECUTABLE_NAME): $(C_OBJECTS) $(C_COMPILER_CALL) $^ -o $@ execute: ./$(BUILD_DIR)/$(EXECUTABLE_NAME) clean: rm $(BUILD_DIR)/*.o ##rm $(BUILD_DIR)/*.exe $(BUILD_DIR)/%.o: $(SOURCE_DIR)/%.c $(C_COMPILER_CALL) -I $(INCLUDE_DIR) -c $< -o $@ .PHONY: clean build