#  Oukseh Lee
#
#  Copyright(c) 2000-2004 Research On Program Analysis System
#  http://ropas.snu.ac.kr/n
#
#  All rights reserved. This file is distributed under the terms of
#  an Open Source License.


# The main Makefile

include config/Makefile

CAMLC=boot/ncamlrun boot/nmlc -I boot
CAMLOPT=boot/ncamlrun ./nmlo -I stdlib -nontyping
COMPFLAGS=$(INCLUDES)
LINKFLAGS=
CAMLYACC=boot/ocamlyacc
NYACC=boot/nyacc
YACCFLAGS=-v
CAMLLEX=boot/ncamlrun boot/ocamllex
NLEX=boot/ncamlrun boot/nlex
DEPFLAGS=$(INCLUDES)
CAMLRUN=boot/ncamlrun
MKDIR=mkdir -p
NEWCAMLC=$(CAMLC) -nontyping
#-nontyping

NMLBOOT_INCLUDES=-I utils -I ocaml/parsing -I ocaml/typing \
         -I ocaml/bytecomp -I ocaml/driver \
         -I bootcomp -I main

ORG_INCLUDES=-I utils -I parser -I ocaml/parsing -I ocaml/typing \
         -I typing -I ocaml/bytecomp -I ocaml/driver \
         -I n2caml -I lambda -I ocaml/asmcomp -I ocaml/toplevel -I main

INCLUDES=$(ORG_INCLUDES)

UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \
  utils/clflags.cmo utils/terminfo.cmo utils/ccomp.cmo \
  utils/warnings.cmo

OPTUTILS=$(UTILS)

PARSING=parser/linenum.cmo parser/location.cmo \
  ocaml/parsing/longident.cmo \
  ocaml/parsing/syntaxerr.cmo ocaml/parsing/parser.cmo \
  ocaml/parsing/lexer.cmo ocaml/parsing/parse.cmo ocaml/parsing/printast.cmo

TYPING=ocaml/typing/ident.cmo ocaml/typing/path.cmo \
  ocaml/typing/primitive.cmo ocaml/typing/types.cmo \
  ocaml/typing/btype.cmo \
  ocaml/typing/subst.cmo ocaml/typing/predef.cmo \
  ocaml/typing/datarepr.cmo ocaml/typing/env.cmo \
  ocaml/typing/typedtree.cmo ocaml/typing/ctype.cmo \
  ocaml/typing/printtyp.cmo ocaml/typing/includeclass.cmo \
  ocaml/typing/mtype.cmo ocaml/typing/includecore.cmo \
  ocaml/typing/includemod.cmo ocaml/typing/parmatch.cmo \
  ocaml/typing/typetexp.cmo ocaml/typing/typecore.cmo \
  ocaml/typing/typedecl.cmo ocaml/typing/typeclass.cmo \
  ocaml/typing/typemod.cmo

COMP=ocaml/bytecomp/lambda.cmo ocaml/bytecomp/printlambda.cmo \
  ocaml/bytecomp/typeopt.cmo ocaml/bytecomp/switch.cmo ocaml/bytecomp/matching.cmo \
  ocaml/bytecomp/translobj.cmo ocaml/bytecomp/translcore.cmo \
  ocaml/bytecomp/translclass.cmo ocaml/bytecomp/translmod.cmo \
  ocaml/bytecomp/simplif.cmo ocaml/bytecomp/runtimedef.cmo

BYTECOMP=ocaml/bytecomp/meta.cmo ocaml/bytecomp/instruct.cmo ocaml/bytecomp/bytegen.cmo \
  ocaml/bytecomp/printinstr.cmo ocaml/bytecomp/opcodes.cmo ocaml/bytecomp/emitcode.cmo \
  ocaml/bytecomp/bytesections.cmo ocaml/bytecomp/dll.cmo ocaml/bytecomp/symtable.cmo \
  ocaml/bytecomp/bytelibrarian.cmo ocaml/bytecomp/bytelink.cmo

