# Test GNUmakefile (for GNU make)
#
# SYNOPSIS:
#
#   make [all]         - makes everything.
#   make test          - makes everything and run.
#   make TARGET        - makes the given target.
#   make run_$(TARGET) - makes the given target and run.
#   make clean         - removes all files generated by make.

# Optimize
#OPTIMIZE += -O2

#
# Flags passed to the C++ compiler.
CXXFLAGS += -g -Wall -Wextra $(OPTIMIZE)

ifdef _DEBUG
CXXFLAGS += -ggdb
endif

ifeq ($(findstring clang, $(CXX)),clang)

#
# clang version
#
#

#STDFLAG += -std=c++0x

else

ifeq ($(CXX),g++)

ifdef USE_COVERAGE
COVERAGE = coveralls
CXXFLAGS += -coverage
endif

#
# GCC version
#
#
GCCVERSION:=$(shell $(CXX) -dumpversion)

dot:=.
empty:=
space:=$(empty) $(empty)
GCCVERSION:=$(subst $(dot),$(space), $(GCCVERSION))
GCCMAJOR:=$(word 1, $(GCCVERSION))
GCCMINOR:=$(word 2, $(GCCVERSION))

ifeq (1,$(shell expr \( $(GCCMAJOR) \> 4 \) \| \( $(GCCMAJOR) \>= 4 \& $(GCCMINOR) \>= 8 \)))
# 4.8 later
STDFLAG += -std=c++1y
else
ifeq (1,$(shell expr \( $(GCCMAJOR) \> 4 \) \| \( $(GCCMAJOR) \>= 4 \& $(GCCMINOR) \>= 7 \)))
# 4.7 later
STDFLAG += -std=c++11
else
#ifeq (1,$(shell expr \( $(GCCMAJOR) \> 4 \) \| \( $(GCCMAJOR) \>= 4 \& $(GCCMINOR) \>= 4 \)))
# 4.4 later
#STDFLAG += -std=c++0x
#endif
endif
endif

else

#
# Unkown Compiler
#
#
STDFLAG = 

endif

endif

ifdef OUTPUTXML
CXXFLAGS +=-DOUTPUTXML
endif

CXXFLAGS += $(DEFS) $(STDFLAG)
LIBS_ = $(LIBS:%=-l%)
LDFLAGS += $(LIBS_)

MAKEFILE=GNUmakefile CommonMakefile.in

#
# include
#
include CommonMakefile.in

ifneq ($(USE_GTEST)$(USE_GMOCK),)
RUN_TARGETS = $(TARGET_ALLTESTS) $(TARGETS1) $(TARGETS2)
else
RUN_TARGETS = $(TARGET_ALLTESTS) $(TARGETS1) $(TARGETS2) $(TARGETS_IUTEST_ONLY)
endif
BUILD_TARGETS = $(RUN_TARGETS) $(BUILD_ONLY)
TARGETS = $(BUILD_TARGETS)

SRCS   = $(BUILD_TARGETS:%=%.cpp)
RUNNER = $(RUN_TARGETS:%=run_%)

#
# build targets.
#

.PHONY: clean default all run test

default : $(TARGETS)

all : clean default test

clean :
	$(RM) $(TARGETS) *.o *.stackdump
ifdef OUTPUTXML
	$(RM) *.xml
endif
ifdef COVERAGE
	$(RM) *.xml *.gcov *.gcno *.gcda
endif

check : test
run : test
test : $(BUILD_ONLY) $(RUNNER)

showcxxversion:
	$(CXX) --version

run_% : %
	@echo $<
ifdef USE_COVERAGE
	./$< $(RUN_OPTION) --iutest_output=xml:$<.xml > /dev/null
else
ifdef OUTPUTXML
	./$< $(RUN_OPTION) --iutest_output=xml:$<.xml
else
	./$< $(RUN_OPTION)
endif
endif

