#################################################################################
#                                                                               #
# Makefile for "Formalizing proof/type environments in weak HOAS"               #
# Authors: Alberto Ciaffaglione and Ivan Scagnetto                              #
# Date: 31 August 2014                                                          #
#                                                                               #
#################################################################################
#                                                                               #
# Instructions to compile:                                                      #
#                                                                               #
# 1) 'make' or 'make all' compiles everything                                   #
# 2) 'make systemF' compiles the syntax of F< pure types and subtyping versions #
# 3) 'make example' compiles an example derivation with the two subtypings      #
# 4) 'make adequacy' compiles the correspondences between the two subtypings    #
# 5) 'make challenge1A' compiles part 1A of the POPLmark challenge              #
# Note: if your system supports native code, you can add the suffix '-opt' to   #
#       the previous targets, in order to carry out a native code               #
#       compilation ('make opt' compiles the whole stuff in native code).       #
# 5) 'make clean' deletes all *.vo and *.glob files                             #
#                                                                               #
#################################################################################

.PHONY: all opt systemF systemF-opt example example-opt adequacy adequacy-opt challenge1A challenge 1A-opt clean

all: index.vo

opt:
	make all CODE="-opt"

systemF: shallow_def.vo deep_def.vo

systemF-opt:
	make systemF CODE="-opt"

example: example.vo

example-opt:
	make example CODE="-opt"

adequacy: deep2shallow.vo shallow2deep.vo

adequacy-opt:
	make adequacy CODE="-opt"

challenge1A: challenge_1A.vo

challenge1A-opt:
	make challenge1A CODE="-opt"

syntax.vo: syntax.v
	coqc -q $(CODE) syntax.v

shallow_def.vo: syntax.vo shallow_def.v
	coqc -q $(CODE) shallow_def.v

deep_def.vo: syntax.vo deep_def.v
	coqc -q $(CODE) deep_def.v

ToC.vo: ToC.v syntax.vo
	coqc -q $(CODE) ToC.v

ToC_theory.vo: ToC.vo ToC_theory.v
	coqc -q $(CODE) ToC_theory.v

ToC_shallow.vo: ToC.vo shallow_def.vo ToC_shallow.v
	coqc -q $(CODE) ToC_shallow.v

ToC_deep.vo: ToC.vo deep_def.vo ToC_deep.v
	coqc -q $(CODE) ToC_deep.v

deep_env.vo: ToC_deep.vo deep_env.v
	coqc -q $(CODE) deep_env.v

deep_env_prop.vo: deep_env.vo deep_env_prop.v
	coqc -q $(CODE) deep_env_prop.v

challenge_1A.vo: ToC_theory.vo deep_env_prop.vo challenge_1A.v
	coqc -q $(CODE) challenge_1A.v

shallow_env.vo: ToC_shallow.vo shallow_env.v
	coqc -q $(CODE) shallow_env.v

example.vo: shallow_def.vo deep_def.vo example.v
	coqc -q $(CODE) example.v

deep2shallow.vo: deep_env.vo shallow_env.vo deep2shallow.v
	coqc -q $(CODE) deep2shallow.v

shallow2deep.vo: deep_env.vo shallow_env.vo ToC_theory.vo shallow2deep.v
	coqc -q $(CODE) shallow2deep.v

index.vo: challenge_1A.vo example.vo deep2shallow.vo shallow2deep.vo index.v
	coqc -q $(CODE) index.v

clean:
	rm -f *.vo *.glob
