OUTDIR = build

CXXFLAGS += $(shell sdl2-config --cflags) -std=c++14 -Wall -g
CFLAGS += $(shell sdl2-config --cflags)
CPPFLAGS += -I. -I$(OUTDIR) \
	    -I3rdparty/imgui -I3rdparty/glm \
	    -I3rdparty/icon-font-headers \
	    -I3rdparty/ebcl/include \
	    -DREAL_BUILD -DGLM_ENABLE_EXPERIMENTAL
LIBS += $(shell sdl2-config --libs) -lGL -lGLEW -ldl \
	$(LIBEBCL) -latomic

FILEDUMPS =

IMGUI = imgui.cpp imgui_draw.cpp

COMMON = \
	 imgui_impl_sdl.cc \
	 \
	 utilities.cc \
	 texture.cc \
	 rendertarget.cc \
	 camera.cc \
	 colorgrading.cc \
	 \
	 filewatcher.cc \
	 window.cc \
	 globals.cc \
	 profiling.cc \
	 shaders.cc \
	 odbg.cc \
	 \
	 sync.cc \
	 syncoverrides.cc \
	 \
	 ops.cc \
	 opast.cc \
	 opparser.cc \
	 opcomp.cc \
	 opmgr.cc \
# END COMMON

DEMO = \
	 demo.cc \
	 main.cc \
	 syncview.cc \
# END DEMO

PARSERCHECK = \
	 parsercheck.cc \
# END PARSERCHECK


IMGUI_OBJS = $(addprefix $(OUTDIR)/, $(addsuffix .o, $(basename $(IMGUI))))
COMMON_OBJS = $(addprefix $(OUTDIR)/, $(addsuffix .o, $(basename $(COMMON))))
DEMO_OBJS = $(addprefix $(OUTDIR)/, $(addsuffix .o, $(basename $(DEMO))))
PARSERCHECK_OBJS = $(addprefix $(OUTDIR)/, $(addsuffix .o, $(basename $(PARSERCHECK))))
LIBEBCL = $(OUTDIR)/ebcl/libebcorelib.a
PCH=externals.hh.gch

COMMON_DEPS = $(COMMON_OBJS:$(OUTDIR)/%.o=$(OUTDIR)/%.d)
DEMO_DEPS = $(DEMO_OBJS:$(OUTDIR)/%.o=$(OUTDIR)/%.d)
PARSERCHECK_DEPS = $(PARSERCHECK_OBJS:$(OUTDIR)/%.o=$(OUTDIR)/%.d)

COMMON_REQ = $(COMMON_OBJS) $(IMGUI_OBJS)

DEMO_BUILD = $(DEMO_OBJS) $(COMMON_REQ)
PARSERCHECK_BUILD = $(PARSERCHECK_OBJS) $(COMMON_REQ)

ALL_OBJS = $(DEMO_OBJS) $(PARSERCHECK_OBJS) $(COMMON_REQ)
ALL_DEPS = $(COMMON_DEPS) $(DEMO_DEPS) $(PARSERCHECK_DEPS)


all:	demo parsercheck

demo:	$(LIBEBCL) $(DEMO_BUILD)
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o demo \
		$(DEMO_BUILD) $(LIBS)

parsercheck: $(LIBEBCL) $(PARSERCHECK_BUILD)
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o parsercheck \
		$(PARSERCHECK_BUILD) $(LIBS)

clean:
	rm -f $(ALL_OBJS) $(FILEDUMPS) demo parsercheck $(PCH) $(OUTDIR)/font-awesome.inl

fullclean: clean
	@+make -C ebcl fullclean CONFIG=../ebcl-config
	rm -f $(ALL_DEPS) $(OUTDIR)/font-to-c

.PHONY: all clean fullclean


$(FILEDUMPS): fd-%.h: %
	xxd -i $< $@


outdir:
	@if ! [ -d "$(OUTDIR)" ]; then mkdir "$(OUTDIR)"; fi
.PHONY: outdir

#-------------------------------------------------------------------------------

$(IMGUI_OBJS): $(OUTDIR)/%.o: 3rdparty/imgui/%.cpp | outdir
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<

#-------------------------------------------------------------------------------

-include $(DEMO_DEPS)
$(DEMO_OBJS): $(OUTDIR)/%.o: %.cc $(PCH) | outdir $(FILEDUMPS)
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -M -MF $(@:%.o=%.d) -MT $@ $<

#-------------------------------------------------------------------------------

-include $(COMMON_DEPS)
$(COMMON_OBJS): $(OUTDIR)/%.o: %.cc $(PCH) | outdir $(FILEDUMPS)
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -M -MF $(@:%.o=%.d) -MT $@ $<

#-------------------------------------------------------------------------------

-include $(PARSERCHECK_DEPS)
$(PARSERCHECK_OBJS): $(OUTDIR)/%.o: %.cc $(PCH) | outdir $(FILEDUMPS)
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -M -MF $(@:%.o=%.d) -MT $@ $<

#-------------------------------------------------------------------------------

$(LIBEBCL):	ebcl-config
	+make -C 3rdparty/ebcl CONFIG=../../ebcl-config

$(PCH): externals.hh
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<

#-------------------------------------------------------------------------------

$(OUTDIR)/window.o: window.cc $(OUTDIR)/font-awesome.inl

$(OUTDIR)/font-awesome.inl: 3rdparty/font-awesome/fonts/fontawesome-webfont.ttf $(OUTDIR)/font-to-c
	$(OUTDIR)/font-to-c -base85 3rdparty/font-awesome/fonts/fontawesome-webfont.ttf \
		FontAwesome_ >$@

$(OUTDIR)/font-to-c: 3rdparty/imgui/extra_fonts/binary_to_compressed_c.cpp
	$(CXX) -o $@ $<