# coverage
ifdef COVERAGE
COVARALLS_EXCLUDE=-e doc -e projects -e samples -e tools
COVARALLS_EXCLUDE_PATTERN  =-E ".*/test/[^\.].*" -E ".*/include/tr1/.*" -E ".*/include/gtest/.*"
# define and constant only header
#COVARALLS_EXCLUDE_PATTERN +=-E ".*iutest_ver\.hpp" -E ".*iutest_config\.hpp" -E ".*iutest_ignore\.hpp"
#COVARALLS_EXCLUDE_PATTERN +=-E ".*iutest_compiler\.hpp" -E ".*iutest_constant\.hpp" -E ".*iutest_util\.hpp"
#COVARALLS_EXCLUDE_PATTERN +=-E ".*iutest_internal\.hpp" -E ".*iutest_pp\.hpp" -E ".*iutest_pragma\.hpp"
#COVARALLS_EXCLUDE_PATTERN +=-E ".*iutest_typelist\.hpp" -E ".*iutest_type_traits\.hpp" -E ".*iutest_typed_util\.hpp"
#COVARALLS_EXCLUDE_PATTERN +=-E ".*iutest_all\.cpp" -E ".*iutest_util_output\.hpp" -E ".*iutest_tuple\.hpp"
COVARALLS_SRCEXT=-x .h -x .hpp -x .cpp -x .ipp
endif

send-coverage:
ifdef COVERAGE
	gcov -v
	gcov -r *.gcda; cd ../; $(COVERAGE) -n -r ./ -b ./test $(COVARALLS_EXCLUDE_PATTERN) $(COVARALLS_EXCLUDE)
endif

# Builds a sample test.  

ifdef USE_GTEST

GTEST_ROOT_=$(subst \,/,$(GTEST_ROOT))
GTEST_INC_=-I$(GTEST_ROOT_)/include
GTEST_LIB_=$(GTEST_ROOT_)/make/gtest-all.o
CXXFLAGS += -DIUTEST_USE_GTEST -DIUTEST_HAS_SOCKET=0

$(BUILD_ONLY) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp $(GTEST_INC_) $(GTEST_LIB_)

$(TARGET_ALLTESTS) : $(ALLTESTS_SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(ALLTESTS_SRCS) $(GTEST_INC_) $(GTEST_LIB_)

$(TARGETS1) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp $(GTEST_INC_) $(GTEST_LIB_)

$(TARGETS2) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp $(GTEST_INC_)

else

ifdef USE_GMOCK

GMOCK_ROOT_=$(subst \,/,$(GMOCK_ROOT))
GMOCK_INC_=-I$(GMOCK_ROOT_)/include -I$(GMOCK_ROOT_)/gtest/include
GMOCK_LIB_=$(GMOCK_ROOT_)/make/gmock-all.o $(GMOCK_ROOT_)/make/gtest-all.o
CXXFLAGS += -DIUTEST_USE_GTEST -DIUTEST_HAS_SOCKET=0

$(BUILD_ONLY) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp $(GMOCK_INC_) $(GMOCK_LIB_)

$(TARGET_ALLTESTS) : $(ALLTESTS_SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(ALLTESTS_SRCS) $(GMOCK_INC_) $(GMOCK_LIB_)

$(TARGETS1) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp $(GMOCK_INC_) $(GMOCK_LIB_)

$(TARGETS2) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp $(GMOCK_INC_)

else

TARGETS_EXCLUDE_ALLTESTS= $(TARGETS1) $(TARGETS2) $(TARGETS_IUTEST_ONLY) $(BUILD_ONLY)
CXXFLAGS += -Werror=undef

ifdef USE_LIB
CXXFLAGS += -DIUTEST_USE_LIB=1 -L../lib
$(TARGET_ALLTESTS) : $(ALLTESTS_SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(ALLTESTS_SRCS) -liutest $(LDFLAGS)

$(TARGETS_EXCLUDE_ALLTESTS) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp -liutest $(LDFLAGS)

else

$(TARGET_ALLTESTS) : $(ALLTESTS_SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(ALLTESTS_SRCS) $(LDFLAGS)

$(TARGETS_EXCLUDE_ALLTESTS) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp $(LDFLAGS)

endif

endif

endif

