topdir = ../..
ott_coq_lib_dir = $(topdir)/coq
ott_hol_lib_dir = $(topdir)/hol

COQC = coqc
COQDEP = coqdep
COQ_INCLUDE = -I $(ott_coq_lib_dir)
COQC_FLAGS =
DVIPS = dvips
HOLMAKE = Holmake
HOLMAKE_FLAGS = -I $(ott_hol_lib_dir)
ISABELLE = isabelle
ISABELLE_FLAGS = -q
ISABELLE_WRAPPER = use_thy "$*" handle e => (TextIO.output (TextIO.stdErr, "Isabelled failed: " ^ exnMessage e ^ "\n"); OS.Process.exit OS.Process.failure)
LATEX = latex
OTT = $(topdir)/src/ott
OTT_FLAGS = -merge true #-show_defns false -show_sort false
PDFLATEX = pdflatex

# NB THIS SHOULD BE IN SYNC WITH THE SYS_ROUGHLYFULLSIMPLE DEFINITION IN src/Makefile 
# AND sys-roughlyfullsimple IN src/regression.otl
SOURCES = \
common.ott \
common_index.ott \
common_labels.ott \
common_typing.ott \
bool.ott \
bool_typing.ott \
nat.ott \
nat_typing.ott \
arrow_typing.ott \
basety.ott \
unit.ott \
seq.ott \
ascribe.ott \
let.ott \
product.ott \
sum.ott \
fix.ott \
tuple.ott \
variant.ott
#record.ott

records_sources = \
	common.ott common_index.ott common_labels.ott common_typing.ott \
	bool.ott bool_typing.ott \
	nat.ott nat_typing.ott \
	arrow_typing.ott basety.ott \
	unit.ott seq.ott ascribe.ott let.ott \
	product.ott sum.ott fix.ott \
	tuple.ott record.ott variant.ott

isa_objects = stlc stlc_metatheory

coq_ott_libs = $(ott_coq_lib_dir)/ott_list
coq_stlc_libs = $(coq_ott_libs) stlc_tactics
coq_stlc_objects = $(coq_stlc_libs) \
	stlc_auto stlc_base stlc_terms \
	stlc_environments stlc_typing stlc_soundness
coq_oldlists_objects = $(coq_stlc_libs) \
	records_oldlists_auto
coq_records_common = $(coq_stlc_libs) \
	records_auto records_base records_terms records_environments
coq_records_objects = $(coq_records_common) \
	records_hand_red records_hand_typing_fl \
	records_typing records_soundness
coq_pf_objects = $(coq_records_common) \
	records_hand_red records_hand_typing_pf \
	records_pf_typing records_pf_soundness
coq_equiv_objects = $(coq_stlc_libs) \
	records_auto records_base records_equiv_common \
	records_equiv_red records_equiv_typing_fl records_equiv_typing_pf
coq_misc_objects = records_quickies records_tick

default: so
ott: stlc.tex stlc_auto.v stlcScript.sml stlc.thy \
	records.tex records_auto.v recordsScript.sml records.thy
coq-stlc: $(coq_stlc_objects:=.vo)
coq-oldlists: $(coq_oldlists_objects:=.vo)
coq-records: $(coq_records_objects:=.vo)
coq-pf: $(coq_pf_objects:=.vo)
coq-equiv: $(coq_equiv_objects:=.vo)
coq-misc: $(coq_misc_objects:=.vo)
coq: coq-pf
coq-world: coq-stlc coq-records coq-pf coq-equiv coq-misc coq-oldlists
hol: metatheoryTheory.uo
isa: $(isa_objects:=.isa)
# N.B. isa currently requires a CVS version of Isabelle (Isabelle 2005 fails)
all: ott stlc.ps coq hol
world: all stlc.pdf coq-world hol isa

#### Scott's targets ####
so: stlcScript.sml metatheoryScript.sml stlc.pdf
	$(HOLMAKE) $(HOLMAKE_FLAGS)

#### Tom's targets  #####
tom: stlc.thy stlc.pdf

#### ott ###
records.tex records_auto.v recordsScript.sml records.thy: $(records_sources) $(OTT)
	$(OTT) $(OTT_FLAGS) -merge true -coq_expand_list_types false -o records.tex -o records_auto.v -o recordsScript.sml -o records.thy $(records_sources)
records_oldlists_auto.v: $(records_sources) $(OTT)
	$(OTT) $(OTT_FLAGS) -merge true -coq_expand_list_types true -o $@ $(records_sources)
stlc.tex stlc_auto.v stlcScript.sml stlc.thy: $(SOURCES) $(OTT)
	$(OTT) $(OTT_FLAGS) -merge true -coq_expand_list_types true -o stlc.tex -o stlc_auto.v -o stlcScript.sml -o stlc.thy $(SOURCES)

#### TeX ####
.SUFFIXES: .tex .dvi .ps .pdf
.tex.dvi:
	$(LATEX) $<
.dvi.ps:
	$(DVIPS) -o $@ $<
.tex.pdf:
	$(PDFLATEX) $<

#### Hol ####
hol_libs = $(ott_hol_lib_dir)/ottLib $(ott_hol_lib_dir)/ottTheory
hol_libs: $(hol_libs:=.ui) $(hol_libs:=.uo)
$(hol_libs:=.ui) $(hol_libs:=.uo): %:
	cd $(@D) && $(MAKE) $(@F)
%Theory.uo: %Script.sml hol_libs
	$(HOLMAKE) $(HOLMAKE_FLAGS) $@

#### Isabelle ####
.SUFFIXES: .thy .isa
.thy.isa:
	$(ISABELLE) $(ISABELLE_FLAGS) -e '$(ISABELLE_WRAPPER)'

