PROJECTNAME=gol
BIN=build/$(PROJECTNAME)
CC=gcc

EXT=c
INCFOLDERS=include lib
RECURSIVE_INCLUDE=false
ifeq ($(RECURSIVE_INCLUDE), true)
	INCDIRS=$(foreach I,$(INCFOLDERS),$(shell find $(I) -type d 2>/dev/null))
else
	INCDIRS=$(INCFOLDERS)
endif

# make mode=release
ifeq ($(mode), release)
	OPT=-O3
else
	OPT=-Og -g
endif
DEPFLAGS=-MP -MD
MACROS=HW PI=3.14
FLAGS=-Wall -Wextra $(foreach F,$(INCDIRS),-I$(F)) $(OPT) $(DEPFLAGS) $(foreach M,$(MACROS),-D$(M))

SRC=$(shell find . -name "*.$(EXT)" -path "./src/*")
OBJ=$(subst ./src/,./build/,$(SRC:.$(EXT)=.o))
LIB=$(shell find . -name "*.$(EXT)" -path "./lib/*")
LIBO=$(subst ./lib/,./build/,$(LIB:.$(EXT)=.o))
TEST=$(shell find . -name "*.$(EXT)" -path "./test/*")
TESTO=$(subst ./test/,./build/,$(TEST:.$(EXT)=.t))

$(shell mkdir -p build)


all : $(BIN)

$(BIN) : $(OBJ) $(LIBO)
	$(CC) $(FLAGS) -o $@ $^

-include $(OBJ:.o=.d) $(LIBO:.o=.d)

build/%.o : src/%.$(EXT)
	@mkdir -p $(@D)
	$(CC) $(FLAGS) -o $@ -c $<
build/%.o : lib/%.$(EXT)
	@mkdir -p $(@D)
	$(CC) $(FLAGS) -o $@ -c $<

# make test file=testGenID.cpp
test : build/$(file).t
	./build/$(file).t

alltest : $(TESTO)
	@for i in $(TESTO); do echo $$i; $$i; done

build/%.t : test/%.$(EXT)
	@mkdir -p $(@D)
	$(CC) $(FLAGS) -o $@ $<

asm : $(OBJ:.o=.s) $(BIN).s

build/%.s : src/%.$(EXT)
	@mkdir -p $(@D)
	$(CC) $(FLAGS) -S $< -o $@

$(BIN).s : $(BIN) 
	objdump -drwC -Mintel -S $< > $<.s

preprocess : $(OBJ:.o=.i)

build/%.i : src/%.$(EXT)
	@mkdir -p $(@D)
	$(CC) $(FLAGS) -E $< -o $@

gigall : $(BIN) $(TESTO) asm preprocess

# make run input="program input"
run : $(BIN)
	./$< $(input)

clean :
	rm -rf build/*

check :
	cppcheck --enable=all --suppress=missingIncludeSystem $(foreach I,$(INCDIRS),-I$(I)) .
	flawfinder .

debug : $(BIN)
	gdb $< $(input)

# unzip : tar -xvf exemple.tgz
dist : clean
	$(info /!\ project folder has to be named $(PROJECTNAME) /!\ )
	cd .. && tar zcvf $(PROJECTNAME)/build/$(PROJECTNAME).tgz $(PROJECTNAME) >/dev/null

push :
	git push bbsrv
	git push gh

install : dist
	cp Makefile ../script
	mv build/$(PROJECTNAME).tgz ../opt/archive
	cd .. && rm -rf $(PROJECTNAME)

info :
	$(info put what ever)
	@echo you want

# alias

r : run

t : test

c : check

p : push

d : debug

.PHONY : all test t alltest asm preprocess gigall run r clean check c debug d dist push p install info