LEX = flex
YACC = bison
CC = gcc
CXX = g++
RANLIB = ranlib

VERSION=0.1
RELEASE_ARCHIVE=primeGEM_v$(VERSION).tgz

# Options for flex and bison:
#    Yacc/bison: -d - Write a definition file .h
#                -y - Behave like yacc and write output to y.tab.c. Make's 
#                     implicit rules then mv:s to the proper .c file.
#    Lex/flex:   No options needed, it seems.
YFLAGS = -d -y -p yytree_
LFLAGS = -Pyytree_

DEBUG_DEFS=#-g
OPTIMIZATION=-O3 -funroll-loops -DNDEBUG 
CPPFLAGS=$(OPTIMIZATION) $(DEBUG_DEFS) -Wreorder #-Wall

ifeq ($(shell uname),Darwin)
	MY_LDFLAGS =	-framework accelerate -bind_at_load 
else
	MY_LDFLAGS =	$(LA_LINK) $(SFILE_LINK) #-I/usr/include/ 
endif

TREE=	BranchSwapping.o Node.o Tree.o 
IO=	NHX.o NHXparse.o NHXnode.o NHXtree.o NHXannotation.o 
MCMC=	MCMCModel.o MCMCObject.o SimpleML.o SimpleMCMC.o StdMCMCModel.o 
AUX=	AnError.o Beep.o Density2P_common.o Density2P_positive.o \
	DiscreteGamma.o GammaDensity.o LogNormDensity.o NodeMap.o \
	NodeNodeMap.o NormalDensity.o PerturbationObservable.o PRNG.o \
	Probability.o SetOfNodes.o TreeAnalysis.o TreeIO.o TreeIOTraits.o \
	TreePerturbationEvent.o UniformDensity.o 


OBJS=	troyo.o BirthDeathMCMC.o BirthDeathProbs.o DummyMCMC.o Hacks.o \
	GammaMap.o GuestTreeModel.o InvMRCA.o LambdaMap.o ProbabilityModel.o \
	ReconciliationModel.o StrStrMap.o TopTimeMCMC.o TreeMCMC.o \
	$(IO) $(AUX) $(MCMC) $(TREE)

all: primeGEM

primeGEM: troyo.o $(OBJS) 
	$(CXX) $(CPPFLAGS) -o $@ $^ $(MY_LDFLAGS)


#
# Bundle it up!
#
release: 
release: 
	make clean
	rm -rf /tmp/primeGEM_v$(VERSION)
	mkdir /tmp/primeGEM_v$(VERSION)
	cp `ls|grep -v www|grep -v doc|grep -v tgz|grep -v primeGEM|grep -v \~` /tmp/primeGEM_v$(VERSION)
	cd /tmp; tar -czhf $(RELEASE_ARCHIVE) primeGEM_v$(VERSION)/*
	mv /tmp/$(RELEASE_ARCHIVE) .; #gzip $(RELEASE_ARCHIVE)
	rm -r /tmp/primeGEM_v$(VERSION)
	@echo
	@echo "*** A gzipped tar file is now available! ***"
	@echo

################################################
#
# Important dependencies and special rules
#

NHXparse.h: NHXparse.c NHXparse.y
	$(YACC) $(YFLAGS) NHXparse.y
	mv y.tab.h $@

NHX.l: NHXparse.y NHXparse.h

NHXparse.o: NHXparse.y NHXparse.h


################################################

clean:
	$(RM) *.o y.tab.c NHX.c NHXparse.[ch] troyo
