# 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

ifdef OUTPUTXML
CXXFLAGS +=-DOUTPUTXML
endif

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

#
# clang version
#
#

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

else

ifeq ($(CXX),g++)

#
# 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

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

MAKEFILE=GNUmakefile CommonMakefile.in

#
# include
#
include CommonMakefile.in

ifdef USE_GTEST
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

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

showcxxversion:
	$(CXX) --version

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

# Builds a sample test.  

ifdef USE_GTEST

GTEST_ROOT_=$(subst \,/,$(GTEST_ROOT))
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 -I$(GTEST_ROOT_)/include $(GTEST_LIB_)

$(TARGET_ALLTESTS) : $(ALLTESTS_SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(ALLTESTS_SRCS) -I$(GTEST_ROOT_)/include $(GTEST_LIB_)

$(TARGETS1) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp -I$(GTEST_ROOT_)/include $(GTEST_LIB_)

$(TARGETS2) : $(SRCS) $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $@.cpp -I$(GTEST_ROOT_)/include

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

