CC ?= gcc DEBUG ?= 0 CFLAGS = -Wall -Werror -Wextra -Wpedantic -std=c99 -Ofast \ -D_POSIX_C_SOURCE=200809L ifeq ($(DEBUG), 1) CFLAGS += -g -DDEBUG endif SRCDIR = ./src INCDIR = ./include OBJDIR = ./obj BINDIR = ./bin TESTDIR = ./test_files/corrupted SRC = $(wildcard $(SRCDIR)/*.c) OBJ = $(SRC:$(SRCDIR)/%.c=$(OBJDIR)/%.o) DEP = $(OBJ:.o=.d) PROGNAME_BASE = polonium PROGNAME_SUFFIX_DEBUG = debug EXECUTABLE = $(PROGNAME_BASE) ifeq ($(DEBUG), 1) EXECUTABLE := $(EXECUTABLE)_$(PROGNAME_SUFFIX_DEBUG) endif EXECPATH = $(BINDIR)/$(EXECUTABLE) all: $(EXECPATH) $(EXECPATH): $(OBJ) @mkdir -p $(@D) $(CC) $(CFLAGS) $^ -o $@ ifeq ($(DEBUG), 0) strip $@* endif -include $(DEP) $(OBJDIR)/%.o: $(SRCDIR)/%.c @mkdir -p $(@D) $(CC) $(CFLAGS) -I$(INCDIR) -MMD -MP -c $< -o $@ define rmfiles_if_exist @for file in $1; do \ if [ -e $$file ]; then \ echo "Removing file $$file"; \ rm $$file; \ fi; \ done endef define rmdirs @for dir in $1; do \ if [ -d "$$dir" ]; then \ if [ -z "$$(find "$$dir" -mindepth 1 -maxdepth 1 -print -quit)" ]; \ then \ echo "Removing empty directory $$dir"; \ else \ echo "Removing non-empty directory $$dir"; \ fi; \ rm -r $$dir; \ fi; \ done endef define rmdirs_if_empty @for dir in $1; do \ if [ -d "$$dir" ]; then \ if [ -z "$$(find "$$dir" -mindepth 1 -maxdepth 1 -print -quit)" ]; \ then \ echo "Removing empty directory $$dir"; \ rm -r $$dir; \ fi; \ fi; \ done endef FILES_TO_REMOVE = $(EXECPATH) $(DEP) $(OBJ) DIRECTORIES_TO_REMOVE = $(BINDIR) $(OBJDIR) clean: $(call rmfiles_if_exist,$(FILES_TO_REMOVE)) $(call rmdirs_if_empty,$(DIRECTORIES_TO_REMOVE)) distclean: $(call rmdirs,$(DIRECTORIES_TO_REMOVE)) testclean: $(call rmdirs,$(TESTDIR)) .PHONY: all clean distclean testclean