
LIBRARIES := 

LIBLINK1  := $(patsubst %, -L../%/lib,           $(LIBRARIES))
LIBLINK2  := $(patsubst lib%, -l%,               $(LIBRARIES))
LIBLINK   := $(LIBLINK1) $(LIBLINK2)
LIBINC    := $(patsubst %, -I../%/include,       $(LIBRARIES))
LIBDEP    := $(foreach lib, $(LIBRARIES), $(subst LIB,$(lib), ../LIB/lib/LIB.a))


SUFFIXES += .dep

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

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

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

#FLAGS := -O3 -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 -mfpmath=sse -msse2
#FLAGS := -g -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14 -mfpmath=sse -msse2
#FLAGS := -pg -O3 -Wall -Werror -Iinclude -Isrc $(LIBINC) -std=c++14 -mfpmath=sse -msse2

default: obj/flag obj/depend
	make --no-print-directory -f Makefile -f obj/depend lib/libThread.a test

build: obj/depend
	make --no-print-directory -f Makefile -f obj/depend lib/libThread.a

lib/libThread.a: lib/flag $(LIBOBJ)
	ar rc $@ $(LIBOBJ)

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

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/libThread.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
	rm -f *~ scripts/*~ libsrc/*~ exesrc/*~ include/*~ testsrc/*~ .DS_Store


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 ""

