definitions:
	Holmake lts_memory_modelTheory.uo axiomatic_memory_modelTheory.uo typesettingTheory.uo moretypesettingTheory.uo

checker:
	cd proofs && Holmake executable_checkerTheory.uo
	cd proofs/ocaml; ocamlbuild -I Caml executable_checkerML.o

proof:
	cd proofs && Holmake lts_axiomatic_equivTheory.uo correct_typesettingTheory.uo lts_erasureTheory.uo linear_valid_executionTheory.uo  

clean:
	Holmake cleanAll
	cd proofs && Holmake cleanAll

# clean removes the Holmake-generated files only.  make realclean is
# defined below; it removes also all the document-related files

all:
	make definitions
	##make checker
	make proof
	make holdoc-tools
	make install-alldoc-tso
	#cd ../doc; make x86tso-paper.pdf



################################################################
#                                                              #
#  HolDoc typesetting generation and spec tarball construction #
#                                                              #
################################################################

HOLDOCDIR=../HOLDoc
LTSHOLDOCDIR=../HOLDoc_Net

holdoc-tools:
	cd ${HOLDOCDIR}; make 
	cd ${LTSHOLDOCDIR}; make 

# to make the documents with "make alldoc-tso", one has to "make definitions" first, to run HOL on the definition files in order to generate the imn files

alldoc-tso: alldoc-tso.ps alldoc-tso.pdf

install-alldoc-tso: alldoc-tso-inc.tex alldoc-tso.ps glommed-imn-tso.imn
	cp -f alldoc-tso-inc.tex ../doc/generated_alldoc
	cp -f alldoc-tso.ps ../doc/generated_alldoc
	cp -f glommed-imn-tso.imn ../doc/generated_alldoc

tarball: tarball-tso-spec-public.tar.gz

install-tarball: tarball-tso-spec-public.tar.gz
	rm -rf ~pes20/public_html/weakmemory/tarball-tso-spec-public*
	cp -f tarball-tso-spec-public.tar.gz ~pes20/public_html/weakmemory
	cd ~pes20/public_html/weakmemory ; tar -zxvf tarball-tso-spec-public.tar.gz

LATEX=latex
PDFLATEX=extra_mem_top=1000000 pdflatex
DVIPS=dvips
PSTOPDF=ps2pdf

LTS_TO_LATEX=$(LTSHOLDOCDIR)/lts_to_latex
MNG_TO_LATEX=${HOLDOCDIR}/mng_to_latex

DVIPSFLAGS=-t a4 -Ppdf -j1 -G0

# IMNFILES order may be significant.
IMNFILESTSO=x86_auto_tso.imn  x86_extraimn.imn x86_typeabbrev_tso.imn #util.imn
#x86_.imn
EXTRATEXINPUTS=${HOLDOCDIR}:$(LTSHOLDOCDIR)
OTHERTEXFILES=

# lists of files:


# TSOSPECTHEORYFILES are the for-public-consumption files to be typeset
#  (listed here in a sensible order)

TSOSPECTHEORYFILES=\
axiomatic_memory_modelScript.sml \
typesettingScript.sml \
moretypesettingScript.sml\
lts_memory_modelScript.sml\
proofs/lts_erasureScript.sml\
proofs/linear_valid_executionScript.sml\
proofs/lts_traceScript.sml\
proofs/lts_axiomatic_equivScript.sml\
proofs/executable_checkerScript.sml\
proofs/correct_typesettingScript.sml


#TSOSPECDEFNPUBLICFILES are the toplevel defn files, to be included in the tarball
TSOSPECDEFNPUBLICFILES=\
axiomatic_memory_modelScript.sml \
typesettingScript.sml \
moretypesettingScript.sml\
lts_memory_modelScript.sml\

# TSOSPECPROOFPUBLICFILES are the proof/ public files, to be included in the tarball
TSOSPECPROOFPUBLICFILES= \
basic_lemmasScript.sml         linear_valid_executionScript.sml  lts_traceScript.sml  utilScript.sml correct_typesettingScript.sml lts_axiomatic_equivHand executable_checkerScript.sml   lts_axiomatic_equivScript.sml     utilLib.sig Holmakefile                    lts_erasureScript.sml             utilLib.sml 

# TSOSPECOTHERPUBLICFILES are the other toplevel public files, to be included in the tarball
TSOSPECOTHERPUBLICFILES=    \
HolDoc.sig                  \
HolDoc.sml		    \
Holmakefile		    \
Makefile		    \
Net_Hol_reln.sig	    \
Net_Hol_reln.sml	    \
README			    \
set_relationScript.sml      


TSOSPECTHEORIES=$(patsubst %Script.sml,%,$(TSOSPECTHEORYFILES))
TSOSPECTHEORYIMNS=$(addsuffix .imn, $(TSOSPECTHEORIES))
TSOSPECTHEORYPSFILES=$(addsuffix -doc.ps, $(TSOSPECTHEORIES))
TSOSPECTHEORYPDFFILES=$(addsuffix -doc.pdf, $(TSOSPECTHEORIES))


