# $Id$
-CFLAGS = -Igensrc -ggdb
+ifeq ($(FLAVOR),)
+FLAVOR := gl
+endif
-all: glwrap.so gldump
+CPPFLAGS := -I. -Isource -Iflavors/$(FLAVOR)/source
+CFLAGS := -ggdb -Wall -Wextra
+CXXFLAGS := $(CFLAGS)
-glwrap.so: source/glwrap.o
+PACKAGES_gldbg := mspcore mspstrings mspio mspfs
+
+FLAVOR_ROOT := flavors/$(FLAVOR)
+VPATH := $(FLAVOR_ROOT)
+
+SOURCES_libgldbg := source/gldecoder.c \
+ source/glprint.c \
+ source/enums.c \
+ source/arraysize.c \
+ source/tmpalloc.c \
+ source/packet.c \
+ source/functions.c
+SOURCES_glwrap := source/glwrap.c \
+ source/glwrap_funcs.c \
+ source/arraysize.c \
+ source/packet.c \
+ source/tmpalloc.c
+SOURCES_gldump := source/gldump.c
+SOURCES_gldbg := source/gldbg.cpp \
+ source/commandinterpreter.cpp \
+ source/process.cpp \
+ source/tool.cpp
+SOURCES_tracer := source/tracer.cpp
+SOURCES_profiler := source/profiler.cpp
+SOURCES_inspector := source/inspector.cpp \
+ source/glstate.cpp \
+ source/arraystate.cpp \
+ source/texturestate.cpp \
+ source/bufferstate.cpp
+TEMPLATES := source/functions.enum.t \
+ source/functions.table.t \
+ source/gldecoder.funcs.t \
+ source/gldecoder.struct.t \
+ source/glprint.funcs.t \
+ source/glwrap.funcs.t \
+ source/enums.table.t
+
+rename = $(addprefix $(1)/,$(addsuffix $(2),$(basename $(notdir $(3)))))
+objs = $(call rename,temp,.o,$(1))
+deps = $(call rename,temp,.d,$(1))
+gen = $(call rename,gensrc,,$(1))
+
+.PHONY: all
+all: glwrap.so gldump gldbg
+
+include flavors/$(FLAVOR)/flavor.mk
+
+SOURCES_gldbg += $(foreach tool,$(TOOLS),$(SOURCES_$(tool)))
+GENSOURCES := $(call gen,$(TEMPLATES))
+SOURCES_all := $(sort $(SOURCES_libgldbg) $(SOURCES_glwrap) $(SOURCES_gldump) $(SOURCES_gldbg))
+
+OBJECTS_libgldbg := $(call objs,$(SOURCES_libgldbg))
+OBJECTS_glwrap := $(call objs,$(SOURCES_glwrap))
+OBJECTS_gldump := $(call objs,$(SOURCES_gldump))
+OBJECTS_gldbg := $(call objs,$(SOURCES_gldbg))
+
+OBJECTS_all := $(call objs,$(SOURCES_all))
+DEPS_all := $(call deps,$(SOURCES_all) $(TEMPLATES))
+
+$(OBJECTS_gldbg): CXXFLAGS += $(shell pkg-config --cflags $(PACKAGES_gldbg))
+gldbg: LIBS += $(shell pkg-config --libs $(PACKAGES_gldbg)) -lreadline
+gldump gldbg: LIBS += ./libgldbg.a
+glwrap.so: LDFLAGS += -s
+
+glwrap.so: $(OBJECTS_glwrap) glwrap.ld
$(CC) -shared -o $@ $^ $(LIBS) $(LDFLAGS)
-gldump: source/gldecoder.o source/gldump.o source/glprint.o
+gldump: $(OBJECTS_gldump) libgldbg.a
$(CC) -o $@ $^ $(LIBS) $(LDFLAGS)
-source/glwrap.o: source/functions.h gensrc/functions.enum gensrc/glwrap.funcs
-source/gldecoder.o: source/functions.h gensrc/gldecoder.struct gensrc/gldecoder.funcs gensrc/gldecoder.funcs
-source/gldump.o: source/gldecoder.h gensrc/gldecoder.struct source/glprint.h
-source/glprint.o: gensrc/glprint.funcs gensrc/gldecoder.struct
+gldbg: $(OBJECTS_gldbg) libgldbg.a
+ $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS)
-gensrc/functions.enum gensrc/gldecoder.funcs gensrc/gldecoder.struct gensrc/glwrap.funcs gensrc/glprint.funcs: gensrc/.created genwrap.py gl.spec gl.tm
- python ./genwrap.py
+libgldbg.a: $(OBJECTS_libgldbg)
+ $(AR) rc $@ $^
+
+temp/%.o: source/%.c temp/.created
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<
+
+temp/%.o: source/%.cpp temp/.created
+ $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
+
+temp/.created:
+ mkdir -p temp
+ touch $@
+
+gensrc/%: source/%.t gensrc/.created generate.py
+ python ./generate.py $< $(APIS) >$@
gensrc/.created:
mkdir -p gensrc
touch $@
+
+-include $(DEPS_all)
+
+temp/%.d: source/%.c temp/.created
+ $(CC) $(CPPFLAGS) -MM -MF $@ -MT $(call rename,temp,.o,$<) -MG $<
+
+temp/%.d: source/%.cpp temp/.created
+ $(CXX) $(CPPFLAGS) -MM -MF $@ -MT $(call rename,temp,.o,$<) -MG $<
+
+temp/%.d: source/%.t temp/.created
+ python ./generate.py --depends=$(call rename,gensrc,,$<) $< $(APIS) >$@
+
+.PHONY: clean
+clean:
+ $(RM) $(DEPS_all)
+ $(RM) $(OBJECTS_all)
+ $(RM) gensrc/enums.table $(GENSOURCES)
+ $(RM) glwrap.so libgldbg.a gldump gldbg