# fix OSX crap
#
SHELL=/bin/bash

CC = $(CXX)
CFLAGS = -MMD -O6 -Wall -ffast-math -finline-functions -fomit-frame-pointer -fstrict-aliasing $(GCCFLAGS)
LDFLAGS = -Wall -O6 $(GCCLDFLAGS)
#
# debugging
#
# CFLAGS = -g -O -MMD -Wall -ffast-math -fstrict-aliasing $(GCCFLAGS)
# LDFLAGS = -g -Wall
#
# profiling
#
# CFLAGS = -g -pg -O6 -MMD -Wall -ffast-math -fno-default-inline -fno-inline $(GCCFLAGS)
# CFLAGS = -g -pg -O -MMD -Wall -ffast-math $(GCCFLAGS)
# LDFLAGS = -g -pg

CXXFLAGS = $(CFLAGS) -Wno-deprecated

TARGETS = gibbs-pcfg hastings-pcfg
SOURCES = gammavariate.c gibbs-pcfg.cc hastings-pcfg.cc mt19937ar.c
OBJECTS = $(patsubst %.l,%.o,$(patsubst %.c,%.o,$(SOURCES:%.cc=%.o)))

top: $(TARGETS)

.PHONY: run-test
run-test: gibbs.trace hastings.trace

.PHONY: gibbs.trace
gibbs.trace: gibbs-pcfg testengger.lt testeng.yld
	gibbs-pcfg -d 10 -m 500 -n 1000 -F gibbs.trace testengger.lt < testger.yld

.PHONY: hastings.trace
hastings.trace: hastings-pcfg testengger.lt testeng.yld
	hastings-pcfg -d 10 -m 500 -n 1000 -F hastings.trace testengger.lt < testger.yld

.PHONY: catalan.trace
catalan.trace: gibbs-pcfg catalan.lt catalan.yld
	gibbs-pcfg -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catalan.lt < catalan.yld
	gibbs-pcfg -C 1 -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catalan.lt < catalan.yld
	gibbs-pcfg -C 2 -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catalan.lt < catalan.yld

.PHONY: catlinear.trace
catlinear.trace: gibbs-pcfg catlinear.lt catalan.yld
	gibbs-pcfg -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catlinear.lt < catalan.yld
	gibbs-pcfg -C 1 -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catlinear.lt < catalan.yld
	gibbs-pcfg -C 2 -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catlinear.lt < catalan.yld

.PHONY: catlinear2.trace
catlinear2.trace: gibbs-pcfg catlinear2.lt catalan.yld
	gibbs-pcfg -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catlinear2.lt < catalan.yld
	gibbs-pcfg -C 1 -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catlinear2.lt < catalan.yld
	gibbs-pcfg -C 2 -r $$RANDOM$$RANDOM -a 1 -n 1000000 -d 10 catlinear2.lt < catalan.yld

gibbs-pcfg: gibbs-pcfg.o gammavariate.o mt19937ar.o
	$(CXX) $(LDFLAGS) $^ -o $@

hastings-pcfg: hastings-pcfg.o mt19937ar.o
	$(CXX) $(LDFLAGS) $^ -o $@


gammavariate.o: gammavariate.c
	$(CC) -c $(CFLAGS) $< -o $@

matinv.o: matinv.c
	$(CC) -c $(CFLAGS) $< -o $@

mt19937ar.o: mt19937ar.c
	$(CC) -c $(CFLAGS) $< -o $@

main: main.o sym.o
	$(CXX) $(LDFLAGS) $^ -o $@

.PHONY: 
clean: 
	rm -fr *.o *.d *~ core read-tree.cc *.trace

.PHONY: real-clean
real-clean: clean 
	rm -fr $(TARGETS)

# this command tells GNU make to look for dependencies in *.d files
-include $(patsubst %.l,%.d,$(patsubst %.c,%.d,$(SOURCES:%.cc=%.d)))