TSOSPECPUBLICFILES=$(TSOSPECDEFNPUBLICFILES) $(TSOSPECOTHERPUBLICFILES)


reheader: LICENSE
	headache -h LICENCE $(TSOSPECDEFNPUBLICFILES) Holmakefile set_relationScript.sml
	cd proofs; headache -h LICENCE $(TSOSPECPROOFPUBLICFILES)

tarball-tso-spec-public.tar.gz: alldoc-tso.ps alldoc-tso.pdf
	rm -rf tarball-tso-spec-public*
	mkdir tarball-tso-spec-public
	mkdir tarball-tso-spec-public/proofs
	cp $(TSOSPECPUBLICFILES) tarball-tso-spec-public
	cd proofs; cp $(TSOSPECPROOFPUBLICFILES) ../tarball-tso-spec-public/proofs
	svn status -v $(TSOSPECPUBLICFILES) > tarball-tso-spec-public/VERSIONS-spec-public
	cp Makefile  tarball-tso-spec-public/Makefile
	cp alldoc-tso.ps alldoc-tso.pdf tarball-tso-spec-public/
	tar -cvf tarball-tso-spec-public.tar tarball-tso-spec-public
	gzip tarball-tso-spec-public.tar



HOLTHEORIES=$(patsubst %Script.sml,%,$(wildcard *Script.sml))

# Theories that don't generate .imn files:
NONIMNTHEORIES=integer_word32 LetCompute

HOLTHEORYIMNS=$(addsuffix .imn, $(filter-out $(NONIMNTHEORIES), $(HOLTHEORIES)))

## hack to generate brief table of contents
BRIEFTOC='Contents|Index|{part}'   # {chapter}|{section}|{bchy}'


#
# hack from GNU Make manual, to set $(space) to a single space:
#
nullstring :=
space := $(nullstring) # end of the line




# .imn files contain identifier information for use by lts_to_latex
# They are produced as follows.
#
# .imn files from the HOL theories, the $(TSOSPECTHEORYIMNS), e.g. 
# axiomatic_memory_model.imn, are made when HOL builds the theories 
# (by the HolDoc package)
# 
# x86_auto_tso.imn is made by a target below that concatenates 
# the $(TSOSPECTHEORYIMNS)
# 
# x86_typeabbrev_tso.imn is made by a target below that pulls out 
# HOL type abbreviations from $(TSOSPECTHEORYFILES) (using sed)
# 
# x86_extraimn.imn is some hand-written extra imn configuration, e.g. for
# HOL library identifiers

glommed-imn-tso.imn: $(EXTRAIMNFILES) $(IMNFILESTSO)
	cat $(EXTRAIMNFILES) $(IMNFILESTSO) > glommed-imn-tso.imn


# Intermediate tex files - lts_to_latex is used to build:
#
# %.tmp2-tex  for standalone alldoc-tso.pdf
# %.tmp3-tex  for includable alldoc-tso-inc.tex



%.tmp-tex : %Script.sml $(if ${FAST},,${IMNFILES}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX) $(EXTRAIMNFILES) $(IMNFILES) $< > $@



# special-case the tex generation for some of the tso files 

typesetting.tmp2-tex : typesettingScript.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX)  -nocmds -texprefix  -nomerge $(EXTRAIMNFILES) $(IMNFILESTSO) typesettingScript.sml > $@

typesetting.tmp3-tex : typesettingScript.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX)  -bodies -texprefix "Typesetting" -cmds -nomerge $(EXTRAIMNFILES) $(IMNFILESTSO) typesettingScript.sml > $@
#-bodies

moretypesetting.tmp2-tex : moretypesettingScript.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX)  -nocmds -texprefix  -nomerge $(EXTRAIMNFILES) $(IMNFILESTSO) moretypesettingScript.sml > $@

moretypesetting.tmp3-tex : moretypesettingScript.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX)  -bodies  -texprefix "Typesetting" -cmds -nomerge $(EXTRAIMNFILES) $(IMNFILESTSO) moretypesettingScript.sml > $@
#-bodies

typesetting_proofs.tmp2-tex : typesetting_proofsScript.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX)  -nocmds -nomerge $(EXTRAIMNFILES) $(IMNFILESTSO) typesetting_proofsScript.sml > $@

typesetting_proofs.tmp3-tex : typesetting_proofsScript.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX)  -bodies -texprefix "" -cmds -nomerge $(EXTRAIMNFILES) $(IMNFILESTSO) typesetting_proofsScript.sml > $@
#-bodies





# non-special cases

%.tmp2-tex : %Script.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX) -nocmds $(EXTRAIMNFILES) $(IMNFILESTSO) $< > $@

%.tmp3-tex : %Script.sml $(if ${FAST},,${IMNFILESTSO}) ${LTS_TO_LATEX}
	$(LTS_TO_LATEX) -bodies -texprefix "" -cmds -nomerge $(EXTRAIMNFILES) $(IMNFILESTSO) $< > $@


