######################################################################
#                                                                    #
#                           Moca                                     #
#                                                                    #
#          Pierre Weis, INRIA Rocquencourt                           #
#          Frdric Blanqui, projet Protheo, INRIA Lorraine          #
#                                                                    #
#  Copyright 2005-2012,                                              #
#  Institut National de Recherche en Informatique et en Automatique. #
#  All rights reserved.                                              #
#                                                                    #
#  This file is distributed under the terms of the Q Public License. #
#                                                                    #
######################################################################

# $Id: Makefile,v 1.139 2012-06-04 13:01:22 weis Exp $

# The Makefile for moca tests.

SRCROOTDIR=..

# The directory where Makefile templates reside.
MAKEFILES_DIR=$(SRCROOTDIR)/Mk

# Include the generic setup for Caml applications.
include $(MAKEFILES_DIR)/Config.mk

# We need to relax the warning is error option of the compiler,
# since moca still generates unused match cases.
CAMLBYTCONFIG=-w A -warn-error Aeuz -g $(CAMLBYTINCLUDES)
CAMLBINCONFIG=-w A -warn-error Aeuz $(CAMLBININCLUDES)

# To provide a dependency to the actual mocac compiler.
MOCAC_COMPILER=$(SRCROOTDIR)/mocac

MOCACFLAGS=-test

# The mocac compiler with its flags set.
MOCAC=$(MOCAC_COMPILER) $(MOCACFLAGS)

# The directory where the set of distributed examples will be copied.
# Note that these examples are files from within this directory
EXAMPLES_DIR=../examples

# The sub directory we have to visit.
SUB_DIRS=lpi
# numbers

# The special module to handle the automatic execution of tests.
TESTGEN=gentest

# Files that do not pass the tests yet.
DEVELFILESSHARING=\
 oset non_empty_oset structure formal_sum_rev nilpotence\

DEVELFILESNOSHARING=\
 $(DEVELFILESSHARING) formal_sum\

DEVELTESTINGNOSHARING=\
 toset tnon_empty_oset tstructure\
 tformal_sum_rev tformal_sum_rev_sharing tnilpotence tformal_sum\

# The test files taken as examples and distributed as part of the moca tar ball:
# they will be in the directory moca/examples of the tar ball.
EXAMPLES=\
 additive_monoid biocham bool\
 group_null group_commutative_1 group_1\
 multiset ring_var\
 sets sequence\

EXAMPLES_LISTARY=

# The various .mlm source files.
# The base names of files that will have a sharing version.
FILESSHARING_NOAUTOTESTING=\
 bool0 lam term variable\

FILESSHARING=\
 $(EXAMPLES)\
 xor peano semi_group set0 ski skiv\
 monoid monoid_modules semi_group_commutative_1\
 group_commutative group_commutative_gh\
 group group_2\
 ring field field_math\

# The base names of files that will not have a sharing version.
FILESNOSHARING=\
 morebool vector field_math_mod\

FILESNOSHARING_NOAUTOTESTING=\
 length\

# The base name of files that will have a listary (varyadic) definition
# with a corresponding sharing version.
FILESSHARING_LISTARY_NOAUTOTESTING=\
 bool_list0\

FILESSHARING_LISTARY=\
 $(EXAMPLES_LISTARY)\
 biocham_list bool_list field_list\
 group_list group_1_list group_2_list\
 group_commutative_list group_null_list\
 monoid_list monoid_modules_list multiset_list xor_list\
 peano_list ring_list ring_var_list semi_group_list\
 semi_group_commutative_1_list\
 sequence_list set_list non_commutative_list\


# The base name of files that has a listary (varyadic) definition
# with no corresponding sharing version.
FILESNOSHARING_LISTARY=field_math_list

FILESNOSHARING_LISTARY_NOAUTOTESTING=

# The base names of mlm files that will not have a sharing version
MLMNOSHARING=$(FILESSHARING) $(FILESNOSHARING)

