CC=g++
##CC_OPTIONS=-Wall -O3 -static
CC_OPTIONS=-Wall -O3
CONDOR_CC_OPTIONS=-Wall -O3

binaries=scrm2 fasta2markov pwm2fasta revcomp
scripts=g.py
tests=test-markov test-Distance test-genomic test-PWM test-CRM test-logscale
condor_compilations=scrm2.condor
temporaries=test-*out positive.fa negative.fa candidates.fa W.pfa V.pfa scrm2.dd

Project=scrm2
Version=2.2
Dist=${Project}.v${Version}
Diststuff=*.h *.cpp Makefile ${scripts} doc 

scrm2-project:  ${binaries}
clean:
	/bin/rm -f *.o ${tests} ${temporaries}
distclean:  
	/bin/rm -f *.o ${tests} ${binaries} ${condor_compilations} ${temporaries}
tests: ${tests}
binaries: ${binaries}
all: ${tests} ${binaries}
condor:	${condor_compilations}
dist:
	mkdir ${Dist}
	cp -HLr ${Diststuff} ${Dist}
	tar -h -czf ${Dist}.tar.gz ${Dist}
	/bin/rm -rf ${Dist}
build: distclean all

# Object files
Option.o:	Option.h Option.cpp
	${CC} ${CC_OPTIONS} -c Option.cpp

fasta.o:  fasta.h fasta.cpp
	${CC} ${CC_OPTIONS} -c fasta.cpp

genomic.o:  genomic.h genomic.cpp grid.o
	${CC} ${CC_OPTIONS} -c genomic.cpp

grid.o:  grid.h grid.cpp
	${CC} ${CC_OPTIONS} -c grid.cpp

Timer.o:  Timer.h Timer.cpp
	${CC} ${CC_OPTIONS} -c Timer.cpp

Distance.o:  Distance.h Distance.cpp probability.h cvector.h
	${CC} ${CC_OPTIONS} -c Distance.cpp

CRM.o:  CRM.h CRM.cpp probability.h PWM.h logscale.h markov.h cvector.h
	${CC} ${CC_OPTIONS} -c CRM.cpp

IOExample.o:  IOExample.h IOExample.cpp cvector.h fasta.o CRM.o
	${CC} ${CC_OPTIONS} -c IOExample.cpp

metric.o:  metric.h metric.cpp 
	${CC} ${CC_OPTIONS} -c metric.cpp

io.o:  CRM.h io.cpp PWM.h
	${CC} ${CC_OPTIONS} -c io.cpp

custom.o:  custom.h custom.cpp 
	${CC} ${CC_OPTIONS} -c custom.cpp

scrm2.o:	scrm2.cpp
	${CC} ${CC_OPTIONS} -c scrm2.cpp

# Unit tests
test-CRM:  test-CRM.cpp Option.o genomic.o grid.o fasta.o Timer.o Distance.o CRM.o custom.o  probability.h PWM.h logscale.h markov.h cvector.h
	${CC} ${CC_OPTIONS} -o test-CRM test-CRM.cpp Option.o genomic.o grid.o fasta.o Timer.o CRM.o Distance.o custom.o

test-genomic:	test-genomic.cpp genomic.o Option.o grid.o
	${CC} ${CC_OPTIONS} -o test-genomic test-genomic.cpp Option.o genomic.o grid.o

test-PWM:	test-PWM.cpp PWM.h Option.o grid.o genomic.o logscale.h probability.h
	${CC} ${CC_OPTIONS} -o test-PWM test-PWM.cpp Option.o grid.o genomic.o 

test-logscale:	test-logscale.cpp logscale.h Option.o
	${CC} ${CC_OPTIONS} -o test-logscale test-logscale.cpp Option.o

test-markov:	test-markov.cpp markov.h Option.o genomic.o grid.o logscale.h cvector.h
	${CC} ${CC_OPTIONS} -o test-markov test-markov.cpp Option.o genomic.o grid.o 

test-Distance: 	test-Distance.cpp Distance.o probability.h Option.o 
	${CC} ${CC_OPTIONS} -o test-Distance test-Distance.cpp Distance.o Option.o

# Project executables
scrm2:  scrm2.o Option.o genomic.o grid.o markov.h fasta.o Timer.o CRM.o Distance.o cvector.h IOExample.o metric.o io.o custom.o PWM.h logscale.h probability.h
	${CC} ${CC_OPTIONS} -o scrm2 scrm2.o Option.o genomic.o grid.o fasta.o Timer.o CRM.o  Distance.o IOExample.o metric.o io.o custom.o

fasta2markov:  fasta2markov.cpp markov.h fasta.o Option.o Timer.o genomic.o grid.o logscale.h cvector.h
	${CC} ${CC_OPTIONS} -o fasta2markov fasta2markov.cpp fasta.o Option.o Timer.o genomic.o grid.o 

pwm2fasta:  pwm2fasta.cpp PWM.h Option.o
	${CC} ${CC_OPTIONS} -o pwm2fasta pwm2fasta.cpp  Option.o

revcomp:  revcomp.cpp Option.o genomic.o fasta.o
	${CC} ${CC_OPTIONS} -o revcomp revcomp.cpp Option.o genomic.o fasta.o

scrm2.condor:  scrm2.o Option.o genomic.o grid.o markov.h fasta.o Timer.o CRM.o Distance.o cvector.h IOExample.o metric.o  io.o custom.o PWM.h logscale.h probability.h
	condor_compile ${CC} ${CONDOR_CC_OPTIONS} -o scrm2.condor scrm2.o Option.o genomic.o grid.o fasta.o Timer.o CRM.o Distance.o IOExample.o metric.o io.o custom.o