alldoc-tso.tex : alldoc-tso-pre.template alldoc-between.template alldoc-post.template $(addsuffix .tmp2-tex, $(TSOSPECTHEORIES))
	(echo "% auto-generated file; do not edit"; \
	cat alldoc-tso-pre.template; \
	for f in $(TSOSPECTHEORIES); do \
		h=`basename $$f`;\
		g=`echo $$h | sed -e 's/_/\\\\\\\\protect\\\\\\\\textunderscore /g'`; \
		cat alldoc-between.template | sed -e "s/THEORYNAME/$$g/g"; \
		cat $$f.tmp2-tex; \
	done; \
	cat alldoc-post.template \
	) > $@


junk-all.tex : alldoc-tso-pre.template alldoc-between.template alldoc-post.template junk.tex
	cat alldoc-tso-pre.template junk.tex  alldoc-post.template  > junk-all.tex 


alldoc-tso-inc.tex  : alldoc-inc-pre.template alldoc-inc-between.template alldoc-inc-post.template $(addsuffix .tmp3-tex, $(TSOSPECTHEORIES))
	(echo "% auto-generated file; do not edit"; \
	cat alldoc-inc-pre.template; \
	for f in $(TSOSPECTHEORIES); do \
		h=`basename $$f`;\
		g=`echo $$h | sed -e 's/_/\\\\\\\\protect\\\\\\\\textunderscore /g'`; \
		cat alldoc-inc-between.template  | sed -e "s/THEORYNAME/$$g/g"; \
		cat $$f.tmp3-tex; \
	done; \
	cat alldoc-inc-post.template \
	) > $@



alldoc-tso-inc.dvi : alldoc-tso-inc.tex
	@echo
	@echo "Sorry, you can't build alldoc-tso-inc directly; you must include it in another document"
	@exit 1


x86_typeabbrev_tso.imn: $(TSOSPECTHEORYFILES)
	echo '(*[ NOECHO ]*)' > $@
	echo '(*[ C  AUTOGENERATED -- DO NOT EDIT ]*)' >> $@
	echo '(*[ TYPE_LIST' >> $@
	grep "type_abbrev" $(TSOSPECTHEORYFILES) | cut -f2 -d\" >> $@
	echo ']*)' >> $@
	echo '(*[ ECHO ]*)' >> $@

x86_auto_tso.imn: $(TSOSPECTHEORYIMNS)
	echo '(*[ NOECHO ]*)' > $@
	cat $(TSOSPECTHEORYIMNS) >> $@
#	cat $(filter-out %LIBinterface.imn %ruleids.imn, $(TSOSPECTHEORYIMNS)) >> $@
#	cat $(filter     %LIBinterface.imn, $(TSOSPECTHEORYIMNS)) | \
#		sed -e 's/CON_LIST/LIB_LIST/' - >> $@
#	echo '(*[ CLASS RULE "\tsrule" ]*)' >> $@
#	cat $(filter     %ruleids.imn, $(TSOSPECTHEORYIMNS)) | \
#		sed -e 's/CON_LIST/CLASS_LIST RULE/' - >> $@
	echo '(*[ ECHO ]*)' >> $@



# implicit rules:

.PRECIOUS: %.tmp-tex %-doc.tex %.dvi %.tob



%.dvi %.pdf : %.tex $(LTSHOLDOCDIR)/ltsmunge.sty $(OTHERTEXFILES)
	TEXINPUTS=$(subst $(space),:,$(strip $(EXTRATEXINPUTS))):$(TEXINPUTS) $(LATEX) $<
	-makeindex $*
	TEXINPUTS=$(subst $(space),:,$(strip $(EXTRATEXINPUTS))):$(TEXINPUTS) $(LATEX) $<
	TEXINPUTS=$(subst $(space),:,$(strip $(EXTRATEXINPUTS))):$(TEXINPUTS) $(PDFLATEX) $<

%.tex : %.mng $(if ${FAST},,${IMNFILES}) ${MNG_TO_LATEX}
	  $(MNG_TO_LATEX) $(IMNFILES) $*.mng > $*.tex

%.ps : %.dvi
	$(DVIPS) $(DVIPSFLAGS) $< -o $@.tmp
	mv $@.tmp $@

%.pdf : %.ps
	$(PSTOPDF) $< $@.tmp
	mv $@.tmp $@

wc:
	wc -l -c   $(SPECTHEORYFILES)
#	wc -l -c   $(CHECKERSOURCEFILES)

realclean: clean
	rm -f $(HOLTHEORYIMNS) x86_auto_tso.imn x86_typeabbrev_tso.imn
	rm -f .HOLMK  alldoc-tso.idx alldoc-tso.ilg alldoc-tso-inc.idx alldoc-tso-inc.log alldoc-tso-inc.tex alldoc-tso.ind alldoc-tso.log alldoc-tso.out alldoc-tso.pdf alldoc-tso.ps alldoc-tso.tex alldoc-tso.tob alldoc-tso.toc alldoc-tso.aux alldoc-tso.dvi *.tmp2-tex *.tmp3-tex

# extra dependencies:

%-doc.dvi : $(LTSHOLDOCDIR)/ltsmunge.sty tcp.sty

# end

