# Tv Makefile
#
# SYNOPSIS:
#
#   make [all]  - makes everything.
#   make TARGET - makes the given target.
#   make clean  - removes all files generated by make.

# iutest root directory
IUTEST_DIR = ../..

# sample code
USER_DIR = ../../samples

# Flags passed to the preprocessor.
CPPFLAGS += -I$(IUTEST_DIR)/include

#
# Flags passed to the C++ compiler.
CXXFLAGS += -g -Wall -Wextra -Wundef
#CXXFLAGS += -DSHOW_FAILURE

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

#
# clang version
#
#

#CXXFLAGS += -std=c++0x
#CXXFLAGS += -std=c++11

else

#
# 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) \>= 7 \)))
# 4.7 later
CXXFLAGS += -std=c++11
else
#ifeq (1,$(shell expr \( $(GCCMAJOR) \> 4 \) \| \( $(GCCMAJOR) \>= 4 \& $(GCCMINOR) \>= 4 \)))
# 4.4 later
#CXXFLAGS += -std=c++0x
#endif
endif

endif

CXXFLAGS += $(DEFS)


# All tests produced by this Makefile.  Remember to add new tests you
# created to the list.
TESTS = sample

# lib
LIBRARY_INSTALL_PATH=$(IUTEST_DIR)/lib
LIBS_ = iutest.a iutest_main.a
LIBS  = $(LIBS_:%=$(LIBRARY_INSTALL_PATH)/lib%)

# All iutest headers.  Usually you shouldn't change this
# definition.
IUTEST_HEADERS = $(IUTEST_DIR)/include/*.hpp \
                 $(IUTEST_DIR)/include/impl/*.ipp \
                 $(IUTEST_DIR)/include/internal/*.hpp \
                 $(IUTEST_DIR)/include/listener/*.hpp \
                 $(IUTEST_DIR)/include/util/*.hpp \
                 $(IUTEST_DIR)/include/gtest/*.hpp
                 
IUTEST_SRCS    = $(IUTEST_DIR)/src/*.cpp \
                 $(IUTEST_HEADERS)

# House-keeping build targets.

.PHONY: clean default all run

all : $(LIBS) $(TESTS)

clean :
	rm -f $(TESTS) $(LIBS) *.o
	
run : $(TESTS)
	./$(TESTS)

# Builds a library
.o.a : $(IUTEST_SRCS)
	$(AR) $(ARFLAGS) $(LIBRARY_INSTALL_PATH)/lib$@ $^

iutest.a : iutest_all.o
	$(AR) $(ARFLAGS) $(LIBRARY_INSTALL_PATH)/lib$@ $^

iutest_all.o : $(IUTEST_DIR)/src/iutest_all.cpp $(IUTEST_SRCS)
	$(CXX) $(CPPFLAGS) -I$(IUTEST_DIR) $(CXXFLAGS) -c $(IUTEST_DIR)/src/iutest_all.cpp

iutest_main.o : $(IUTEST_DIR)/src/iutest_main.cpp $(IUTEST_SRCS)
	$(CXX) $(CPPFLAGS) -I$(IUTEST_DIR) $(CXXFLAGS) -c $(IUTEST_DIR)/src/iutest_main.cpp

$(LIBRARY_INSTALL_PATH):
	@if [ ! -d $(IUTEST_DIR)/libs ]; then \
		mkdir -p $@; \
	fi

$(LIBS) : $(LIBRARY_INSTALL_PATH) $(LIBS_)

# Builds a sample test.  

main.o : $(USER_DIR)/main.cpp $(IUTEST_HEADERS) Makefile
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/main.cpp

sub.o : $(USER_DIR)/sub.cpp $(IUTEST_HEADERS) Makefile
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sub.cpp

$(TESTS) : main.o sub.o
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
