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

#
# arm-gcc toolchain
#
TOOL =arm-none-eabi
CC  =$(TOOL)-gcc
CXX =$(TOOL)-g++
LD  =$(TOOL)-ld
AR  =$(TOOL)-ar
OBJCOPY=$(TOOL)-objcopy

# target mcu
#MCU_TARGET ?=cortex-m0

#
# encoding
#
NKF =nkf

# utf8 -> sjis
#CHANGE_ENCODING=yes


#
# iutest
#

# iutest root directory
ifdef CHANGE_ENCODING
IUTEST_DIR = ./iutest
IUTEST_DIR_ORG = ../../
else
IUTEST_DIR = ../../
endif

# sample code
SAMPLE_DIR = $(IUTEST_DIR)/samples
SAMPLE_SRCS = main.cpp \
              assertion.cpp \
              disabledtest.cpp \
              exception.cpp \
              fixture.cpp \
              matcher.cpp \
              parameterized.cpp \
              printto.cpp \
              simple.cpp \
              typed.cpp
              
SAMPLE_OBJS = $(SAMPLE_SRCS:%.cpp=%.o)

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

# LD flags
LIBS_ = $(LIBS:%=-l%)
LDFLAGS += $(LIBS_)
LDFLAGS += -specs=nosys.specs


# Optimize
#OPTIMIZE += -O2

#
# Flags passed to the C++ compiler.
CXXFLAGS += -g -Wall -Wextra -Wundef $(OPTIMIZE)
#CXXFLAGS += -DSHOW_FAILURE
CXXFLAGS += $(DEFS)
ifdef MCU_TARGET
CFLAGS += -mmcu=$(MCU_TARGET)
endif


# 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
LIBRARYS_ = iutest.a iutest_main.a
LIBRARYS  = $(LIBRARYS_:%=$(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 preset

all : $(LIBRARYS) $(TESTS)

clean :
	rm -f $(TESTS) $(LIBRARYS) *.o
ifdef CHANGE_ENCODING
	rm -rf $(IUTEST_DIR)
endif
	
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

$(LIBRARYS) : $(LIBRARY_INSTALL_PATH) $(LIBRARYS_)

# Builds a sample test.  

%.o : $(SAMPLE_DIR)/%.cpp $(IUTEST_HEADERS) Makefile
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<

%.hex : %.elf
	$(OBJCOPY) -O ihex $< $@

sample.elf : $(SAMPLE_OBJS)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)

$(TESTS) : sample.hex

#
# preset
#  avr-gcc not support utf8 ?
#
ifdef CHANGE_ENCODING
preset: 
	rm -rf $(IUTEST_DIR)
	mkdir -p $(IUTEST_DIR)
	mkdir -p $(IUTEST_DIR)/samples
	cp -r $(IUTEST_DIR_ORG)/include $(IUTEST_DIR)/include
	cp -r $(IUTEST_DIR_ORG)/src $(IUTEST_DIR)/src
	cp $(IUTEST_DIR_ORG)/samples/*.cpp $(IUTEST_DIR)/samples
	$(NKF) -s --overwrite $(IUTEST_DIR)/**/*.hpp
	$(NKF) -s --overwrite $(IUTEST_DIR)/**/**/*.hpp
	$(NKF) -s --overwrite $(IUTEST_DIR)/**/**/**/*.hpp
	$(NKF) -s --overwrite $(IUTEST_DIR)/**/**/*.ipp
	$(NKF) -s --overwrite $(IUTEST_DIR)/**/*.cpp

else
preset:

endif