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_SAMPLES = ./test_files TESTDIR = $(TESTDIR_SAMPLES)/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)) # Variables for testing EXEC_LOG = ./exec.log PROGRAM_ARGS := -p 60 -t 2 -n 2 --noconfirm -c -s 999999999 test: @if [ ! -e "$(EXECPATH)" ]; then \ printf -- "[!] Polonium executable (\`$(EXECUTABLE)\`) is not \ available, attempting to build\n"; \ $(MAKE) all; \ exit 0; \ fi @printf -- "[*] Generating corrupted versions of test files\n" @mkdir -p $(TESTDIR) @find $(TESTDIR_SAMPLES) -maxdepth 1 -type f -name 'test.*' | while IFS= \ read -r file; do \ basename=$$(basename "$$file"); \ workfile="$(TESTDIR)/$$basename"; \ cp "$$file" "$$workfile" || exit 1; \ printf -- "--- [*] $(EXECUTABLE) $(basename "$2")$(PROGRAM_ARGS)\n"; \ $(EXECPATH) "$$workfile" $(PROGRAM_ARGS) > $(EXEC_LOG) 2>&1; \ if [ "$$?" -ne "0" ]; then \ printf -- "[!] Polonium failed:\n"; \ cat $(EXEC_LOG); \ rm $(EXEC_LOG); \ exit 1; \ fi; \ rm $(EXEC_LOG); \ done @printf "[>] All done!\n" testclean: $(call rmdirs,$(TESTDIR)) .PHONY: all clean distclean test testclean