CFA = my-cfa
DEPFLAGS = -MMD -MP

.PHONY: all clean distclean bench

all: c-bench cpp-bench cfa-bench c2-bench cpp2-bench cfa2-bench

# rewrite object generation to auto-determine deps
COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS)
COMPILE.cpp = $(CXX) $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS)
COMPILE.cfa = $(CFA) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS)

c-%.o : c-%.c
c-%.o : c-%.c c-%.d
	$(COMPILE.c) -O0 $(OUTPUT_OPTION) -c $<

cpp-%.o : cpp-%.cpp
cpp-%.o : cpp-%.cpp cpp-%.d
	$(COMPILE.cpp) -O0 $(OUTPUT_OPTION) -c $<

cfa-%.o : cfa-%.c
cfa-%.o : cfa-%.c cfa-%.d
	$(COMPILE.cfa) -O0 $(OUTPUT_OPTION) -c $<

c2-%.o : c-%.c
c2-%.o : c-%.c c-%.d
	$(COMPILE.c) -O2 $(OUTPUT_OPTION) -c $<

cpp2-%.o : cpp-%.cpp
cpp2-%.o : cpp-%.cpp cpp-%.d
	$(COMPILE.cpp) -O2 $(OUTPUT_OPTION) -c $<

cfa2-%.o : cfa-%.c
cfa2-%.o : cfa-%.c cfa-%.d
	$(COMPILE.cfa) -O2 $(OUTPUT_OPTION) -c $<

COBJS = c-stack.o
CPPOBJS = 
CFAOBJS = cfa-stack.o
C2OBJS = $(patsubst c-%,c2-%, $(COBJS))
CPP2OBJS = $(patsubst cpp-%,cpp2-%, $(CPPOBJS))
CFA2OBJS = $(patsubst cfa-%,cfa2-%, $(CFAOBJS))

c-bench: c-bench.c c-bench.d $(COBJS)
	$(COMPILE.c) -O0 -o $@ $< $(COBJS) $(LDFLAGS)

cpp-bench: cpp-bench.cpp cpp-bench.d $(CPPOBJS)
	$(COMPILE.cpp) -O0 -o $@ $< $(CPPOBJS) $(LDFLAGS)

cfa-bench: cfa-bench.c cfa-bench.d $(CFAOBJS)
	$(COMPILE.cfa) -O0 -o $@ $< $(CFAOBJS) $(LDFLAGS)

c2-bench: c-bench.c c-bench.d $(C2OBJS)
	$(COMPILE.c) -O2 -o $@ $< $(C2OBJS) $(LDFLAGS)

cpp2-bench: cpp-bench.cpp cpp-bench.d $(CPP2OBJS)
	$(COMPILE.cpp) -O2 -o $@ $< $(CPP2OBJS) $(LDFLAGS)

cfa2-bench: cfa-bench.c cfa-bench.d $(CFA2OBJS)
	$(COMPILE.cfa) -O2 -o $@ $< $(CFA2OBJS) $(LDFLAGS)

clean:
	-rm $(COBJS) c-bench
	-rm $(CPPOBJS) cpp-bench
	-rm $(CFAOBJS) cfa-bench
	-rm $(C2OBJS) c2-bench
	-rm $(CPP2OBJS) cpp2-bench
	-rm $(CFA2OBJS) cfa2-bench

distclean: clean
	-rm $(COBJS:.o=.d) c-bench.d
	-rm $(CPPOBJS:.o=.d) cpp-bench.d
	-rm $(CFAOBJS:.o=.d) cfa-bench.d

bench: c-bench cpp-bench cfa-bench c2-bench cpp2-bench cfa2-bench
	@echo '## C ##'
	@./c-bench
	@echo '## C++ ##'
	@./cpp-bench
	@echo '## Cforall ##'
	@./cfa-bench
	@echo '## C -O2 ##'
	@./c2-bench
	@echo '## C++ -O2 ##'
	@./cpp2-bench
	@echo '## Cforall -O2 ##'
	@./cfa2-bench

# so make doesn't fail without dependency files
%.d: ;

# so make won't delete dependency files
.PRECIOUS: %.d

# include dependency files
-include: $(COBJS:.o=.d)
-include: $(CPPOBJS:.o=.d)
-include: $(CFAOBJS:.o=.d)
-include: c-bench.d
-include: cpp-bench.d
-include: cfa-bench.d