ASMCOMP=ocaml/asmcomp/arch.cmo ocaml/asmcomp/cmm.cmo ocaml/asmcomp/printcmm.cmo \
  ocaml/asmcomp/reg.cmo ocaml/asmcomp/mach.cmo ocaml/asmcomp/proc.cmo \
  ocaml/asmcomp/clambda.cmo ocaml/asmcomp/compilenv.cmo \
  ocaml/asmcomp/closure.cmo ocaml/asmcomp/cmmgen.cmo \
  ocaml/asmcomp/printmach.cmo ocaml/asmcomp/selectgen.cmo ocaml/asmcomp/selection.cmo \
  ocaml/asmcomp/comballoc.cmo ocaml/asmcomp/liveness.cmo \
  ocaml/asmcomp/spill.cmo ocaml/asmcomp/split.cmo \
  ocaml/asmcomp/interf.cmo ocaml/asmcomp/coloring.cmo \
  ocaml/asmcomp/reloadgen.cmo ocaml/asmcomp/reload.cmo \
  ocaml/asmcomp/printlinear.cmo ocaml/asmcomp/linearize.cmo \
  ocaml/asmcomp/schedgen.cmo ocaml/asmcomp/scheduling.cmo \
  ocaml/asmcomp/emitaux.cmo ocaml/asmcomp/emit.cmo ocaml/asmcomp/asmgen.cmo \
  ocaml/asmcomp/asmlink.cmo ocaml/asmcomp/asmlibrarian.cmo

NUTILS = utils/nconfig.cmo utils/nmisc.cmo

NTYPER = typing/setmap.cmo typing/debug.cmo \
  typing/scope.cmo typing/ntypes.cmo typing/printty.cmo \
  typing/error.cmo \
  typing/unify.cmo typing/nenv.cmo typing/printenv.cmo typing/npredef.cmo \
  typing/absyn.cmo typing/infer.cmo typing/dump.cmo \
  typing/init.cmo

NPARSER=parser/ast_gen.cmo parser/info.cmo \
	parser/string_ast.cmo parser/nsyntaxerr.cmo parser/nparser.cmo \
	parser/nlexer.cmo parser/postparse.cmo \
	parser/nparse.cmo 

NTOCAML= n2caml/fake.cmo n2caml/ast2fake.cmo n2caml/nconvert.cmo \
  n2caml/strtbl.cmo n2caml/strtbl_build.cmo n2caml/n2caml.cmo \
  n2caml/absyn2ast.cmo lambda/record.cmo

NDRIVER=ocaml/driver/errors.cmo \
  ocaml/driver/compile.cmo \
  main/nterrors.cmo \
  main/ncompile.cmo \
  main/main_args.cmo \
  main/noption.cmo \
  main/nmain.cmo

NTOP=ocaml/driver/errors.cmo \
  ocaml/driver/compile.cmo \
  main/nterrors.cmo main/ncompile.cmo \
  main/nty.cmo \
  main/genprintval.cmo \
  main/toploop.cmo \
  ocaml/toplevel/trace.cmo main/topdirs.cmo 

OPTDRIVER=ocaml/driver/opterrors.cmo ocaml/driver/optcompile.cmo \
  main/nterrors.cmo main/ncompile.cmo main/optmain.cmo
  
NTOPMAIN=main/ntopmain.cmo
NTOPLIB=main/toplevellib.cma

NCOMPOBJS= $(UTILS) $(NUTILS) $(PARSING) \
  $(TYPING) $(COMP) $(BYTECOMP) $(NPARSER) $(NTYPER) $(NTOCAML) $(NDRIVER)

NTOPLIBS=$(UTILS) $(NUTILS) $(PARSING) $(TYPING) $(NTYPING) \
     $(COMP) $(BYTECOMP) $(NPARSER) $(NTYPER) $(NTOCAML) $(NTOP)

