
KIOSK_DIR  := ..

KIOSK_INC  := -I$(KIOSK_DIR)/include
KIOSK_LIB  := $(KIOSK_DIR)/lib/libKIOSK.a

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))
WEBOBJ     := obj/webfiles.o
LIBOBJ     := $(LIBCOBJ)  $(SVGOBJ)
OBJ        := $(EXEOBJ) $(LIBOBJ) $(WEBOBJ) 
DEPS       := $(patsubst obj/%.o,      obj/%.dep,  $(EXEOBJ) $(LIBCOBJ))
EXE        := $(patsubst exesrc/%.cc,  exe/%,         $(EXECC))

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)

LIBS       := -lfreetype -lharfbuzz -lpthread -lasound -lwebsockets $(SVGLIB) -lrt -lpam -lpam_misc

#
# 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 -I. $(KIOSK_INC) -std=c++14 $(INVERT_FLAGS)

#FLAGS := g -Wall -Werror -Iinclude -I. $(KIOSK_INC) -std=c++14 $(INVERT_FLAGS)
#FLAGS := -O3 -Wall -Werror -Iinclude -I. $(KIOSK_INC) -std=c++14 $(INVERT_FLAGS)

default: obj/depend
	@unset MAKELEVEL; make -f Makefile -f obj/depend $(EXE)


obj/depend: autogen/demo_app_svg.hh $(DEPS)
	cat $(DEPS) >obj/depend

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

autogen/flag:
	mkdir -p autogen
	touch autogen/flag

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

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 $@

$(OBJ): obj/flag

$(EXE): $(OBJ) exe/flag $(KIOSK_LIB) 

$(EXE): exe/% : obj/%.o
	g++ $(FLAGS) -o $@ $(OBJ) $(KIOSK_LIB) $(LIBS)



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

obj/%_svg.o: libsrc/%.svg autogen/flag
	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/%_webfiles.o: autogen/flag obj/flag

webfiles/manifest.json:
	@scripts/create_favicon.sh

obj/webfiles.o: webfiles/manifest.json
	@echo Creating autogen/webfiles.cc from $< and libsrc/BxB.svg
	@
	@rm -f autogen/webfiles.cc autogen/webfiles.hh webfiles/*~
	@
	@echo "" >>autogen/webfiles.cc
	@echo "#include \"kiosk/protocol_http.hh\"\n" >>autogen/webfiles.cc
	@echo "" >>autogen/webfiles.cc
	@for file in webfiles/*; do filebase=`basename $$file | sed 's/[.-][.-]*/_/g'`; (echo ""; echo "unsigned char webfile_$$filebase[] = {" ; od -An -t u1 -v -w1 $$file | sed 's/$$/,/'; echo "};" ) >>autogen/webfiles.cc; done
	@echo "" >>autogen/webfiles.cc
	@for file in webfiles/*; do filebase=`basename $$file | sed 's/[.-][.-]*/_/g'`; filebase2=`basename $$file`; (echo "const static int webfile_$${filebase}_length = "`wc -c <$$file`";" ) >>autogen/webfiles.cc; done
	@echo "" >>autogen/webfiles.cc
	@for file in webfiles/*; do filebase=`basename $$file | sed 's/[.-][.-]*/_/g'`; filebase2=`basename $$file`; ( echo "static auto_add_http_file auto_add_$$filebase ( \"$$filebase2\", webfile_$${filebase}_length, webfile_$${filebase} );"; ) >>autogen/webfiles.cc; done
	@echo "" >>autogen/webfiles.cc
	g++ $(FLAGS) -c autogen/webfiles.cc -Iinclude -o $@


clean:
	rm -f *~ */*~
	rm -rf exe obj tmp autogen webfiles
