# Build the OCamlDuce tools using an existing OCaml installation
VERSION=3.09.3pl1
OCAMLDUCELIBDIR=$(shell ocamlfind printconf destdir)/ocamlduce
all: ocamlducec ocamlduce ocamlducedep ocamlducedoc cduce/ocamlduce.cma ocamlducemktop
opt: all ocamlduceopt ocamlducec.opt ocamlduceopt.opt ocamlducedep.opt ocamlducedoc.opt cduce/ocamlduce.cmxa
# The OCaml tools to use
CAMLC=ocamlc.opt
CAMLOPT=ocamlopt.opt
CAMLYACC=ocamlyacc
YACCFLAGS=-v
CAMLLEX=ocamllex
CAMLDEP=ocamldep.opt
DEPFLAGS=$(INCLUDES)
OCAML_CONFIG=$(shell $(CAMLC) -where)/Makefile.config
include $(OCAML_CONFIG)
include stdlib/StdlibModules
INCLUDES=-I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver \
-I toplevel -I tools
COMPFLAGS=-warn-error A $(INCLUDES)
LINKFLAGS=
UTILS=cduce_types.cmo utils/misc.cmo utils/tbl.cmo utils/config.cmo \
utils/clflags.cmo utils/terminfo.cmo utils/ccomp.cmo utils/warnings.cmo \
utils/consistbl.cmo
OPTUTILS=$(UTILS)
PARSING=parsing/linenum.cmo parsing/location.cmo parsing/longident.cmo \
parsing/syntaxerr.cmo parsing/xparser.cmo parsing/parser.cmo \
parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo
TYPING=typing/unused_var.cmo typing/ident.cmo typing/path.cmo \
typing/primitive.cmo typing/types.cmo \
typing/btype.cmo typing/oprint.cmo \
typing/subst.cmo typing/predef.cmo \
typing/datarepr.cmo typing/env.cmo \
typing/typedtree.cmo typing/ctype.cmo \
typing/printtyp.cmo typing/typeext.cmo \
typing/includeclass.cmo \
typing/mtype.cmo typing/includecore.cmo \
typing/includemod.cmo typing/parmatch.cmo \
typing/typetexp.cmo typing/stypes.cmo typing/typecore.cmo \
typing/typedecl.cmo typing/typeclass.cmo \
typing/typemod.cmo
COMP=bytecomp/lambda.cmo bytecomp/printlambda.cmo \
bytecomp/typeopt.cmo bytecomp/switch.cmo bytecomp/matching.cmo \
bytecomp/translobj.cmo bytecomp/translext.cmo bytecomp/translcore.cmo \
bytecomp/translclass.cmo bytecomp/translmod.cmo \
bytecomp/simplif.cmo bytecomp/runtimedef.cmo
BYTECOMP=bytecomp/meta.cmo bytecomp/instruct.cmo bytecomp/bytegen.cmo \
bytecomp/printinstr.cmo bytecomp/opcodes.cmo bytecomp/emitcode.cmo \
bytecomp/bytesections.cmo bytecomp/dll.cmo bytecomp/symtable.cmo \
bytecomp/bytelink.cmo bytecomp/bytelibrarian.cmo bytecomp/bytepackager.cmo
ASMCOMP=asmcomp/arch.cmo asmcomp/cmm.cmo asmcomp/printcmm.cmo \
asmcomp/reg.cmo asmcomp/mach.cmo asmcomp/proc.cmo \
asmcomp/clambda.cmo asmcomp/compilenv.cmo \
asmcomp/closure.cmo asmcomp/cmmgen.cmo \
asmcomp/printmach.cmo asmcomp/selectgen.cmo asmcomp/selection.cmo \
asmcomp/comballoc.cmo asmcomp/liveness.cmo \
asmcomp/spill.cmo asmcomp/split.cmo \
asmcomp/interf.cmo asmcomp/coloring.cmo \
asmcomp/reloadgen.cmo asmcomp/reload.cmo \
asmcomp/printlinear.cmo asmcomp/linearize.cmo \
asmcomp/schedgen.cmo asmcomp/scheduling.cmo \
asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \
asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo asmcomp/asmpackager.cmo
DRIVER=driver/pparse.cmo driver/errors.cmo driver/compile.cmo \
driver/main_args.cmo driver/main.cmo
OPTDRIVER= driver/pparse.cmo driver/opterrors.cmo driver/optcompile.cmo \
driver/optmain.cmo
TOPLEVEL=driver/pparse.cmo driver/errors.cmo driver/compile.cmo \
toplevel/genprintval.cmo toplevel/toploop.cmo \
toplevel/trace.cmo toplevel/topdirs.cmo toplevel/topmain.cmo
TOPLEVELLIB=toplevel/toplevelducelib.cma
TOPLEVELSTART=toplevel/topstart.cmo
COMPOBJS=$(UTILS) $(PARSING) $(TYPING) $(COMP) $(BYTECOMP) $(DRIVER)
TOPLIB=$(UTILS) $(PARSING) $(TYPING) $(COMP) $(BYTECOMP) $(TOPLEVEL) cduce/ocamlduce.cma
TOPOBJS=$(TOPLEVELLIB) $(TOPLEVELSTART)
OPTOBJS=$(OPTUTILS) $(PARSING) $(TYPING) $(COMP) $(ASMCOMP) $(OPTDRIVER)
EXPUNGEOBJS=utils/misc.cmo utils/tbl.cmo \
utils/config.cmo utils/clflags.cmo \
typing/ident.cmo typing/path.cmo typing/types.cmo typing/btype.cmo \
typing/predef.cmo bytecomp/runtimedef.cmo bytecomp/bytesections.cmo \
bytecomp/dll.cmo bytecomp/meta.cmo bytecomp/symtable.cmo toplevel/expunge.cmo
CDUCE=\
cduce/src/custom.cmo cduce/src/encodings.cmo \
cduce/src/imap.cmo cduce/src/upool.cmo \
cduce/src/ns.cmo cduce/src/sortedList.cmo cduce/src/atoms.cmo \
cduce/src/bool.cmo cduce/src/chars.cmo cduce/src/ident.cmo \
cduce/src/intervals.cmo cduce/src/inttbl.cmo cduce/src/normal.cmo \
cduce/src/pretty.cmo cduce/src/stats.cmo \
cduce/src/compunit.cmo \
cduce/src/types.cmo cduce/src/sequence.cmo cduce/src/sample.cmo \
cduce/src/auto_pat.cmo cduce/src/patterns.cmo \
cduce/src/value.cmo cduce/src/run_dispatch.cmo cduce/src/explain.cmo \
cduce/src/typepat.cmo \
cduce/src/serial.cmo
# The compiler
ocamlducec: $(COMPOBJS)
$(CAMLC) $(LINKFLAGS) -o ocamlducec nums.cma $(COMPOBJS)
clean::
rm -f ocamlducec
# The native-code compiler
ocamlduceopt: $(OPTOBJS)
$(CAMLC) $(LINKFLAGS) -o ocamlduceopt nums.cma $(OPTOBJS)
clean::
rm -f ocamlduceopt
# The toplevel
ocamlduce: $(TOPOBJS) expungeduce
sed -e "s|%%OCAMLC_DIR%%|$(BINDIR)|" \
-e "s|%%EXPUNGEDUCE_DIR%%|.|" \
-e "s|%%LIBDIR%%|toplevel/|" \
tools/ocamlducemktop.tpl > mk_top
chmod +x mk_top
./mk_top -o ocamlduce
rm mk_top
toplevel/toplevelducelib.cma: $(TOPLIB)
$(CAMLC) -a -o $@ $(TOPLIB)
ocamlducemktop: tools/ocamlmktop.tpl $(TOPOBJS) expungeduce
sed -e "s|%%OCAMLC_DIR%%|$(BINDIR)|" \
-e "s|%%EXPUNGEDUCE_DIR%%|$(BINDIR)|" \
-e "s|%%LIBDIR%%|$(OCAMLDUCELIBDIR)/|" \
tools/ocamlducemktop.tpl > ocamlducemktop
chmod +x ocamlducemktop
clean::
rm -f ocamlduce toplevel/toplevelducelib.cma ocamlducemktop
# The configuration file
utils/config.ml: utils/config.mlp
@rm -f utils/config.ml
sed -e 's|%%LIBDIR%%|$(LIBDIR)|' \
-e 's|%%OCAMLDUCELIBDIR%%|$(OCAMLDUCELIBDIR)|' \
-e 's|%%VERSION%%|$(VERSION)|' \
-e 's|%%BYTERUN%%|$(BINDIR)/gcamlrun|' \
-e 's|%%CCOMPTYPE%%|cc|' \
-e 's|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS)|' \
-e 's|%%BYTELINK%%|$(BYTECC) $(BYTECCLINKOPTS)|' \
-e 's|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|' \
-e 's|%%NATIVELINK%%|$(NATIVECC) $(NATIVECCLINKOPTS)|' \
-e 's|%%PARTIALLD%%|ld -r $(NATIVECCLINKOPTS)|' \
-e 's|%%PACKLD%%|ld -r $(NATIVECCLINKOPTS)|' \
-e 's|%%BYTECCLIBS%%|$(BYTECCLIBS)|' \
-e 's|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|' \
-e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \
-e 's|%%CC_PROFILE%%|$(CC_PROFILE)|' \
-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|' \
-e 's|%%SYSTHREAD_SUPPORT%%|$(SYSTHREAD_SUPPORT)|' \
utils/config.mlp > utils/config.ml
@chmod -w utils/config.ml
clean::
rm -f utils/config.ml
beforedepend:: utils/config.ml
# The parser
parsing/parser.mli parsing/parser.ml: parsing/parser.mly
$(CAMLYACC) $(YACCFLAGS) parsing/parser.mly
clean::
rm -f parsing/parser.mli parsing/parser.ml parsing/parser.output
beforedepend:: parsing/parser.mli parsing/parser.ml
# The lexer
parsing/lexer.ml: parsing/lexer.mll
$(CAMLLEX) parsing/lexer.mll
clean::
rm -f parsing/lexer.ml
beforedepend:: parsing/lexer.ml
# The auxiliary lexer for counting line numbers
parsing/linenum.ml: parsing/linenum.mll
$(CAMLLEX) parsing/linenum.mll
clean::
rm -f parsing/linenum.ml
beforedepend:: parsing/linenum.ml
# The bytecode compiler compiled with the native-code compiler
ocamlducec.opt: $(COMPOBJS:.cmo=.cmx)
cd asmrun; $(MAKE) meta.o dynlink.o
$(CAMLOPT) $(LINKFLAGS) -ccopt "$(BYTECCLINKOPTS)" -o ocamlducec.opt \
nums.cmxa $(COMPOBJS:.cmo=.cmx) \
asmrun/meta.o asmrun/dynlink.o -cclib "$(BYTECCLIBS)"
clean::
rm -f ocamlducec.opt
# The native-code compiler compiled with itself
ocamlduceopt.opt: $(OPTOBJS:.cmo=.cmx)
$(CAMLOPT) $(LINKFLAGS) -o ocamlduceopt.opt nums.cmxa $(OPTOBJS:.cmo=.cmx)
clean::
rm -f ocamlduceopt.opt
# The numeric opcodes
bytecomp/opcodes.ml: byterun/instruct.h
sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/instruct.h | \
awk -f tools/make-opcodes > bytecomp/opcodes.ml
clean::
rm -f bytecomp/opcodes.ml
beforedepend:: bytecomp/opcodes.ml
# The predefined exceptions and primitives
byterun/primitives:
cd byterun; $(MAKE) primitives
bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h
(echo 'let builtin_exceptions = [|'; \
sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \
sed -e '$$s/;$$//'; \
echo '|]'; \
echo 'let builtin_primitives = [|'; \
sed -e 's/.*/ "&";/' -e '$$s/;$$//' byterun/primitives; \
echo '|]') > bytecomp/runtimedef.ml
clean::
rm -f bytecomp/runtimedef.ml
beforedepend:: bytecomp/runtimedef.ml
# Choose the right machine-dependent files
asmcomp/arch.ml: asmcomp/$(ARCH)/arch.ml
ln -s $(ARCH)/arch.ml asmcomp/arch.ml
clean::
rm -f asmcomp/arch.ml
beforedepend:: asmcomp/arch.ml
asmcomp/proc.ml: asmcomp/$(ARCH)/proc.ml
ln -s $(ARCH)/proc.ml asmcomp/proc.ml
clean::
rm -f asmcomp/proc.ml
beforedepend:: asmcomp/proc.ml
asmcomp/selection.ml: asmcomp/$(ARCH)/selection.ml
ln -s $(ARCH)/selection.ml asmcomp/selection.ml
clean::
rm -f asmcomp/selection.ml
beforedepend:: asmcomp/selection.ml
asmcomp/reload.ml: asmcomp/$(ARCH)/reload.ml
ln -s $(ARCH)/reload.ml asmcomp/reload.ml
clean::
rm -f asmcomp/reload.ml
beforedepend:: asmcomp/reload.ml
asmcomp/scheduling.ml: asmcomp/$(ARCH)/scheduling.ml
ln -s $(ARCH)/scheduling.ml asmcomp/scheduling.ml
clean::
rm -f asmcomp/scheduling.ml
beforedepend:: asmcomp/scheduling.ml
# Preprocess the code emitters
asmcomp/emit.ml: asmcomp/$(ARCH)/emit.mlp tools/cvt_emit
tools/cvt_emit < asmcomp/$(ARCH)/emit.mlp > asmcomp/emit.ml \
|| { rm -f asmcomp/emit.ml; exit 2; }
clean::
rm -f asmcomp/emit.ml
beforedepend:: asmcomp/emit.ml
tools/cvt_emit: tools/cvt_emit.mll
cd tools; $(MAKE) CAMLC="$(CAMLC)" CAMLLEX="$(CAMLLEX)" cvt_emit
# The "expunge" utility
expungeduce: $(EXPUNGEOBJS)
$(CAMLC) $(LINKFLAGS) -o expungeduce $(EXPUNGEOBJS)
clean::
rm -f expungeduce
# Default rules
.SUFFIXES: .ml .mli .cmo .cmi .cmx
.ml.cmo:
$(CAMLC) $(COMPFLAGS) -c $<
.mli.cmi:
$(CAMLC) $(COMPFLAGS) -c $<
.ml.cmx:
$(CAMLOPT) $(COMPFLAGS) -c $<
clean::
rm -f utils/*.cm[iox] utils/*.[so] utils/*~
rm -f parsing/*.cm[iox] parsing/*.[so] parsing/*~
rm -f typing/*.cm[iox] typing/*.[so] typing/*~
rm -f bytecomp/*.cm[iox] bytecomp/*.[so] bytecomp/*~
rm -f asmcomp/*.cm[iox] asmcomp/*.[so] asmcomp/*~
rm -f driver/*.cm[iox] driver/*.[so] driver/*~
rm -f toplevel/*.cm[iox] toplevel/*.[so] toplevel/*~
rm -f tools/*.cm[iox] tools/*.[so] tools/*~
rm -f cduce/*.cm[aiox] cduce/*.[so] cduce/*.a cduce/*.cmxa cduce/*~
rm -f cduce/src/*.cm[iox] cduce/src/*.[so] cduce/src/*~
rm -f *~
(cd asmrun; make clean)
(cd tools; make clean)
rm -f tools/*.bak
depend: beforedepend
touch cduce_types.mli
touch cduce_types.ml
(for d in utils parsing typing bytecomp asmcomp driver toplevel; \
do $(CAMLDEP) $(DEPFLAGS) $$d/*.mli $$d/*.ml; \
done) > .depend
$(CAMLDEP) -I cduce/src cduce/src/*.ml* >> .depend
FORCE:
include .depend
# The pack'ed modules from CDuce
cduce_types.cmi cduce_types.cmo:
$(MAKE) INCLUDES="-I cduce/src" \
CAMLC="$(CAMLC) -for-pack Cduce_types" \
$(CDUCE)
rm -f cduce_types.mli cduce_types.cmi
$(CAMLC) -pack -o cduce_types.cmo -I cduce/src $(CDUCE)
cduce_types.cmx:
$(MAKE) INCLUDES="-I cduce/src" \
CAMLC="$(CAMLC) -for-pack Cduce_types" \
CAMLOPT="$(CAMLOPT) -for-pack Cduce_types" \
$(CDUCE:.cmo=.cmx)
rm -f cduce_types.mli cduce_types.cmi
$(CAMLOPT) -pack -o cduce_types.cmx -I cduce/src $(CDUCE:.cmo=.cmx)
clean::
rm -f cduce_types.*
# The OCamlDuce library
cduce/ocamlduce.cma: ocamlducec cduce_types.cmo cduce/ocamlduce.cmo
./ocamlducec -a -o cduce/ocamlduce.cma cduce_types.cmo cduce/ocamlduce.cmo
cduce/ocamlduce.cmo: ocamlducec cduce/ocamlduce.ml cduce/ocamlduce.cmi
./ocamlducec -c -I cduce cduce/ocamlduce.ml
cduce/ocamlduce.cmi: ocamlducec cduce/ocamlduce.mli
./ocamlducec -c cduce/ocamlduce.mli
cduce/ocamlduce.cmxa: ocamlduceopt cduce_types.cmx cduce/ocamlduce.cmx
./ocamlduceopt -a -o cduce/ocamlduce.cmxa cduce_types.cmx cduce/ocamlduce.cmx
cduce/ocamlduce.cmx: ocamlduceopt cduce/ocamlduce.ml cduce/ocamlduce.cmi
./ocamlduceopt -c -I cduce cduce/ocamlduce.ml
clean::
rm -f cduce/ocamlduce.cm* cduce/*.o cduce/*.a
# The dependency generator
CAMLDEP_OBJ=tools/depend.cmo tools/ocamldep.cmo
CAMLDEP_IMPORTS=cduce_types.cmo \
utils/misc.cmo utils/config.cmo utils/clflags.cmo \
utils/terminfo.cmo \
parsing/linenum.cmo utils/warnings.cmo parsing/location.cmo \
parsing/longident.cmo \
parsing/syntaxerr.cmo parsing/xparser.cmo \
parsing/parser.cmo parsing/lexer.cmo parsing/parse.cmo
ocamlducedep: tools/depend.cmi $(CAMLDEP_OBJ)
$(CAMLC) $(LINKFLAGS) -o ocamlducedep nums.cma $(CAMLDEP_IMPORTS) $(CAMLDEP_OBJ)
ocamlducedep.opt: tools/depend.cmi $(CAMLDEP_OBJ:.cmo=.cmx)
$(CAMLOPT) $(LINKFLAGS) -o ocamlducedep.opt nums.cmxa \
$(CAMLDEP_IMPORTS:.cmo=.cmx) \
$(CAMLDEP_OBJ:.cmo=.cmx)
clean::
rm -f ocamlducedep*
# OCamldoc
ocamlducedoc: ocamlducedep
cd ocamldoc && $(MAKE) OCAMLC=$(CAMLC) OCAMLOPT=$(CAMLOPT) OCAMLLEX=$(CAMLLEX) OCAMLYACC=$(CAMLYACC) LINKFLAGS="nums.cma ../cduce_types.cmo" ocamldoc
cp ocamldoc/ocamldoc ./ocamlducedoc
ocamlducedoc.opt: ocamlducedep.opt
cd ocamldoc && $(MAKE) OCAMLC=$(CAMLC) OCAMLOPT=$(CAMLOPT) OCAMLLEX=$(CAMLLEX) OCAMLYACC=$(CAMLYACC) LINKFLAGS="nums.cmxa ../cduce_types.cmx" ocamldoc.opt
cp ocamldoc/ocamldoc.opt ./ocamlducedoc.opt
clean::
rm -f ocamlducedoc*
cd ocamldoc && $(MAKE) clean
# HTML documentation
htdoc: cduce/ocamlduce.cmi ocamlducedoc
mkdir -p htdoc
./ocamlducedoc -html -d htdoc cduce/ocamlduce.mli
clean::
rm -Rf htdoc
# Findlib installation
INSTALL_LIB_FILES= \
cduce/ocamlduce.cma cduce/ocamlduce.cmi cduce_types.cmi cduce/ocamlduce.mli \
cduce/ocamlduce.cmxa cduce/ocamlduce.o cduce_types.o cduce/ocamlduce.a \
toplevel/toploop.cmi toplevel/topdirs.cmi toplevel/topmain.cmi $(TOPOBJS)
INSTALL_BINARIES= \
ocamlducec ocamlduce ocamlducedep ocamlducedoc \
ocamlduceopt \
ocamlducemktop expungeduce ocamlducefind
OPT_VARIANTS= \
ocamlducec ocamlduceopt ocamlducedep ocamlducedoc
INSTALL_DOC_FILES= \
README LICENSE htdoc
install: FORCE META
for i in $(INSTALL_BINARIES); do \
cp $$i $(BINDIR)/; \
done
for i in $(OPT_VARIANTS); do \
cp $$i.opt $(BINDIR)/$$i; \
done
ocamlfind install ocamlduce META -optional $(INSTALL_LIB_FILES)
uninstall: FORCE
for i in $(INSTALL_BINARIES); do \
rm -f $(BINDIR)/$$i; \
done
ocamlfind remove ocamlduce
META: META.in
sed "s/%VER%/$(VERSION)/" META.in > META
clean::
rm -f META
# Build package
PACKAGE_FILES= \
Makefile .depend META.in ocamlducefind \
asmcomp asmrun bytecomp byterun cduce driver ocamldoc parsing \
toplevel typing utils tools
package: clean
(cd cduce; make copy)
rm -Rf ocamlduce-$(VERSION)
mkdir ocamlduce-$(VERSION)
cp -aR $(PACKAGE_FILES) ocamlduce-$(VERSION)/
(cd ocamlduce-$(VERSION); \
mkdir config; \
mkdir stdlib; \
cp ../stdlib/StdlibModules stdlib/; \
cp ../README.cduce README; \
cp ../LICENSE.cduce LICENSE)
tar czf ocamlduce-$(VERSION).tar.gz \
--exclude CVS --exclude ".#*" ocamlduce-$(VERSION)
rm -Rf ocamlduce-$(VERSION)
syntax highlighted by Code2HTML, v. 0.9.1