NOBJS= $(NTOPLIB) $(NTOPMAIN)

NOPTOBJS=$(UTILS) $(NUTILS) $(PARSING) $(TYPING) $(COMP) \
        $(NPARSER) $(NTYPER) $(NTOCAML) $(ASMCOMP) $(OPTDRIVER)

NBOOT=$(UTILS) $(PARSING) $(TYPING) $(COMP) $(BYTECOMP) \
  bootcomp/ast_gen.cmo bootcomp/stringinfo.cmo \
  bootcomp/string_ast.cmo bootcomp/nsyntaxerr.cmo bootcomp/nparser.cmo \
  bootcomp/nlexer.cmo bootcomp/postparse.cmo \
  bootcomp/nparse.cmo \
  bootcomp/nconvert.cmo \
  bootcomp/strtbl.cmo bootcomp/n2caml.cmo \
  bootcomp/nerrors.cmo \
  bootcomp/ncompile.cmo \
  main/main_args.cmo \
  ocaml/driver/errors.cmo ocaml/driver/compile.cmo \
  bootcomp/nmain.cmo


###########################################################


OPTOBJS=$(OPTUTILS) $(PARSING) $(TYPING) $(COMP) $(ASMCOMP) $(NOPT)

EXPUNGEOBJS=utils/misc.cmo utils/tbl.cmo \
  utils/config.cmo utils/clflags.cmo \
  ocaml/typing/ident.cmo ocaml/typing/path.cmo ocaml/typing/types.cmo \
  ocaml/typing/btype.cmo \
  ocaml/typing/predef.cmo ocaml/bytecomp/runtimedef.cmo \
  ocaml/bytecomp/bytesections.cmo \
  ocaml/bytecomp/dll.cmo \
  ocaml/bytecomp/symtable.cmo ocaml/toplevel/expunge.cmo

PERVASIVES=arg array buffer callback char digest filename format gc hashtbl \
  lexing list map obj parsing pervasives printexc printf queue random \
  set sort stack string stream sys oo genlex topdirs toploop weak lazy \
  marshal int32 int64 nativeint outcometree \
  arrayLabels listLabels stringLabels stdLabels \
  interop nml_setmaphash_ nml_typing_

################### poisson ##################



all: boot nmlc ocamlmklib nml ntylib otherlibraries ntools

rebuild: nmlc nml


ntylib::
	cd stdlib/nty; $(MAKE)


nml-boot::
	cd ocaml/byterun; $(MAKE) all
	cp ocaml/byterun/ocamlrun boot/ncamlrun
	cd ocaml/yacc; $(MAKE) all
	cp ocaml/yacc/ocamlyacc boot/ocamlyacc
	cd tools/yacc; $(MAKE) all
	cp tools/yacc/nyacc boot/nyacc
	if test -f boot/libcamlrun.a; then :; else \
          ln -s ../ocaml/byterun/libcamlrun.a boot/libcamlrun.a; fi
	if test -d stdlib/caml; then :; else \
          ln -s ../ocaml/byterun stdlib/caml; fi
	cd stdlib; $(MAKE) COMPILER=../boot/nmlc all
	cd stdlib; cp $(LIBFILES) ../boot
	$(MAKE) nboot

nboot: $(NBOOT)
	$(CAMLC) -o nmlc $(NBOOT)

boot:: 
	cd ocaml/byterun; $(MAKE) all
	cp ocaml/byterun/ocamlrun boot/ncamlrun
	cd ocaml/yacc; $(MAKE) all
	cp ocaml/yacc/ocamlyacc boot/ocamlyacc
	cd tools/yacc; $(MAKE) all
	cp tools/yacc/nyacc boot/nyacc
	cd stdlib; $(MAKE) COMPILER=../boot/nmlc all
	cd stdlib; cp $(LIBFILES) ../boot
	if test -f boot/libcamlrun.a; then :; else \
          ln -s ../ocaml/byterun/libcamlrun.a boot/libcamlrun.a; fi
	if test -d stdlib/caml; then :; else \
          ln -s ../ocaml/byterun stdlib/caml; fi

