# Test GNUmakefile (for GNU make)
#
# SYNOPSIS:
#
#   make [all]         - makes everything.
#   make test          - makes everything 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

# iutest root directory
IUTEST_DIR = ../..
IUTEST_INCLUDE = -I$(IUTEST_DIR)/include

# 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_DIR)/include/gtest/switch/*.hpp

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

#
# Unknown Compiler
#
#
STDFLAG = 

endif

endif

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

ifdef NO_CHECK_STRICT
CXXFLAGS += -DIUTEST_CHECK_STRICT=0
endif

ifdef USE_LIB
CXXFLAGS += -DIUTEST_USE_LIB=1 -L../../lib
LDFLAGS += -liutest
endif

MAKEFILE=GNUmakefile

SRCS   = main.cpp

BENCH_SRCS = benchmark_n0.cpp \
             benchmark_n1.cpp \
             benchmark_n2.cpp \
             benchmark_n3.cpp \
             benchmark_n4.cpp \

OBJS   = $(SRCS:%.cpp=%.o) $(BENCH_SRCS:%.cpp=%.o)
TARGET = benchmark
BASIS = basis

#
# build targets.
#

.PHONY: clean default all run test build

default : build

prebuild: $(BENCH_SRCS)
build: $(TARGET)

all : clean build test

clean :
	$(RM) $(TARGET) $(BASIS) benchmark_n*.cpp *.o *.stackdump

check : test
run : test
test : $(TARGET)
	./$<

$(BASIS): test.o
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)

benchmark_n%.cpp: benchmark_base.cpp
	@echo '#define PACKAGENAME benchmark_n$*' | cat - benchmark_base.cpp > $@

.cpp.o : $(IUTEST_HEADERS) $(MAKEFILE)
	$(CXX) $(CPPFLAGS) $(IUTEST_INCLUDE) $(CXXFLAGS) -c $<

$(TARGET): $(OBJS)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)
