# Makefile - Don Yang (uguu.org)
#
# Tested to work on Linux and Cygwin (with MingW)
#
# 05/22/11

ifeq ($(OSTYPE),cygwin)
eext = .exe
cc = i686-w64-mingw32-g++
ld = $(cc) -static
strip = i686-w64-mingw32-strip
else
eext =
cc = g++
ld = $(cc)
strip = strip
endif

ifeq ($(DEBUG),1)
cflags = -Wall -Werror -g -O0 -D_FORTIFY_SOURCE=1
lflags = -g
strip = true
else
cflags = -Wall -Werror -finline-functions -O3 -DNDEBUG
lflags =
endif

target = homura$(eext)
test_result_suffix = .run
test_results = \
	main_test$(test_result_suffix) \
	load_events_test$(eext)$(test_result_suffix) \
	string_pool_test$(eext)$(test_result_suffix) \
	unicode_test$(eext)$(test_result_suffix) \
	write_events_test$(eext)$(test_result_suffix) \
	whitespace_test$(test_result_suffix)
test_targets = \
	load_events_test$(eext) \
	string_pool_test$(eext) \
	unicode_test$(eext) \
	write_events_test$(eext)
sources = \
	load_events.cc \
	load_events_test.cc \
	main.cc \
	string_pool.cc \
	string_pool_test.cc \
	unicode.cc \
	unicode_test.cc \
	write_events.cc \
	write_events_test.cc \
	write_template.cc \
	load_events.h \
	string_pool.h \
	unicode.h \
	util.h \
	write_events.h \
	write_template.h \
	write_template.html \
	build_snapshot.pl \
	compile_template.pl \
	debug_html.pl \
	diff_debug_html.pl \
	get_max_fps.pl \
	generate_long_lines.pl \
	generate_random_input.pl \
	generate_random_line_edits.pl \
	generate_random_utf8_input.pl \
	generate_sorted_lines.pl \
	generate_starfield.pl \
	optimize_log.pl \
	whitespace_test.pl \
	coverage_test.sh \
	last_cursor_position.sh \
	main_test.sh \
	run_valgrind.sh \
	manual.texi \
	record.vim
manual = manual.html

.SUFFIXES: .cc .o .texi .html

.cc.o:
	$(cc) $(cflags) -c $< -o $@

.texi.html:
	texi2html $<


# Output targets
all: $(target)

$(target): main.o load_events.o write_events.o string_pool.o unicode.o write_template.o
	$(ld) $(lflags) $^ -o $@
	$(strip) $@

manual: $(manual)

$(manual): manual.texi


# Unittests
test: $(test_results)

main_test$(test_result_suffix): main_test.sh test_log.txt $(target)
	./$< && touch $@

load_events_test$(eext)$(test_result_suffix): load_events_test$(eext)
	./$< && touch $@

string_pool_test$(eext)$(test_result_suffix): string_pool_test$(eext)
	./$< && touch $@

unicode_test$(eext)$(test_result_suffix): unicode_test$(eext)
	./$< && touch $@

write_events_test$(eext)$(test_result_suffix): write_events_test$(eext)
	./$< && touch $@

whitespace_test$(test_result_suffix): $(sources)
	./whitespace_test.pl $(sources) && touch $@

load_events_test$(eext): load_events_test.o load_events.o unicode.o
	$(ld) $(lflags) $^ -o $@

string_pool_test$(eext): string_pool_test.o string_pool.o
	$(ld) $(lflags) $^ -o $@

unicode_test$(eext): unicode_test.o unicode.o
	$(ld) $(lflags) $^ -o $@

write_events_test$(eext): write_events_test.o write_events.o string_pool.o unicode.o write_template.o
	$(ld) $(lflags) $^ -o $@

coverage:
	./coverage_test.sh


# Build rules
main.o: main.cc load_events.h write_events.h util.h

load_events.o: load_events.cc load_events.h unicode.h util.h

load_events_test.o: load_events_test.cc load_events.h util.h

string_pool.o: string_pool.cc string_pool.h util.h

string_pool_test.o: string_pool_test.cc string_pool.h util.h

unicode.o: unicode.cc unicode.h util.h

write_events.o: write_events.cc write_events.h load_events.h string_pool.h unicode.h write_template.h

write_events_test.o: write_events_test.cc write_events.h util.h

write_template.o: write_template.cc write_template.h

write_template.cc: write_template.html compile_template.pl
	perl compile_template.pl $< $@

write_template.h: write_template.html compile_template.pl
	perl compile_template.pl $< $@


# Maintainence
clean:
	-rm -f write_template.cc write_template.h *.o $(target) $(manual)
	-rm -f *.gcov *.gcno *.gcda core $(test_targets) $(test_results)

backup:
	-rm -f backup.tar.gz
	tar cf backup.tar *.vim *.c *.cc *.h *.pl *.sh *.txt *.log *.html *.texi Makefile
	gzip -9 backup.tar
