BD = run
RD = res
SD = src
CD = test
DD = data
CF = conf
LD = log
BASE = baserun
case := $(shell ls $(CD)) 
casedirs := $(foreach dir,$(case),$(CD)/$(dir)/run)
caseresfiles := $(foreach dir,$(case),$(CD)/$(dir)/res/*)
casexfiles := $(foreach dir,$(case),$(CD)/$(dir)/log/*)
casexfiles2 := $(foreach dir,$(case),$(CD)/$(dir)/data/*.png)
casefiles := $(foreach dir,$(casedirs),$(dir)/'.std)
checkfiles := $(foreach dir,$(casedirs),$(dir)/../check/dgs11a.std)
checks := $(foreach dir,$(casedirs),$(dir)/../check/compare)
datafiles := $(DD)/dgs11a.dat $(DD)/dgs11c.dat
sourcefiles := $(wildcard $(SD)/*)
dataplotfiles := $(DD)/linreg.png 
conffiles := 
runfiles := $(RD)/* $(BD)/dgs11a.par $(BD)/dgs11a.std $(BD)/dgs11a.cor $(BD)/program.log $(BD)/*.RData
logfiles := $(LD)/model.out $(LD)/conf.out $(LD)/plot.out $(LD)/data.out $(LD)/compile.out $(LD)/model.err $(LD)/conf.err $(LD)/plot.err $(LD)/data.err $(LD)/compile.err $(LD)/source.out $(LD)/source.err $(LD)/checkdata.tab $(LD)/checksource.tab
keeprunfiles := ".*/\(dgs11a\|dgs11a.std\|dgs11a.par\|dgs11a.cor\|dgs11a.dat\|program.log\|dgs11a.res\|dgs11a.rep\|model.cfg\|dgs11a.pin\|retro.cfg\|leaveout.cfg\|running.tok\|RETRO.RData\|LO.RData\)"

.SILENT: $(checks) status

.PHONY = clean compile updatetest test runtest data run plot status

clean:
	rm -rf $(runfiles)
	rm -f $(BD)/*
	rm -f $(LD)/*
	touch $(logfiles)
	find . -name '*~' -delete
	rm -rf _tmp 
	rm -f $(checks)
	rm -rf $(casedirs)
	rm -f $(caseresfiles)
	rm -f $(casexfiles) $(casexfiles2) 

compile: $(BD)/dgs11a
$(BD)/dgs11a: $(SD)/dgs11a.tpl 
	rm -rf _tmp
	mkdir _tmp
	cp $^ _tmp
	cd _tmp; admb -s $(@F) 1> ../$(LD)/compile.out 2> ../$(LD)/compile.err
	cp _tmp/$(@F) $(BD)
	rm -rf _tmp

runtest: $(casefiles)
$(casefiles): $(BD)/dgs11a
	mkdir $(@D)
	cd $(@D)/..; make runit

updatetest: $(checkfiles)
$(checkfiles): $(casefiles)
	cd $(@D); cp ../run/dgs11a.std .

test: $(checks)
$(checks): $(casefiles)
	echo 'f1<-readLines("$(@D)/dgs11a.std"); f2<-readLines("$(@D)/../run/dgs11a.std"); ok<-identical(f1,f2); cat(sub("run.*","","$(@D) "),ok,"\n")' | R --slave --vanilla

$(datafiles):

checkalldata: $(LD)/checkdata.tab
$(LD)/checkdata.tab: $(datafiles) $(SD)/datavalidator.R 
	#echo 'source("$(SD)/datavalidator.R"); write.table(check.all("$(DD)"),sep="|",file="$(LD)/checkdata.tab")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err

$(LD)/checkallsource: $(LD)/checksource.tab
$(LD)/checksource.tab: $(sourcefiles) $(SD)/sourcevalidator.R 
	echo 'source("$(SD)/sourcevalidator.R"); write.table(check.all.source("$(SD)"),sep="|",file="$(LD)/checksource.tab")' | R --slave --vanilla 1> $(LD)/source.out 2> $(LD)/source.err

data: $(BD)/dgs11a.dat 
$(BD)/dgs11a.dat: $(datafiles) $(BD)/dgs11a $(SD)/datascript.R 
	echo 'source("$(SD)/datascript.R")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err 

dataplot: $(dataplotfiles)
$(dataplotfiles): $(datafiles) $(SD)/dataplot.R $(SD)/datavalidator.R
	echo 'source("$(SD)/dataplot.R")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err 

defcon: $(conffiles)
$(conffiles): 

checkconf: 

run: $(BD)/dgs11a.std

$(BD)/dgs11a.std: $(BD)/dgs11a $(BD)/dgs11a.dat 
	rm -rf $(runfiles) 
	-cd $(BD); nice -n 15 ./dgs11a -iprint 1 1> ../$(LD)/model.out 2> ../$(LD)/model.err
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete 

updatebase: $(BASE)/dgs11a.std

$(BASE)/dgs11a.std: $(BD)/dgs11a.std
	rm -f $(BASE)/*
	cp $(BD)/dgs11a.par $(BD)/dgs11a.rep $(BD)/dgs11a.res $(BD)/dgs11a.std $(BD)/dgs11a.cor $(BASE)
	echo 'source("src/plotscript.R");' | R --slave --vanilla 1> $(LD)/plot.out 2> $(LD)/plot.err 

plot: $(RD)/footprint

$(RD)/footprint: $(BD)/dgs11a.std $(SD)/plotscript.R
	echo 'source("src/plotscript.R");' | R --slave --vanilla 1> $(LD)/plot.out 2> $(LD)/plot.err 

status: 
	if ${MAKE} -q compile; then echo compile 1; else echo compile 0; fi
	if ${MAKE} -q data; then echo data 1; else echo data 0; fi
	if ${MAKE} -q run; then echo run 1; else echo run 0; fi
	if [ -s "$(LD)/model.err" ] ; then echo runerrors 1; else echo runerrors 0; fi
