# -------------------------------------------------------------------
# file: makefile
# author: Jean-Michel Richer (jean-michel.richer@univ-angers.fr)
# date: august 2015
# -------------------------------------------------------------------

include makefile.modules

# don't put blanks in PROJECT_NAME
PROJECT_NAME=myproject_makefile
PROJECT_VERSION=v1_0

#default distribution
DISTRIB=debug

# -------------------------------------
# define variables
# -------------------------------------
MAKE=make --no-print-directory
PROJECT_ROOT_DIR=$(shell pwd)


# -------------------------------------
# rules
# -------------------------------------

all: info modules

info:
	@echo "#############################################" 
	@echo " $(PROJECT_NAME) $(PROJECT_VERSION)"
	@echo "- root directory of project"
	@echo "    $(PROJECT_ROOT_DIR)"
	@echo "- distribution"
	@echo "    $(DISTRIB)"
	@echo "#############################################"  


# -------------------------------------------------------------------	
# compile libraries and binaries
# -------------------------------------------------------------------
modules:
	@for module in $(MODULES) ; do \
		if test -f src/$(PROJECT_VERSION)/$$module/makefile.lib ; then \
			$(MAKE) -f makefile.lib -C src/$(PROJECT_VERSION)/$$module PROJECT_ROOT_DIR=$(PROJECT_ROOT_DIR) MODULE=$$module PROJECT_VERSION=$(PROJECT_VERSION) DISTRIB=$(DISTRIB)  ; \
		else \
			$(MAKE) -f makefile.bin -C src/$(PROJECT_VERSION)/$$module PROJECT_ROOT_DIR=$(PROJECT_ROOT_DIR) MODULE=$$module PROJECT_VERSION=$(PROJECT_VERSION) DISTRIB=$(DISTRIB) ; \
		fi ;\
	done

debug:
	@make DISTRIB=debug	

profile:
	@make DISTRIB=profile	

release:
	@make DISTRIB=release

relprof:
	@make DISTRIB=relprof

# -------------------------------------------------------------------
# compile tests
# -------------------------------------------------------------------
tests:
	@for module in $(MODULES) ; do \
		if test -f tst/$(PROJECT_VERSION)/$$module/makefile.tst ; then \
		$(MAKE) -f makefile.tst -C tst/$(PROJECT_VERSION)/$$module PROJECT_ROOT_DIR=$(PROJECT_ROOT_DIR) MODULE=$$module PROJECT_VERSION=$(PROJECT_VERSION) DISTRIB=$(DISTRIB) ; \
		fi ;\
	done

# -------------------------------------------------------------------
# check tests
# -------------------------------------------------------------------

UNIT_TESTS_FILE=$(PROJECT_ROOT_DIR)/build/tests/unit_tests_$(TODAY).txt
UNIT_TESTS_FILE_VALGRIND=$(PROJECT_ROOT_DIR)/build/tests/unit_tests_valgrind.txt
UNIT_TESTS_TMP=$(PROJECT_DIR)/build/tests/tmp.txt

check: $(TARGET)
	@echo `date` >$(UNIT_TESTS_FILE)
	@for module in $(MODULES) ; do \
		if test -d build/tests/$(PROJECT_VERSION)/$$module/$(DISTRIB) ; then \
		echo "run tests for module "$$module ; \
		cd build/tests/$(PROJECT_VERSION)/$$module/$(DISTRIB)/ ; \
		for f in `ls test*.exe` ; do \
			echo "- "$$f ; \
			./$$f >>$(UNIT_TESTS_FILE) 2>/dev/null ; \
		done ; \
		fi ;\
		cd $(PROJECT_ROOT_DIR) ; \
	done
	@echo "check result in file: $(UNIT_TESTS_FILE)"
	@cat $(UNIT_TESTS_FILE) | grep "Failure" || true


# -------------------------------------------------------------------
# clean
# -------------------------------------------------------------------

clean:
	@for module in $(MODULES) ; do \
		if test -f src/$(PROJECT_VERSION)/$$module/makefile.lib ; then \
		$(MAKE) -f makefile.lib clean -C src/$(PROJECT_VERSION)/$$module PROJECT_ROOT_DIR=$(PROJECT_ROOT_DIR) MODULE=$$module PROJECT_VERSION=$(PROJECT_VERSION) DISTRIB=$(DISTRIB) ; \
		else \
		$(MAKE) -f makefile.bin clean -C src/$(PROJECT_VERSION)/$$module PROJECT_ROOT_DIR=$(PROJECT_ROOT_DIR) MODULE=$$module PROJECT_VERSION=$(PROJECT_VERSION) DISTRIB=$(DISTRIB) ; \
		fi ;\
	done
	
clean_debug:
	$(MAKE) clean DISTRIB=debug

clean_release:
	$(MAKE) clean DISTRIB=release

clean_profile:
	$(MAKE) clean DISTRIB=profile
	
clean_relprof:
	$(MAKE) clean DISTRIB=relprof
	
deep_clean:
	@echo "deep clean ..."
	@rm -rf build/*

# -------------------------------------------------------------------
# archive
# -------------------------------------------------------------------
TODAY=$(shell date '+%Y%m%d_%H%M')
PROJECT_ARCHIVE=$(PROJECT_ROOT_DIR)/../$(PROJECT_NAME)_$(TODAY).tgz

archive: deep_clean
	@echo "create archive $(PROJECT_ARCHIVE)"	
	@cd .. ; \
	tar -czf $(PROJECT_ARCHIVE) $(PROJECT_NAME)/* ; \
	cd $(PROJECT_ROOT_DIR)

# -------------------------------------------------------------------
# generate documentation
# use "doxygen -g" to generate config file "Doxyfile"
# -------------------------------------------------------------------	
doc:
	doxygen Doxyfile


