#################################################################################
# NAME OF THE MAIN FILE TO COMPILE
#################################################################################
EXT				= .cpp
EXEEXT			= Test
BASENAME0		= camMenu
camMenu			= $(BASENAME0).o
EXE0				= $(BASENAME0).Test
SRC0				= $(EXE0)$(EXT)

#################################################################################
# COMPILER AND LINKER FLAGS AND LIBRARIES
#################################################################################
CC			= g++
INCDIR	= `pkg-config --cflags opencv`
CFLAGS	= -Wall -g3 $(INCDIR)

CL			= g++
LIBDIR	= -lrt -lstdc++ `pkg-config --cflags opencv` `pkg-config --libs opencv`
LFLAGS	= -g3 $(LIBDIR)

#################################################################################
# DEPENDENCIES
#################################################################################
LIBDEPS = $(DEPLIB0) $(DEPLIB1) $(DEPLIB2) $(DEPLIB3) $(DEPLIB4) $(DEPLIB5) $(DEPLIB6) $(DEPLIB7) $(DEPLIB8) $(DEPLIB9) $(DEPLIB10) $(DEPLIB11) $(DEPLIB12)
LIBDIRS = $(DIRLIB0) $(DIRLIB1) $(DIRLIB2) $(DIRLIB3) $(DIRLIB4) $(DIRLIB5) $(DIRLIB6) $(DIRLIB7) $(DIRLIB8) $(DIRLIB9) $(DIRLIB10) $(DIRLIB11) $(DIRLIB12)
OBJDEPS = $(DEPOBJ0) $(DEPOBJ1) $(DEPOBJ2) $(DEPOBJ3) $(DEPOBJ4) $(DEPOBJ5) $(DEPOBJ6) $(DEPOBJ7) $(DEPOBJ8) $(DEPOBJ9) $(DEPOBJ10) $(DEPOBJ11) $(DEPOBJ12)
OBJDIRS = $(DIROBJ0) $(DIROBJ1) $(DIROBJ2) $(DIROBJ3) $(DIROBJ4) $(DIROBJ5) $(DIROBJ6) $(DIROBJ7) $(DIROBJ8) $(DIROBJ9) $(DIROBJ10) $(DIROBJ11) $(DIROBJ12)
DIRS    = $(OBJDIRS) $(LIBDIRS)

.PHONY: all compile makeLibs install clean cleanall cleanDeps cleanProj cleanTemps Tekkotsu reportTarget newstick update docs dox doc cleandoc updateTools updateLibs $(USERLIBS) checkInstallBinTimestamp test help

OBJS		= $($(BASENAME0)) $($(BASENAME1)) $($(BASENAME2)) $($(BASENAME3))
EXES		= $(EXE0) $(EXE1) $(EXE2) $(EXE3) $(EXE4)
OBJSLIBS = $(OBJS) $(LIBNAME) $(LIBDEPS) $(OBJDEPS)
SRCS 		= $(SRC0) $(SRC1) $(SRC2) $(SRC3) $(SRC4)
all		: $(OBJSLIBS)  $(SRCS:$(EXT)=.o) $(EXES)
update	: cleanall all
help		:
	echo "Compile all code. Type: make"
	echo "make in debug mode. Type: make -DEBUG=1"

-include $(OBJS:.o=.d)
-include $(SRCS:$(EXT)=.d)
-include $(OBJDEPS:.o=.d)
-include $(LIBDEPS:.a=.d)

# if make call with make DEBUG=TRUE, DEBUG IS DEFIEND AND NO SILENT MODE ACTIVE
ifeq ($(DEBUG),)
	SILENT=@
	pwdir=""
	DEBUGM="all"
else
	SILENT=
	pwdir="`pwd`: "
	DEBUGM="DEBUG=TRUE"
endif

#################################################################################
# MAKE MAIN EXECUTABLES
#################################################################################
%.$(EXEEXT): %.$(EXEEXT)$(EXT) %.$(EXEEXT).o Makefile $(OBJSLIBS)
	@echo "$(pwdir)Compiling $@"
	$(SILENT)gcc -MM $(CFLAGS) $@$(EXT) > $@.d
	$(SILENT)$(CC) -o $@ $@.o $($(*F)) $(OBJDEPS) $(LIBDEPS) $(CFLAGS) $(LFLAGS)

%.o: %$(EXT) Makefile
	@echo "$(pwdir)Compiling $@"
	$(SILENT)gcc -MM $(CFLAGS) $*$(EXT) > $*.d
	$(SILENT)$(CC) -c $< $(CFLAGS)


#################################################################################
# MAKE LIBRARIES
#################################################################################
$(OBJDEPS): $(OBJDEPS:.o=$(EXT)) $(OBJDEPS:.o=.h)
	@for d in $(*D); do ( echo "$(pwdir)make $$d ... "; if [ -d $$d ]; then cd $$d ; $(MAKE) -s clean 1>/dev/null; $(MAKE) $(DEBUGM); else echo "<ERROR> DIRECTORY '$$d' DOES NOT EXIST"; fi;); done

%.a:
	@for d in $(*D); do ( if [ -d $$d ]; then cd $$d ; $(MAKE) $(DEBUGM); else echo "<ERROR> DIRECTORY '$$d' DOES NOT EXIST"; fi;); done


#################################################################################
# CLEAN
#################################################################################
cleanall : clean cleanLibs

clean:
	@echo "$(pwdir)Cleaning $(BASENAME0) ..."
	rm -f *$(EXEEXT)
	rm -f *.a
	rm -f *.o
	rm -f *.d

cleanLibs:
ifeq ($(REC),)
	@for d in $(DIRS); do (echo "Cleaning $$d"; $(MAKE) -C $$d cleanall); done
else
	@for d in $(DIRS); do ($(MAKE) -C $$d cleanall); done
endif
