# Change the value of the INSTALLDIR variable to change the install location.
INSTALLDIR=$(HOME)/research/sat

DEBUG_FLAGS=-O3
#DEBUG_FLAGS=-O3 -ffast-math			# This GCC option can improve performance
#DEBUG_FLAGS=-g -O3
#DEBUG_FLAGS=-g -O3 -pg

#USE_EFENCE=1
#USE_MPATROL=1

#ifdef USE_MPATROL
#	MEM_DEBUG=-umalloc -ufree -ucalloc -urealloc -uvalloc -umemalign -lmpatrol -lbfd -liberty
#endif

#ifdef USE_EFENCE
#	MEM_DEBUG=-umalloc -ufree -ucalloc -urealloc -uvalloc -umemalign -lefence
#	EF_PROTECT_BELOW=1
#endif


LIBS=$(CCMALLOC_FLAGS) $(MEM_DEBUG) -lm
CC_FLAGS=-Wall $(DEBUG_FLAGS)
#CC_FLAGS=-ansi -Wall -pedantic $(DEBUG_FLAGS)
#CC_FLAGS=-ansi -Wall -pedantic -Wstrict-prototypes -Wmissing-prototypes $(DEBUG_FLAGS)
CC=gcc $(CC_FLAGS) 

DLMDIR=SAT_DLM_2000/SRC

STD_EXES=gsat sa hsat wsat wsat-g wsat-b novel pnovel sdfflt esg asg cnf2cop
STD_DOCS=README CHANGES gpl.txt
STAT_SRC=mobility1.c mobility2.c mobility3.c copysoln.c assigndump.c unsat1.c

all: $(STD_EXES) dlm2k-quiet

ob: sdfflt-noisy25 sdfflt-noisy5 dlm2k-noisy25 dlm2k-noisy5

readcnf.o: readcnf.c readcnf.h
	$(CC) -c readcnf.c

satfront.o: satfront.c satfront.h readcnf.h
	$(CC) -c satfront.c

mbflip.o: mbflip.c  mbflip.h
	$(CC) -c mbflip.c

msat.o: msat.c msat.h readcnf.h satfront.h $(STAT_SRC)
	$(CC) -c msat.c

mwsat.o: mwsat.c msat.h readcnf.h satfront.h $(STAT_SRC)
	$(CC) -c mwsat.c

mwsat: mwsat.o msat.o satfront.o readcnf.o
	$(CC) -o mwsat satfront.o readcnf.o msat.o mwsat.o $(LIBS)

wsat-skc.o: wsat.c mbflip.h mbflipimpl.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -DWSATSKC -o wsat-skc.o -c wsat.c

wsat: wsat-skc.o mbflip.o satfront.o readcnf.o
	$(CC) -o wsat satfront.o readcnf.o wsat-skc.o mbflip.o $(LIBS)

wsat-g.o: wsat.c mbflip.h mbflipimpl.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -DWSATG -o wsat-g.o -c wsat.c

wsat-g: wsat-g.o mbflip.o satfront.o readcnf.o
	$(CC) -o wsat-g satfront.o readcnf.o wsat-g.o mbflip.o $(LIBS)

wsat-b.o: wsat.c mbflip.h mbflipimpl.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -DWSATB -o wsat-b.o -c wsat.c

wsat-b: wsat-b.o mbflip.o satfront.o readcnf.o
	$(CC) -o wsat-b satfront.o readcnf.o wsat-b.o mbflip.o $(LIBS)

gsat.o: gsat.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -c gsat.c

gsat: gsat.o satfront.o readcnf.o
	$(CC) -o gsat satfront.o readcnf.o gsat.o $(LIBS)

hsat.o: hsat.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -c hsat.c

hsat: hsat.o satfront.o readcnf.o
	$(CC) -o hsat satfront.o readcnf.o hsat.o $(LIBS)

sa.o: sa.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -c sa.c

sa: sa.o satfront.o readcnf.o
	$(CC) -o sa satfront.o readcnf.o sa.o $(LIBS)

pnovel.o: novel.c mbflip.h mbflipimpl.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -DNOVELTY_PLUS -o pnovel.o -c novel.c

pnovel: pnovel.o satfront.o readcnf.o mbflip.o
	$(CC) -o pnovel satfront.o readcnf.o pnovel.o mbflip.o $(LIBS)