nml: $(NOBJS) expunge
	$(CAMLC) $(LINKFLAGS) -linkall -o nml.tmp $(NOBJS)
	- $(CAMLRUN) ./expunge nml.tmp nml $(PERVASIVES)
	rm -f nml.tmp

nmlc: $(NCOMPOBJS)
	$(CAMLC) $(LINKFLAGS) -o nmlc $(NCOMPOBJS)

nmlc.opt: $(NCOMPOBJS:.cmo=.cmx)
	cd ocaml/asmrun; $(MAKE) meta.o dynlink.o
	$(CAMLOPT) $(LINKFLAGS) -ccopt "$(BYTECCLINKOPTS)" -o nmlc $(NCOMPOBJS:.cmo=.cmx) ocaml/asmrun/meta.o ocaml/asmrun/dynlink.o -cclib "$(DYNLINKOPTS)"

nmlo: $(NOPTOBJS)
	$(NEWCAMLC) $(LINKFLAGS) -o nmlo $(NOPTOBJS)

nmlo.opt: $(NOPTOBJS:.cmo=.cmx)
	$(CAMLOPT) $(LINKFLAGS) -o nmlo $(NOPTOBJS:.cmo=.cmx)


LIBFILES=stdlib.cma std_exit.cmo *.cmi camlheader 

ntools:: 
	cd tools; $(MAKE) all

ocamlmklib::
	cd ocaml/tools; $(MAKE) ocamlmklib

opt: runtimeopt nmlo libraryopt otherlibrariesopt

opt.opt: nmlc.opt nlex.opt nmakegen.opt nmlo.opt

nlex.opt::
	cd tools/lex; $(MAKE) opt

nmakegen.opt::
	cd tools/nmakegen; $(MAKE) opt

runtimeopt:
	cd ocaml/asmrun; $(MAKE) all
	if test -f stdlib/libasmrun.a; then :; else \
	ln -s ../ocaml/asmrun/libasmrun.a stdlib/libasmrun.a; fi
clean::
	cd ocaml/asmrun; $(MAKE) clean
	rm -f stdlib/libasmrun.a

alldepend::
	cd ocaml/asmrun; $(MAKE) depend

# Installation
install::
	if test -d $(BINDIR); then : ; else $(MKDIR) $(BINDIR); fi
	if test -d $(LIBDIR); then : ; else $(MKDIR) $(LIBDIR); fi
	if test -d $(MANDIR); then : ; else $(MKDIR) $(MANDIR); fi
	if test -f nmlc.exe; then mv nmlc.exe nmlc; else :; fi
	if test -f nmlo.exe; then mv nmlo.exe nmlo; else :; fi
	rm -f $(LIBDIR)/lib*.so
	cd ocaml/byterun; $(MAKE) install
	if test -r $(LIBDIR)/ld.conf; then :; else echo "$(LIBDIR)" > $(LIBDIR)/ld.conf; fi
	cp nmlc $(BINDIR)/nmlc$(EXE)
	cp nml $(BINDIR)/nml$(EXE)
	cd stdlib; $(MAKE) install
	cd stdlib/nty; $(MAKE) install
	cd tools; $(MAKE) install
	cp main/toplevellib.cma $(LIBDIR)/toplevellib.cma
	cp expunge $(LIBDIR)/expunge$(EXE)
	cp ocaml/typing/outcometree.cmi ocaml/typing/outcometree.mli $(LIBDIR)
	cp main/ntopmain.cmo $(LIBDIR)
	cp main/toploop.cmi main/topdirs.cmi $(LIBDIR)
	for i in $(OTHERLIBRARIES); do \
	  (cd otherlibs/$$i; $(MAKE) install) || exit $$?; done
	if test -f nmlo; then $(MAKE) installopt; else :; fi

