
#Setting a default configuration if invoked with just "make":
CFG ?= debug

# Config specific settings
ifeq ($(CFG),debug)
CFLAGS += -DDEBUG
else
CFLAGS += -O3 -DNDEBUG
endif

inform:
ifneq ($(CFG),release)
ifneq ($(CFG),debug)
	@echo "Invalid configuration "$(CFG)" specified."
	@echo
	@echo "Possible choices for configuration are 'CFG=release' and 'CFG=debug'"
	@exit 1
endif
endif
	@echo "Configuration "$(CFG)
	@echo "--------------------------------------------------"

rule : dep | inform

BUILD_DIR = build/$(CFG)
OBJS_DIR = $(BUILD_DIR)/objs
#--------------------------------------------------


BINARY=bin
CODEDIRS=. lib
INCDIRS=. ./include/ # can be list

CC=gcc
OPT=-O0
#generate files that encode make rules for the .h dependencies
DEPFLAGS=-MP -MD
#automatically add the -I onto each include directory
CFLAGS=-Wall -Wextra -g $(foreach D,$(INCDIRS),-I$(D)) $(OPT) $(DEPFLAGS)

# for-style iteration (foreach) and regular expression completions (wildcard)
CFILES=$(foreach D, $(CODEDIRS),$(wildcard $(D)/*.c))
# regular expression replacement
OBJECTS=$(patsubst %.c,%.o,$(CFILES))
DEPFILES=$(patsubst %.c,%.d,$(CFILES))

all: $(BINARY)

$(BINARY): $(OBJECTS)
        $(CC) -o $@ $^

all: $(BINARY)

$(BINARY): $(OBJECTS)
	$(CC) -o $@ $^

# only want the .c file dependency here, thus $< instead of $^.
#
%.o:%.c
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -rf $(BINARY) $(OBJECTS) $(DEPFILES)

# shell commands are a set of keystrokes away
distribute: clean
	tar zcvf dist.tgz *

# @ silences the printing of the command
# $(info ...) prints output
diff:
	$(info The status of the repository, and the volume of per-file changes:)
	@git status
	@git diff --stat

# include the dependencies
-include $(DEPFILES)

# add .PHONY so that the non-targetfile - rules work even if a file with the same name exists.
.PHONY: all clean distribute diff