novel.o: novel.c mbflip.h mbflipimpl.c readcnf.h satfront.h $(STAT_SRC)
	$(CC) -o novel.o -c novel.c

novel: novel.o satfront.o readcnf.o mbflip.o
	$(CC) -o novel satfront.o readcnf.o novel.o mbflip.o $(LIBS)

cop.o: cop.c satfront.h cop.h
	$(CC) -c cop.c

esg.o: esg.c satfront.h cop.h
	$(CC) -c esg.c

esg: esg.o satfront.o cop.o
	$(CC) satfront.o cop.o esg.o -o esg $(LIBS)

asg.o: asg.c satfront.h cop.h $(STAT_SRC)
	$(CC) -c asg.c

asg: asg.o satfront.o cop.o
	$(CC) satfront.o cop.o asg.o -o asg $(LIBS)

sdfflt.o: sdfflt.c satfront.h readcnf.h $(STAT_SRC)
	$(CC) -c sdfflt.c

sdfflt: sdfflt.o satfront.o readcnf.o
	$(CC) satfront.o readcnf.o sdfflt.o -o sdfflt $(LIBS)

sdfflt-noisy25.o: sdfflt.c satfront.h readcnf.h $(STAT_SRC)
	$(CC) -c sdfflt.c -o sdfflt-noisy25.o -DADD_NOISE -DADDED_NOISE=0.25

sdfflt-noisy25: sdfflt-noisy25.o satfront.o readcnf.o
	$(CC) satfront.o readcnf.o sdfflt-noisy25.o -o sdfflt-noisy25 $(LIBS)

sdfflt-noisy5.o: sdfflt.c satfront.h readcnf.h $(STAT_SRC)
	$(CC) -c sdfflt.c -o sdfflt-noisy5.o -DADD_NOISE -DADDED_NOISE=0.5

sdfflt-noisy5: sdfflt-noisy5.o satfront.o readcnf.o
	$(CC) satfront.o readcnf.o sdfflt-noisy5.o -o sdfflt-noisy5 $(LIBS)

# The following three rules are used to avoid displaying unnecessary 
# command messages when the DLM source is not available.
.POSIX:
.SILENT: dlm2k dlm2k.o DLMSAT.o dlm2k-quiet

$(DLMDIR)/DLMSAT.c dlmsat.o : ;

dlm2k.o: dlm2k.c satfront.h readcnf.h
	if [ -r $(DLMDIR)/DLMSAT.c ] ; then $(CC) -c dlm2k.c; fi

DLMSAT.o:	$(DLMDIR)/DLMSAT.c dlmparams/assigndump-dlm.c dlmparams/mobility1-dlm.c dlmparams/mobility2-dlm.c dlmparams/mobility3-dlm.c satfront.h
	if [ -r $(DLMDIR)/DLMSAT.c ] ; then $(CC) -c $(DLMDIR)/utility.c $(DLMDIR)/DLMSAT.c $(DLMDIR)/ran2.c $(DLMDIR)/cputime.c ; fi

dlm2k: dlm2k-quiet
	if [ -r DLMSAT.o ] ; then echo "DLM source found.  Building."; else echo "DLM sources not found.  See dlmparams/README." ; fi

dlm2k-quiet: dlm2k.o satfront.o DLMSAT.o
	if [ -r DLMSAT.o ] ; then $(CC) satfront.o dlm2k.o DLMSAT.o cputime.o ran2.o utility.o -o dlm2k $(LIBS) ; fi

DLMSAT-noisy25.o:	$(DLMDIR)/DLMSAT.c dlmparams/assigndump-dlm.c dlmparams/mobility1-dlm.c dlmparams/mobility2-dlm.c dlmparams/mobility3-dlm.c satfront.h
	$(CC) -o DLMSAT-noisy25.o -c $(DLMDIR)/DLMSAT.c -DADD_NOISE -DADDED_NOISE=0.25

dlm2k-noisy25: dlm2k.o satfront.o DLMSAT.o DLMSAT-noisy25.o
	$(CC) satfront.o dlm2k.o DLMSAT-noisy25.o cputime.o ran2.o utility.o -o dlm2k-noisy25 $(LIBS)