installopt:
	cd ocaml/asmrun; $(MAKE) install
	cp nmlo $(BINDIR)/nmlo$(EXE)
	cd stdlib; $(MAKE) installopt
	set -e; for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) installopt); done

clean:: partialclean

main/toplevellib.cma: $(NTOPLIBS)
	$(NEWCAMLC) -a -o main/toplevellib.cma $(NTOPLIBS)

clean::
	rm -f main/toplevellib.cma

######################### poisson ############################

parser/nparser.n: parser/nparser.ny
	$(NYACC) $(YACCFLAGS) parser/nparser.ny
clean::
	rm -f parser/nparser.n parser/nparser.output

beforedepend:: parser/nparser.n 

parser/nlexer.n: parser/nlexer.nl
	$(NLEX) parser/nlexer.nl

clean::
	rm -f parser/nlexer.n

beforedepend:: parser/nlexer.n

###############################################################

# The configuration file

utils/config.ml: utils/config.mlp config/Makefile
	@rm -f utils/config.ml
	sed -e 's|%%DONTYPING%%|$(DONTYPING)|' \
            -e 's|%%LIBDIR%%|$(LIBDIR)|' \
            -e 's|%%BYTERUN%%|$(BINDIR)/ncamlrun|' \
            -e 's|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS)|' \
            -e 's|%%BYTELINK%%|$(BYTECC) $(BYTECCLINKOPTS)|' \
            -e 's|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|' \
            -e 's|%%NATIVELINK%%|$(NATIVECC) $(NATIVECCLINKOPTS)|' \
            -e 's|%%PARTIALLD%%|ld -r $(NATIVECCLINKOPTS)|' \
            -e 's|%%BYTECCLIBS%%|$(BYTECCLIBS)|' \
            -e 's|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|' \
            -e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \
            -e 's|%%ARCH%%|$(ARCH)|' \
            -e 's|%%MODEL%%|$(MODEL)|' \
            -e 's|%%SYSTEM%%|$(SYSTEM)|' \
            -e 's|%%EXT_OBJ%%|.o|' \
            -e 's|%%EXT_ASM%%|.s|' \
            -e 's|%%EXT_LIB%%|.a|' \
            -e 's|%%EXT_DLL%%|.so|' \
            utils/config.mlp > utils/config.ml
	@chmod -w utils/config.ml

clean::
	rm -f utils/config.ml

beforedepend:: utils/config.ml

# The parser

ocaml/parsing/parser.mli ocaml/parsing/parser.ml: ocaml/parsing/parser.mly
	$(CAMLYACC) $(YACCFLAGS) ocaml/parsing/parser.mly

clean::
	rm -f ocaml/parsing/parser.mli ocaml/parsing/parser.ml ocaml/parsing/parser.output

beforedepend:: ocaml/parsing/parser.mli ocaml/parsing/parser.ml

# The lexer

ocaml/parsing/lexer.ml: ocaml/parsing/lexer.mll
	$(CAMLLEX) ocaml/parsing/lexer.mll

clean::
	rm -f ocaml/parsing/lexer.ml

beforedepend:: ocaml/parsing/lexer.ml

# The auxiliary lexer for counting line numbers

parser/linenum.ml: parser/linenum.mll
	$(CAMLLEX) parser/linenum.mll

clean::
	rm -f parser/linenum.ml

beforedepend:: parser/linenum.ml

# The numeric opcodes

ocaml/bytecomp/opcodes.ml: ocaml/byterun/instruct.h
	sed -n -e '/^enum/p' -e 's/,//g' -e '/^  /p' ocaml/byterun/instruct.h | \
	awk -f ocaml/tools/make-opcodes > ocaml/bytecomp/opcodes.ml

clean::
	rm -f ocaml/bytecomp/opcodes.ml