#### Coq ####
coq_libs: $(coq_ott_libs:=.vo)
$(coq_ott_libs:=.vo):
	cd $(ott_coq_lib_dir) && $(MAKE) $(@F)
.SUFFIXES: .v .vo
.v.vo:
	$(COQC) $(COQ_INCLUDE) $(COQC_FLAGS) $<

#### Administrative targets ####
clean:
	rm -f stlc.tex stlcScript.sml auto[-_]* *[-_.]auto[-_.]*
	rm -f *.aux *.log *.dvi *.ps *.pdf
	rm -f *.vo
	rm -f stlcTheory.sig stlcTheory.sml metatheoryTheory.sml metatheoryTheory.sig *.uo *.ui

#### Dependencies ####
dep: .depend
	sed -e '/^#### AUTOMATICALLY GENERATED BY make dep, DO NOT CHANGE THIS LINE ####$$/q' <Makefile >Makefile.tmp
	cat .depend >>Makefile.tmp
	mv -f Makefile .Makefile.old
	mv -f Makefile.tmp Makefile
.depend: force
	: >.depend.tmp
	$(COQDEP) -I . -I $(ott_coq_lib_dir) *.v >.depend.coq.tmp
	sed -e '/^_ott_coqrc\.vo:/d' -e 's/ _ott_coqrc\.v/& $$(ott_coqrc_deps)/' <.depend.coq.tmp >>.depend.tmp
	rm .depend.coq.tmp
	mv .depend.tmp .depend
force:

# TeX dependencies, mentioned so as not to run afoul of the make
# feature whereby it deletes intermediate files.
records.tex:
stlc.tex:
records.dvi:
stlc.dvi:

# ott_coqrc_deps must list the dependencies of _ott_coqrc.vo, because
# coqdep would miss them (see _ott_coqrc.v).
ott_coqrc_deps = $(coq_ott_libs:=.vo)
stlc_coq_prelude = $(ott_coqrc_deps)
# stlc_coq_prelude is used by the regression tests and must depend on
# the .vo files that are required to build any ott-generated stlc .v.
stlc_coq_prelude: $(stlc_coq_prelude)

#### AUTOMATICALLY GENERATED BY make dep, DO NOT CHANGE THIS LINE ####
records_auto.vo: records_auto.v ../../coq/ott_list.vo _ott_coqrc.v $(ott_coqrc_deps) ../../coq/ott_list_flat_map.vo
records_base.vo: records_base.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo
records_environments.vo: records_environments.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo
records_equiv_common.vo: records_equiv_common.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo
records_equiv_red.vo: records_equiv_red.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_equiv_common.vo records_hand_red.vo
records_equiv_typing_fl.vo: records_equiv_typing_fl.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_equiv_common.vo records_hand_typing_fl.vo
records_equiv_typing_pf.vo: records_equiv_typing_pf.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_hand_typing_fl.vo records_hand_typing_pf.vo
records_hand_red.vo: records_hand_red.v _ott_coqrc.v $(ott_coqrc_deps) records_auto.vo records_base.vo
records_hand_typing_fl.vo: records_hand_typing_fl.v _ott_coqrc.v $(ott_coqrc_deps) records_auto.vo records_base.vo
records_hand_typing_pf.vo: records_hand_typing_pf.v _ott_coqrc.v $(ott_coqrc_deps) records_auto.vo records_base.vo
records_oldlists_auto.vo: records_oldlists_auto.v _ott_coqrc.v $(ott_coqrc_deps) ../../coq/ott_list_flat_map.vo
records_pf_soundness.vo: records_pf_soundness.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_terms.vo records_environments.vo records_hand_red.vo records_hand_typing_pf.vo records_pf_typing.vo
records_pf_typing.vo: records_pf_typing.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_terms.vo records_environments.vo records_hand_typing_pf.vo
records_quickies.vo: records_quickies.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_environments.vo records_hand_red.vo records_hand_typing_pf.vo
records_run.vo: records_run.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_terms.vo records_environments.vo records_hand_red.vo records_hand_typing_pf.vo
records_soundness.vo: records_soundness.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_terms.vo records_environments.vo records_hand_red.vo records_hand_typing_fl.vo records_typing.vo
records_terms.vo: records_terms.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo
records_tick.vo: records_tick.v _ott_coqrc.v $(ott_coqrc_deps) records_auto.vo records_base.vo records_pf_soundness.vo records_hand_red.vo records_hand_typing_pf.vo records_equiv_red.vo records_equiv_typing_pf.vo records_equiv_typing_fl.vo
records_typing.vo: records_typing.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo records_auto.vo records_base.vo records_terms.vo records_environments.vo records_hand_typing_fl.vo
stlc_auto.vo: stlc_auto.v _ott_coqrc.v $(ott_coqrc_deps) ../../coq/ott_list_flat_map.vo
stlc_base.vo: stlc_base.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo stlc_auto.vo
stlc_environments.vo: stlc_environments.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo stlc_auto.vo stlc_base.vo
stlc_soundness.vo: stlc_soundness.v _ott_coqrc.v $(ott_coqrc_deps) stlc_auto.vo stlc_tactics.vo stlc_base.vo stlc_terms.vo stlc_environments.vo stlc_typing.vo
stlc_tactics.vo: stlc_tactics.v
stlc_terms.vo: stlc_terms.v _ott_coqrc.v $(ott_coqrc_deps) stlc_tactics.vo stlc_auto.vo stlc_base.vo
stlc_typing.vo: stlc_typing.v _ott_coqrc.v $(ott_coqrc_deps) stlc_auto.vo stlc_tactics.vo stlc_base.vo stlc_terms.vo stlc_environments.vo
wet_massaged.vo: wet_massaged.v