DLMSAT-noisy5.o:	$(DLMDIR)/DLMSAT.c dlmparams/assigndump-dlm.c dlmparams/mobility1-dlm.c dlmparams/mobility2-dlm.c dlmparams/mobility3-dlm.c satfront.h
	$(CC) -o DLMSAT-noisy5.o -c $(DLMDIR)/DLMSAT.c -DADD_NOISE -DADDED_NOISE=0.5

dlm2k-noisy5: dlm2k.o satfront.o DLMSAT.o DLMSAT-noisy5.o
	$(CC) satfront.o dlm2k.o DLMSAT-noisy5.o cputime.o ran2.o utility.o -o dlm2k-noisy5 $(LIBS)

churn: churn.c
	$(CC) -o churn churn.c $(LIBS)

cnf2cop: cnf2cop.c
	$(CC) -o cnf2cop cnf2cop.c $(LIBS)

dlmdiff:
	diff dlmparams/DLMSAT.org SAT_DLM_2000/SRC/DLMSAT.c > dlmparams/dlm2kpatch.diff

install-scripts:
	if [ $(PWD) = $(INSTALLDIR) ] ; then echo; echo; echo "Cannot install to the directory in which you unpacked/built." ; echo "Either move the build directory or change the install directory."; exit 1; fi
	mkdir -p $(INSTALLDIR)/scripts
	mkdir -p $(INSTALLDIR)/scripts/dlmparams
	cp dlmparams/dlmpara-? $(INSTALLDIR)/scripts/dlmparams
	cp scripts/racing $(INSTALLDIR)/scripts
	cp scripts/meta* $(INSTALLDIR)/scripts
	cp `grep -l -d skip BASE_NAME scripts/*` $(INSTALLDIR)/scripts
	chmod u+x $(INSTALLDIR)/scripts/*

install-bin:
	if [ $(PWD) = $(INSTALLDIR) ] ; then echo; echo; echo "Cannot install to the directory in which you unpacked/built." ; echo "Either move the build directory or change the install directory."; exit 1; fi
	mkdir -p $(INSTALLDIR)/bin
	mkdir -p $(INSTALLDIR)/bin/dlmparams
	cp $(STD_EXES) $(INSTALLDIR)/bin
	cp turnon turnoffall turnononly $(INSTALLDIR)/bin
	if [ -r dlm2k ] ; then cp dlm2k $(INSTALLDIR)/bin ; fi;
	cp dlmparams/dlmpara-? $(INSTALLDIR)/bin/dlmparams
	chmod u+x $(INSTALLDIR)/bin/*

install: install-bin install-scripts
	mkdir -p $(INSTALLDIR)/cnf
	mkdir -p $(INSTALLDIR)/cop
	mkdir -p $(INSTALLDIR)/results

archive:
	mkdir esgsat
	cp mbflip.h mbflip.c mbflipimpl.c churn.h cop.h readcnf.h satfront.h esgsat
	cp asg.c churn.c cnf2cop.c cop.c countrank.c dlm2k.c esgsat
	cp gsat.c hsat.c esgsat
	cp esg.c readcnf.c sa.c satfront.c sdfflt.c novel.c wsat.c esgsat
	cp Makefile esgsat
	cp $(STD_DOCS) esgsat
	cp $(STAT_SRC) esgsat
	cp rankem turnon turnoffall turnononly esgsat
	mkdir esgsat/dlmparams
	cp dlmparams/dlmpara-? dlmparams/README dlmparams/dlm-para.txt esgsat/dlmparams
	cp dlmparams/unsat1-dlm.c dlmparams/dlm2kpatch.diff dlmparams/patchdlm esgsat/dlmparams
	cp dlmparams/assigndump-dlm.c dlmparams/mobility?-dlm.c esgsat/dlmparams
	mkdir esgsat/scripts
	mkdir esgsat/scripts/dlmparams
	cp scripts/uf* esgsat/scripts
	cp scripts/meta-uf? esgsat/scripts
	cp scripts/racing esgsat/scripts
	cp dlmparams/dlmpara-? esgsat/scripts/dlmparams
	chmod u+x $(INSTALLDIR)/scripts/*
	tar zcvf esgsat.tar.gz esgsat
	rm -rf esgsat

clean:
	rm -f *.o
	rm -f $(STD_EXES)
	rm -f churn countrank
	rm -f dlm2k
	rm -f sdfflt-noisy25 sdfflt-noisy5
	rm -f dlm2k-noisy25 dlm2k-noisy5