CFA = my-cfa
DEPFLAGS = -MMD -MP
CFLAGS = -O2 -flto
CXXFLAGS = $(CFLAGS) --std=c++14

.PHONY: all clean distclean run-c run-cpp run-cfa run

all: c-bench cpp-bench cfa-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) $(OUTPUT_OPTION) -c $<

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

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

COBJS = c-stack.o
CPPOBJS = 
CPPVOBJS = cpp-vstack.o
CFAOBJS = cfa-stack.o

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

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

cpp-vbench: cpp-vbench.cpp cpp-vbench.d $(CPPVOBJS)
	$(COMPILE.cpp) -o $@ $< $(CPPVOBJS) $(LDFLAGS)

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

clean:
	-rm $(COBJS) c-bench
	-rm $(CPPOBJS) cpp-bench
	-rm $(CPPVOBJS) cpp-vbench
	-rm $(CFAOBJS) cfa-bench

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

run-c: c-bench
	@echo '## C ##'
	@./c-bench
	@printf 'source_size:\t%7d lines\n' `cat c-bench.c bench.h c-stack.h c-stack.c | wc -l`
	@printf 'binary_size:\t%7d bytes\n' `wc -c < c-bench`

run-cfa: cfa-bench
	@echo '## Cforall ##'
	@./cfa-bench
	@printf 'source_size:\t%7d lines\n' `cat cfa-bench.c bench.h cfa-stack.h cfa-stack.c | wc -l`
	@printf 'binary_size:\t%7d bytes\n' `wc -c < cfa-bench`

run-cpp: cpp-bench
	@echo '## C++ ##'
	@./cpp-bench
	@printf 'source_size:\t%7d lines\n' `cat cpp-bench.cpp bench.hpp cpp-stack.hpp | wc -l`
	@printf 'binary_size:\t%7d bytes\n' `wc -c < cpp-bench`

run-cppv: cpp-vbench
	@echo '## C++ virtual ##'
	@./cpp-vbench
	@printf 'source_size:\t%7d lines\n' `cat cpp-vbench.cpp bench.hpp object.hpp cpp-vstack.hpp cpp-vstack.cpp | wc -l`
	@printf 'binary_size:\t%7d bytes\n' `wc -c < cpp-vbench`

run: run-c run-cfa run-cpp run-cppv

# 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