MLMNOSHARING_LISTARY=$(FILESSHARING_LISTARY) $(FILESNOSHARING_LISTARY)

MLMNOSHARING_NOAUTOTESTING=\
 $(FILESSHARING_NOAUTOTESTING)\
 $(FILESSHARING_LISTARY_NOAUTOTESTING)\
 $(FILESNOSHARING_NOAUTOTESTING) $(FILESNOSHARING_LISTARY_NOAUTOTESTING)

# The base names of the sharing versions of mlm files
MLMSHARING=$(FILESSHARING:%=%_sharing)

MLMSHARING_LISTARY=\
 $(FILESSHARING_LISTARY:%=%_sharing)

MLMSHARING_NOAUTOTESTING=\
 $(FILESSHARING_NOAUTOTESTING:%=%_sharing)\
 $(FILESSHARING_LISTARY_NOAUTOTESTING:%=%_sharing)

# The complete set of .mlm files
# (no .mlms files that are links to a .mlm file anyway).
# We need that list to keep banners up to date.
ALLTESTMLM=\
 $(MLMNOSHARING) $(MLMNOSHARING_LISTARY) $(MLMNOSHARING_NOAUTOTESTING)

# The complete set of .ml and .mli files generated by mocac
MLGENERATEDNOSHARING=\
 $(MLMNOSHARING:%=%.ml) $(MLMNOSHARING_LISTARY:%=%.ml)\
 $(MLMNOSHARING_NOAUTOTESTING:%=%.ml)
MLIGENERATEDNOSHARING=\
 $(MLMNOSHARING:%=%.mli) $(MLMNOSHARING_LISTARY:%=%.mli)\
 $(MLMNOSHARING_NOAUTOTESTING:%=%.mli)
MLGENERATEDSHARING=\
 $(MLMSHARING:%=%.ml) $(MLMSHARING_LISTARY:%=%.ml)\
 $(MLMSHARING_NOAUTOTESTING:%=%.ml)
MLIGENERATEDSHARING=\
 $(MLMSHARING:%=%.mli) $(MLMSHARING_LISTARY:%=%.mli)\
 $(MLMSHARING_NOAUTOTESTING:%=%.mli)

MLGENERATED=$(MLGENERATEDNOSHARING) $(MLGENERATEDSHARING)
MLIGENERATED=$(MLIGENERATEDNOSHARING) $(MLIGENERATEDSHARING)

ALLGENERATED=$(MLIGENERATED) $(MLGENERATED)

# The testing files that contains test beds for generated files.
TESTINGNOSHARING=\
 tsequence tmultiset tsets\
 tring_var tpeano tbool tmorebool txor\
 tski tgroup tgroup_commutative\
 tgroup_commutative_1 tgroup_1 tgroup_2\
 tvariable tlength tterm tfield tfield_math\

TESTINGNOSHARING_LISTARY=\
 tbool_list tgroup_list tgroup_1_list\
 tpeano_list tring_var_list tnon_commutative_list\

TESTINGSHARING=\
 tring_var_sharing tpeano_sharing\
 tbool_sharing txor_sharing tski_sharing tvariable_sharing\

TESTINGSHARING_LISTARY=tbool_list_sharing

AUTOTESTINGNOSHARING=$(MLMNOSHARING:%=%_test)
AUTOTESTINGNOSHARING_LISTARY=$(MLMNOSHARING_LISTARY:%=%_test)

AUTOTESTINGSHARING=$(MLMSHARING:%=%_test)
AUTOTESTINGSHARING_LISTARY=$(MLMSHARING_LISTARY:%=%_test)

# Used in Makefile.distrib to edit headers.
ALLTESTING=$(TESTGEN:%=%.mli) $(TESTGEN:%=%.ml)\
 $(TESTINGSHARING%=%.ml) $(TESTINGNOSHARING:%=%.ml)\
 $(TESTINGSHARING_LISTARY%=%.ml)\
 $(TESTINGNOSHARING_LISTARY:%=%.ml)\