beforedepend:: ocaml/bytecomp/opcodes.ml

# The predefined exceptions and primitives

ocaml/byterun/primitives:
	cd ocaml/byterun; $(MAKE) primitives

ocaml/bytecomp/runtimedef.ml: ocaml/byterun/primitives ocaml/byterun/fail.h
	(echo 'let builtin_exceptions = [|'; \
	 sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$|  \1;|p' ocaml/byterun/fail.h | \
	 sed -e '$$s/;$$//'; \
         echo '|]'; \
         echo 'let builtin_primitives = [|'; \
         sed -e 's/.*/  "&";/' -e '$$s/;$$//' ocaml/byterun/primitives; \
	 echo '|]') > ocaml/bytecomp/runtimedef.ml

clean::
	rm -f ocaml/bytecomp/runtimedef.ml

beforedepend:: ocaml/bytecomp/runtimedef.ml

# Choose the right machine-dependent files

ocaml/tools/cvt_emit: ocaml/tools/cvt_emit.mll
	cd ocaml/tools; $(MAKE) cvt_emit

# The "expunge" utility

expunge: $(EXPUNGEOBJS)
	$(CAMLC) $(LINKFLAGS) -o expunge $(EXPUNGEOBJS)

clean::
	rm -f expunge

# The runtime system for the bytecode compiler

runtime:
	cd ocaml/byterun; $(MAKE) all
	if test -f stdlib/libcamlrun.a; then :; else \
          ln -s ../ocaml/byterun/libcamlrun.a stdlib/libcamlrun.a; fi
clean::
	cd ocaml/byterun; $(MAKE) clean
	rm -f stdlib/libcamlrun.a

alldepend::
	cd ocaml/byterun; $(MAKE) depend

# The runtime system for the native-code compiler

# The library

library:
	cd stdlib; $(MAKE) all
library-cross:
	cd stdlib; $(MAKE) RUNTIME=../byterun/ncamlrun all
libraryopt:
	cd stdlib; $(MAKE) allopt
clean::
	cd stdlib; $(MAKE) clean
alldepend::
	cd stdlib; $(MAKE) depend

# The extra libraries

otherlibraries:
	set -e; for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) all); done
otherlibrariesopt:
	set -e; for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) allopt); done
clean::
	for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) clean); done
alldepend::
	for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) depend); done

# Choose the right machine-dependent files

ocaml/asmcomp/arch.ml: ocaml/asmcomp/$(ARCH)/arch.ml
	ln -s $(ARCH)/arch.ml ocaml/asmcomp/arch.ml

partialclean::
	rm -f ocaml/asmcomp/arch.ml

beforedepend:: ocaml/asmcomp/arch.ml

ocaml/asmcomp/proc.ml: ocaml/asmcomp/$(ARCH)/proc.ml
	ln -s $(ARCH)/proc.ml ocaml/asmcomp/proc.ml

partialclean::
	rm -f ocaml/asmcomp/proc.ml

beforedepend:: ocaml/asmcomp/proc.ml

ocaml/asmcomp/selection.ml: ocaml/asmcomp/$(ARCH)/selection.ml
	ln -s $(ARCH)/selection.ml ocaml/asmcomp/selection.ml

partialclean::
	rm -f ocaml/asmcomp/selection.ml

beforedepend:: ocaml/asmcomp/selection.ml

ocaml/asmcomp/reload.ml: ocaml/asmcomp/$(ARCH)/reload.ml
	ln -s $(ARCH)/reload.ml ocaml/asmcomp/reload.ml

partialclean::
	rm -f ocaml/asmcomp/reload.ml

beforedepend:: ocaml/asmcomp/reload.ml

ocaml/asmcomp/scheduling.ml: ocaml/asmcomp/$(ARCH)/scheduling.ml
	ln -s $(ARCH)/scheduling.ml ocaml/asmcomp/scheduling.ml

