The ocamldsort(1) command scans a set of OCaml source files (.ml and .mli files), sorts them according to
their dependencies and prints the sorted files in order to link their corresponding .cmo files.
For ocamldsort(1) to work it must get a list of dependencies generated by ocamldep(1), if the standard
input to ocamldsort(1) has been redirected then ocamldsort assumes that this is a dependency file
generated by ocamldep(1). Otherwise ocamldsort calls ocamldep(1) to generate the dependency list itself.
In either case the source files to be sorted should be given as arguments to the ocamldsort(1) command.
ocamldsort(1) can be used to compile and link simple projects with one command, such as:
ocamlc $(ocamldsort *.ml)
if your project doesn't contain .mli files or:
ocamlc -c $(ocamldsort -mli *.ml *.mli) && ocamlc $(ocamldsort -byte *.ml)
if it contains .mli files.
However for larger projects where separate compilation is desirable, ocamldsort(1) can also be used from
within a makefile. Here is a typical makefile example:
TARGET=my_program
OCAMLC=ocamlc
OCAMLOPT=ocamlopt
OCAMLDEP=ocamldep
OCAMLDSORT=ocamldsort
.if (0 > 2) . an-style-warn blank line in input
.sp
PPFLAGS=-pp camlp4o
.if (0 > 2) . an-style-warn blank line in input
.sp
MLY=$(shell echo *.mly)
MLL=$(shell echo *.mll)
GENERATED_ML=$(MLY:.mly=.ml) $(MLL:.mll=.ml)
.if (0 > 2) . an-style-warn blank line in input
.sp
include .generated .depend .ocamldsort
.if (0 > 2) . an-style-warn blank line in input
.sp
$(TARGET): $(CMO_FILES)
$(OCAMLC) $(COMPFLAGS) $(LIBS) $^ -o $@
.if (0 > 2) . an-style-warn blank line in input
.sp
$(TARGET).opt: $(CMX_FILES)
$(OCAMLOPT) $(COMPFLAGS) $(LIBS_OPT) $^ -o $@
.if (0 > 2) . an-style-warn blank line in input
.sp
.generated: $(GENERATED_ML)
@touch .generated
.if (0 > 2) . an-style-warn blank line in input
.sp
.depend: .generated
$(OCAMLDEP) *.ml *.mli > $@
.if (0 > 2) . an-style-warn blank line in input
.sp
.ocamldsort: .depend
echo CMO_FILES=`< .depend $(OCAMLDSORT) -byte *.ml` > .ocamldsort
echo CMX_FILES=`< .depend $(OCAMLDSORT) -opt *.ml` >> .ocamldsort
.if (0 > 2) . an-style-warn blank line in input
.sp
distclean: clean
rm -f .generated .depend .ocamldsort
rm -f $(GENERATED_ML)
rm -f *~
rm -f $(TARGET)
.if (0 > 2) . an-style-warn blank line in input
.sp
clean:
rm -f *.cmo *.cmi *.cmx *.o
.if (0 > 2) . an-style-warn blank line in input
.sp
.SUFFIXES: .mli .ml .cmi .cmo .cmx .mll .mly
.if (0 > 2) . an-style-warn blank line in input
.sp
%.cmi:%.mli
$(OCAMLC) $(PPFLAGS) $(COMPFLAGS) -c $<
.if (0 > 2) . an-style-warn blank line in input
.sp
%.cmo:%.ml
$(OCAMLC) $(PPFLAGS) $(COMPFLAGS) -c $<
.if (0 > 2) . an-style-warn blank line in input
.sp
%.cmi %.cmo:%.ml
$(OCAMLC) $(PPFLAGS) $(COMPFLAGS) -c $<
.if (0 > 2) . an-style-warn blank line in input
.sp
%.cmx %.o:%.ml
$(OCAMLOPT) $(PPFLAGS) $(COMPFLAGS) -c $<
.if (0 > 2) . an-style-warn blank line in input
.sp
%.ml:%.mll
$(OCAMLLEX) $<
.if (0 > 2) . an-style-warn blank line in input
.sp
%.mli %.ml:%.mly
$(OCAMLYACC) -v $<