CAMLIMPNOSHARING=\
 $(TESTGEN:%=%.ml)\
 $(MLMNOSHARING:%=%.ml) $(MLMNOSHARING_NOAUTOTESTING:%=%.ml)\
 $(TESTINGNOSHARING:%=%.ml)\
 $(AUTOTESTINGNOSHARING:%=%.ml)\
 $(MLMNOSHARING_LISTARY:%=%.ml) $(MLMNOSHARING_LISTARY_NOAUTOTESTING:%=%.ml)\
 $(TESTINGNOSHARING_LISTARY:%=%.ml)\
 $(AUTOTESTINGNOSHARING_LISTARY:%=%.ml)\

CAMLIMPSHARING=\
 $(TESTGEN:%=%.ml)\
 $(MLMSHARING:%=%.ml) $(MLMSHARING_NOAUTOTESTING:%=%.ml)\
 $(TESTINGSHARING:%=%.ml)\
 $(FILESSHARING_NOAUTOTESTING:%=%.ml)\
 $(FILESSHARING_LISTARY_NOAUTOTESTING:%=%.ml)\
 $(AUTOTESTINGSHARING:%=%.ml)\
 $(MLMSHARING_LISTARY:%=%.ml) $(MLMSHARING_LISTARY_NOAUTOTESTING:%=%.ml)\
 $(TESTINGSHARING_LISTARY:%=%.ml)\
 $(AUTOTESTINGSHARING_LISTARY:%=%.ml)\

CAMLINTFILES=\
 $(TESTGEN:%=%.mli)\
 $(MLMNOSHARING:%=%.mli) $(MLMSHARING:%=%.mli)\
 $(MLMNOSHARING_LISTARY:%=%.mli) $(MLMSHARING_LISTARY:%=%.mli)\
 $(MLMNOSHARING_NOAUTOTESTING:%=%.mli) $(MLMSHARING_NOAUTOTESTING:%=%.mli)\
 $(MLMNOSHARING_LISTARY_NOAUTOTESTING:%=%.mli) $(MLMSHARING_LISTARY_NOAUTOTESTING:%=%.mli)\

# Used to compute .depend
CAMLFILES=\
 $(CAMLINTFILES) $(CAMLIMPNOSHARING) $(CAMLIMPSHARING)\

BYTOBJS1=$(CAMLIMPNOSHARING:%.ml=%.cmo)
BYTOBJS2=$(CAMLIMPSHARING:%.ml=%.cmo)

BINOBJS1=$(BYTOBJS1:%.cmo=%.cmx)
BINOBJS2=$(BYTOBJS2:%.cmo=%.cmx)

LISTARY_BYTOBJS=\
 $(TESTGEN:%=%.cmo)\
 $(MLMNOSHARING_LISTARY:%=%.cmo) $(MLMNOSHARING_LISTARY_NOAUTOTESTING:%=%.cmo)\
 $(TESTINGNOSHARING_LISTARY:%=%.cmo)\
 $(AUTOTESTINGNOSHARING_LISTARY:%=%.cmo)\

default: depend byt runbyt

all: depend byt bin run examplesdir
	for i in $(SUB_DIRS); do\
	  (cd $$i; make all);\
	done

$(MLGENERATED): $(MOCAC_COMPILER)

byt: runtest.byt runtestsharing.byt

clean::
	$(RM) *.byt

bin: runtest.bin runtestsharing.bin

clean::
	$(RM) *.bin &&\
	for i in $(SUB_DIRS); do\
	  (cd $$i; $(MAKE) clean);\
	done

runtest.byt: $(BYTOBJS1)
	$(CAMLBYT) $(LINKFLAGS) -o runtest.byt $(BYTOBJS1)
