
LIBRARIES := libThread libEvent libList libInput libAudio libWebSocket

FREETYPEINC := -I/usr/include/freetype2 -I/usr/include/libpng16
SVGINC      := $(shell pkg-config --cflags glib-2.0; pkg-config --cflags librsvg-2.0)
SVGLIB      := $(shell pkg-config --libs glib-2.0; pkg-config --libs librsvg-2.0)


LIBLINK1  := $(patsubst %, -L../%/lib,           $(LIBRARIES))
LIBLINK2  := $(patsubst lib%, -l%,               $(LIBRARIES))
LIBLINK   := $(LIBLINK1) $(LIBLINK2) -lfreetype -lharfbuzz -lpthread -lThread -lasound -lwebsockets -lpam -lpam_misc $(SVGLIB)
LIBINC    := $(patsubst %, -I../%/include,       $(LIBRARIES)) $(FREETYPEINC) $(SVGINC) -Iautogen -Igen_once
LIBDEP    := $(foreach lib, $(LIBRARIES), $(subst LIB,$(lib), ../LIB/lib/LIB.a))

SUFFIXES += .dep

EXECC      := $(wildcard exesrc/*.cc)
LIBCC      := $(wildcard libsrc/*.cc)
SVG        := $(wildcard libsrc/*.svg)
EXEOBJ     := $(patsubst exesrc/%.cc,  obj/%.o,       $(EXECC))
SVGOBJ     += $(patsubst libsrc/%.svg,  obj/%_svg.o,    $(SVG))
LIBCOBJ    := $(patsubst libsrc/%.cc,  obj/%.o,       $(LIBCC))
LIBOBJ     := $(LIBCOBJ)  $(SVGOBJ)
OBJ        := $(EXEOBJ) $(LIBOBJ) 
DEPS       := $(patsubst obj/%.o,      obj/%.dep,  $(EXEOBJ) $(LIBCOBJ))
EXE        := $(patsubst exesrc/%.cc,  exe/%,         $(EXECC))

#FLAGS := -g -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14
#FLAGS := -g -O3 -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14
#FLAGS := -g -O3 -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14

#
# My main testing machine is named "janus".  It's main display is inverted.  This
# makes things inverted for that one machine but not for any others.
#
INVERT_FLAGS := $(shell if [ `hostname` = janus ]; then echo -DINVERT_Y -DINVERT_X; fi)

DEBUG = -O3  # Can be overridden by arguments to make

FLAGS := $(DEBUG) -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14 $(INVERT_FLAGS)

#FLAGS := -g -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14 $(INVERT_FLAGS)
#FLAGS := -O3 -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14 $(INVERT_FLAGS)

#testit:
#	echo FLAGS are $(FLAGS)


default: first autogen/all_svg.hh exe/check_font_symbol_range obj/depend
	make --no-print-directory -f Makefile -f obj/depend lib/libDrawing.a test
	@echo "do \"make run\" to run the stynq drawing demo."

first: obj/flag exe/flag
	if [ ! -d gen_once ]; then g++ -Iautogen -Iinclude ${FREETYPEINC} -o exe/check_font_symbol_range exesrc/check_font_symbol_range.cc -lfreetype; fi
	if [ ! -d gen_once ]; then scripts/generate_font_list.sh; fi

run: obj/flag autogen/all_svg.hh obj/depend
	@make default
	rm -f run.out
	sudo bash -c "setfont -d /usr/share/consolefonts/Uni3-Fixed16.psf.gz </dev/tty4; unbuffer exe/test_stynq_1 2>&1 | tee /dev/tty4" > run.out

run_web: obj/flag autogen/all_svg.hh obj/depend
	@make default
	rm -f run.out
	bash -c "(sleep 1; google-chrome http://localhost)" & sudo bash -c "unbuffer exe/test_stynq_1 -nodisplay 2>&1 | tee run.out"

run_core: default
	sudo bash -c "(ulimit -c unlimited; setfont -d /usr/share/consolefonts/Uni3-Fixed16.psf.gz; exe/test_stynq_1 ) >/dev/tty4 2>&1 </dev/tty4" 

build: obj/flag autogen/all_svg.hh gen_once/fontlist.hh gen_once/fontlist.cc obj/depend
	make --no-print-directory -f Makefile -f obj/depend lib/libDrawing.a

autogen/all_svg.hh: $(SVGOBJ)
	rm -f autogen/all_svg.hh
	(echo "#ifndef ALL_SVG_HH"; echo "#define ALL_SVG_HH"; cat autogen/*_svg_tmp.hh; echo "#endif") >autogen/all_svg.hh
	rm -f autogen/*svg_tmp.hh

obj/fontlist.o: gen_once/fontlist.cc
	g++ -c -o $@ -Iautogen $<

lib/libDrawing.a: lib/flag $(LIBOBJ) obj/fontlist.o
	ar rc $@ $(LIBOBJ) obj/fontlist.o

obj/depend: $(DEPS)
	cat $(DEPS) >obj/depend

obj/flag:
	mkdir -p obj
	touch obj/flag


buildtests: 



exe/flag:
	mkdir -p exe
	touch exe/flag

lib/flag:
	mkdir -p lib
	touch lib/flag

$(DEPS): obj/flag autogen/all_svg.hh 


obj/%_svg.o: libsrc/%.svg
	mkdir -p autogen
	@echo Creating autogen/$*_svg.cc from $<
	@(echo 'unsigned char $*_svg[] = {' ; od -An -t d1 -v -w1 $< | sed 's/$$/,/'; echo "};") >autogen/$*_svg.cc
	@(echo 'extern unsigned char $*_svg[];'; echo "const static int $*_svg_length = "`wc -c <$<`";") >autogen/$*_svg_tmp.hh
	g++ -c autogen/$*_svg.cc -o $@


obj/%.dep: exesrc/%.cc
	g++ $(FLAGS) -MM $< -MT '$(patsubst exesrc/%.cc,obj/%.o,$<)' $< -MF $@

obj/%.dep: libsrc/%.cc
	g++ $(FLAGS) -MM $< -MT '$(patsubst libsrc/%.cc,obj/%.o,$<)' $< -MF $@

obj/%.o: exesrc/%.cc
	g++ -c $(FLAGS) $< -o $@

obj/%.o: libsrc/%.cc
	g++ -c $(FLAGS) $< -o $@


$(EXE): $(LIBDEP) exe/flag lib/libDrawing.a 

$(EXE): exe/% : obj/%.o
	g++ $(FLAGS) -o $@ $< -Llib -lDrawing $(LIBLINK)


clean:
	rm -rf obj exe lib gen vcheck_plot_dir vsynth_dir qsynth_dir test ctest vtest cctest mtest mmtest mextest mmextest ccheck_plot_dir vccheck_plot_dir mcheck_plot_dir mexcheck_plot_dir netlist_analysis tables/temp autogen
	rm -f *~ scripts/*~ libsrc/*~ exesrc/*~ include/*~ testsrc/*~ .DS_Store
	rm -f run.out

onetest:
	@printf "%-67s " "${TESTNAME}:"
	@(cd obj && ( ${COMMAND} ) 2>&1 >"${TESTNAME}.out" || true; for file in ${VERIFIED_OUTPUTS}; do cmp -s $$file ../verified/$$file && echo "   OK            -- " $$file || (echo "   MATCH FAILURE -- " $$file; touch BAD); done)



test: $(EXE)
	@rm -f obj/BAD
	@echo "****************************************************************************************************************************"
	@echo "**                                                                                                                        **"
	@echo "**                                                                                                                        **"
	@echo "**                                               Beginning Tests                                                          **"
	@echo "**                                                                                                                        **"
	@echo "**                                                                                                                        **"
	@echo "****************************************************************************************************************************"
	@#
	@#
	@#make onetest TESTNAME="Standalone Mouse + Drawing Test" COMMAND="g++ ../testsrc/mouse_drawing_test_standalone.cc; ./a.out >USER_VERIFIED_VISUALLY 2>&1" VERIFIED_OUTPUTS="USER_VERIFIED_VISUALLY"
	@#
	@#
	@echo ""
	@if [ ! -f obj/BAD ]; then echo "All tests passed."; fi
	@if [ -f obj/BAD ]; then echo "Some tests failed."; exit 20; fi
	@echo ""

