###
###   Makefile for LFD_INFER
###  
###   Original written D.Aspinall and M.Hofmann,
###   Modified by S.Jost.
###   Further modified by K. MacKenzie
###
###
###   ToDos:
###
###     - read the manual and understand how these Makefiles work in detail!
###
###


# $Id: Makefile,v 1.4 2004/02/23 18:03:28 kwxm Exp $

TARGET=lfd_infer
TARGETS=lfd_infer

OCAMLC=ocamlc
OCAMLLEX=ocamllex
OCAMLYACC=ocamlyacc
OCAMLOPT=ocamlopt
OCAMLDEP=ocamldep
INCLUDES= -nolabels -I asdl         # add all options here
OCAMLFLAGS=$(INCLUDES)              # add other options for ocamlc here
OCAMLOPTFLAGS=$(INCLUDES)           # add other options for ocamlopt here

ML=$(shell ls *.ml)  # dodgy?
MLI=$(shell ls *.mli)
CMO=$(ML:.ml=.cmo)
CMI=$(ML:.ml=.cmi)
CMX=$(ML:.ml=.cmx)


# FIXME: ocamlopt is fussy about the order of its arguments.
# Isn't there a way to recover them using ocamldep?

CMO=support.cmo common.cmo syntax.cmo parser.cmo lexer.cmo\
    argument.cmo constraint.cmo exec.cmo main.cmo

CMX=$(CMO:.cmo=.cmx)

ASDL_CMO = share.cmo pklInt.cmo stdPkl.cmo sexpLex.cmo sexpPkl.cmo stdPrimsUtil.cmo\
       stdPrims.cmo assertions_ASDL.cmo assertions_ASDLUtil.cmo camelot_absyn_ASDL.cmo\
       camelot_absyn_ASDLUtil.cmo

ASDL_CMX = $(ASDL_CMO:.cmo=.cmx)

MLL=$(shell ls *.mll)
MLY=$(shell ls *.mly)
PARSERML=$(MLY:.mly=.ml)
LEXERML=$(MLL:.mll=.ml)
PARSER= $(PARSERML) $(LEXERML)

# avoid automatic deletion of intermediates
.SECONDARY: parser.ml parser.mli lexer.ml
# force rebuilding of target

default:  depend asdlfiles
	$(MAKE) main

FORCE:

opt:	depend asdlopt
	$(MAKE) main.opt

depend: .depend

parser:	  $(PARSER)

main:	$(PARSER) $(CMO) 
	$(OCAMLC) -o $(TARGET) $(OCAMLFLAGS) unix.cma $(ASDL_CMO) $(CMO)
# order must be correct

main.opt: $(PARSER) $(CMX) 
	$(OCAMLOPT) -o $(TARGET) $(OCAMLOPTFLAGS) unix.cmxa  $(ASDL_CMX) $(CMX)

asdlfiles:
	cd asdl; $(MAKE)

asdlopt:
	cd asdl; $(MAKE) opt

# Clean up
clean:
#	clear
	rm -f .depend
	rm -f $(TARGETS)
	rm -f *.cm[iox] *.o
	rm -f parser.mli parser.ml
	rm -f lexer.ml

# Dependencies: must make parser first
.depend: $(PARSER) $(ML)
	 $(OCAMLDEP) *.mli *.ml > .depend


# Common rules
.SUFFIXES: .ml .mll .mly .mli .cmo .cmi .cmx .o

.mll.ml:
	$(OCAMLLEX) $<

.mly.ml:
	$(OCAMLYACC) -v $<

.mly.mli:
	$(OCAMLYACC) $<

.ml.mli:
	$(OCAMLC) $(OCAMLFLAGS) -c $<

.ml.cmo:
	$(OCAMLC) $(OCAMLFLAGS) -c $<

.mli.cmi:
	$(OCAMLC) $(OCAMLFLAGS) -c $<

.ml.cmx:
	$(OCAMLOPT) $(OCAMLOPTFLAGS) -c $<

# Include dependencies if available
ifeq (.depend,$(wildcard .depend))
include .depend
endif


## Names and real mail addresses of developers
## Arguments for rcs2log for ChangeLog target
#
#DEVELOPERS=\
#  -u "da	David Aspinall	da@dcs.ed.ac.uk" \
#  -u "mxh	Martin Hofmann	mxh@dcs.ed.ac.uk" 
#
#ChangeLog:	FORCE
#	rm -f ChangeLog
#	rcs2log -h "dcs.ed.ac.uk" $(DEVELOPERS) | sed 's|/home/resbnd/src/lfpl/||g' >> ChangeLog.prefix
#	mv ChangeLog ChangeLog.old
#	cat ChangeLog.prefix ChangeLog.old > ChangeLog
#	rm ChangeLog.prefix ChangeLog.old