runtestsharing.byt: $(BYTOBJS2)
	$(CAMLBYT) $(LINKFLAGS) -o runtestsharing.byt $(BYTOBJS2)
runbyt: runtest.byt runtestsharing.byt
	./runtest.byt &&\
	./runtestsharing.byt

runtest.bin: $(BINOBJS1)
	$(CAMLBIN) $(LINKFLAGS) -o runtest.bin $(BINOBJS1)
runtestsharing.bin: $(BINOBJS2)
	$(CAMLBIN) $(LINKFLAGS) -o runtestsharing.bin $(BINOBJS2)
runbin: runtest.bin runtestsharing.bin
	./runtest.bin &&\
	./runtestsharing.bin

run: runbyt runbin

info:
	@echo "Files Sharing no testing = $(FILESSHARING_NOAUTOTESTING)"
	@echo ""
	@echo "mlm (sharing, no autotests) = $(MLMSHARING_NOAUTOTESTING)"
	@echo ""
	@echo "mlm (no sharing, no autotests) = $(MLMNOSHARING_NOAUTOTESTING)"
	@echo ""
	@echo "Mlm = $(MLMSHARING_NOAUTOTESTING)"
	@echo ""
	@echo "imp (nosharing)= $(CAMLIMPNOSHARING)"
	@echo ""
	@echo "cmo (nosharing) = $(BYTOBJS1)"
	@echo ""
	@echo "cmo (sharing)) = $(BYTOBJS2)"

testing_listary: $(LISTARY_BYTOBJS)
	$(CAMLBYT) $(LINKFLAGS) -o runtest_listary.byt $(LISTARY_BYTOBJS)

runlistary: testing_listary
	./runtest_listary.byt

configure::
	for i in\
	   $(FILESSHARING) $(FILESSHARING_NOAUTOTESTING)\
	   $(FILESSHARING_LISTARY) $(FILESSHARING_LISTARY_NOAUTOTESTING); do\
	  $(LN) $$i.mlm $${i}_sharing.mlms;\
	done &&\
	for i in $(SUB_DIRS); do\
	  echo "Making configure in sub directory $$i..." &&\
	  (cd $$i && $(TOUCH) ./.depend && make configure) &&\
	  echo "Make configure in sub directory $$i done.";\
	done

examplesdir:
	$(RM) -r $(EXAMPLES_DIR) &&\
	$(MKDIR) $(EXAMPLES_DIR) &&\
	for i in $(EXAMPLES); do\
	  $(CP) $$i.mlm $(EXAMPLES_DIR);\
	done &&\
	sed "s|FILESSHARING=.*|FILESSHARING=$(EXAMPLES)|"\
	    Makefile.examples > $(EXAMPLES_DIR)/Makefile &&\
	touch $(EXAMPLES_DIR)/.depend

clean::
	$(RMDIR) $(EXAMPLES_DIR) &&\
	$(RM) $(ALLGENERATED)

beforedepend::
	if test -x "../mocac" ; then\
	  $(MAKE) $(MLGENERATEDNOSHARING) &&\
	  $(MAKE) $(MLGENERATEDSHARING);\
	fi

depend:: beforedepend
	for i in $(SUB_DIRS); do\
	  if test -d "$$i"; then\
	    (cd $$i && $(MAKE) depend);\
	  fi;\
	done

# Special parameters for some automatic tests that otherwise are too big
xor_list.ml:
	$(MOCAC) -valdepth 2 xor_list.mlm
xor_list_sharing.ml:
	$(MOCAC) -valdepth 2 xor_list_sharing.mlms
ring_list_sharing.ml:
	$(MOCAC) -valdepth 2 ring_list_sharing.mlms
ring_var_list_sharing.ml:
	$(MOCAC) -valdepth 2 ring_var_list_sharing.mlms

# Including the spefific rules to compile Caml programs.
include $(MAKEFILES_DIR)/Caml.mk