partialclean::
	rm -f ocaml/asmcomp/scheduling.ml

beforedepend:: ocaml/asmcomp/scheduling.ml

# Preprocess the code emitters

ocaml/asmcomp/emit.ml: ocaml/asmcomp/$(ARCH)/emit.mlp ocaml/tools/cvt_emit
	$(CAMLRUN) ocaml/tools/cvt_emit < ocaml/asmcomp/$(ARCH)/emit.mlp > ocaml/asmcomp/emit.ml \
	|| { rm -f ocaml/asmcomp/emit.ml; exit 2; }

partialclean::
	rm -f ocaml/asmcomp/emit.ml

beforedepend:: ocaml/asmcomp/emit.ml


# The replay debugger


clean::
	rm -f boot/*.cm* boot/*.nty boot/camlheader boot/*.a boot/nyacc boot/ocamlyacc boot/ncamlrun

clean::
	cd ocaml/yacc; $(MAKE) clean

# Default rules

.SUFFIXES: .ml .mli .n .cmo .cmi .cmx .ns .nty

.ml.cmo:
	$(CAMLC) $(COMPFLAGS) -c $<

.mli.cmi:
	$(CAMLC) $(COMPFLAGS) -c $<

.ml.cmx:
	$(CAMLOPT) $(COMPFLAGS) -c $<

.n.cmo:
	$(NEWCAMLC) $(COMPFLAGS) -c $<

.n.cmx:
	$(CAMLOPT) $(COMPFLAGS) -c $<

.ns.nty:
	$(NEWCAMLC) $(COMPFLAGS) -c $<

clean::
	rm -f utils/*.cm[iox] utils/*.[so] utils/*~
	rm -f ocaml/parsing/*.cm[iox] ocaml/parsing/*.[so] ocaml/parsing/*~
	rm -f ocaml/typing/*.cm[iox] ocaml/typing/*.[so] ocaml/typing/*~
	rm -f ocaml/bytecomp/*.cm[iox] ocaml/bytecomp/*.[so] ocaml/bytecomp/*~
	rm -f ocaml/asmcomp/*.cm[iox] ocaml/asmcomp/*.[so] ocaml/asmcomp/*~
	rm -f ocaml/asmrun/*.cm[iox] ocaml/asmrun/*.[so] ocaml/asmrun/*~
	rm -f ocaml/driver/*.cm[iox] ocaml/driver/*.[so] ocaml/driver/*~
	rm -f ocaml/toplevel/*.cm[iox] ocaml/toplevel/*.[so] ocaml/toplevel/*~
	rm -f ocaml/tools/*.cm[iox] ocaml/tools/*.[so] ocaml/tools/*~
	rm -f parser/*.cm[iox] parser/*.[so] parser/*~
	rm -f n2caml/*.cm[iox] n2caml/*.[so] n2caml/*~
	rm -f typing/*.cm[iox] typing/*.[so] typing/*~
	rm -f lambda/*.cm[iox] lambda/*.[so] lambda/*~
	rm -f main/*.cm[iox] main/*.[so] main/*~
	rm -f *~
	rm -f stdlib/caml
	rm -f nmlc nml nmlo
	cd tools; $(MAKE) clean
	cd stdlib/nty; $(MAKE) clean
	cd ocaml/tools; $(MAKE) clean

depend: beforedepend
	nmakegen -d -f $(INCLUDES)
 
#	tools/nmlmake/nmlmake -d $(INCLUDES)

test::
	cd test/aparser; $(MAKE)
	cd test/bench; $(MAKE)
	cd test/bug; $(MAKE)
	cd test/hw; $(MAKE)

test-clean::
	cd test/aparser; $(MAKE) clean
	cd test/bench; $(MAKE) clean
	cd test/bug; $(MAKE) clean
	cd test/hw; $(MAKE) clean

alldepend:: depend

include .depend


syntax highlighted by Code2HTML, v. 0.9.1