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

include ../../utils/xcode.mk
include ../../utils/gccversion.mk
include ../../utils/clangversion.mk
include ../../utils/cygwin.mk
include ../../utils/ci.mk

# 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

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
TARGET_BASE=benchmark_base
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) $(TARGET_BASE) $(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)

$(TARGET_BASE): benchmark_base.o main.o
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)
