Dependency Analysis
Dependency analysis of a set of implementation and interface files
that make up an Objective CAML application pursues a double end. The first
is to get a global view of the interdependencies between modules. The
second is to use this information in order to recompile only the
absolutely necessary files after modifications of certain files.
The ocamldep command takes a set of .ml and .mli
files and outputs the dependencies between files in Makefile1 format.
These dependencies originate from global declarations in other
modules, either by using dot.notation (e.g. M1.f) or by
opening a module (e.g. open M1).
Suppose the following files exist:
dp.ml :
let
print_vect
v
=
for
i
=
0
to
Array.length
v
do
Printf.printf
"%f "
v.
(i)
done;
print_newline();;
and d1.ml :
let
init
n
e
=
let
v
=
Array.create
4
3
.
1
4
in
Dp.print_vect
v;
v;;
Given the name of these files, the ocamldep command will output
the following dependencies:
$ ocamldep dp.ml d1.ml array.ml array.mli printf.ml printf.mli
dp.cmo: array.cmi printf.cmi
dp.cmx: array.cmx printf.cmx
d1.cmo: array.cmi dp.cmo
d1.cmx: array.cmx dp.cmx
array.cmo: array.cmi
array.cmx: array.cmi
printf.cmo: printf.cmi
printf.cmx: printf.cmi
The dependencies are determined for both the bytecode and the native
compiler. The output is to be read in the following manner:
production of the file dp.cmo depends on the files
array.cmi and printf.cmi. Files with the extension
.cmi depend on files with the same name and extension
.mli. And the same holds by analogy for .ml files with
.cmo and .cmx files.
The object files of the distribution do not show up in the dependency
lists. In fact, if ocamldep does not find the files
array.ml and printf.ml in the current directory, it
will find them in the library directory of the installation and
produce the following output:
$ ocamldep dp.ml d1.ml
d1.cmo: dp.cmo
d1.cmx: dp.cmx
To give new file search paths to the ocamldep command, the
-I directory option is used, which adds a directory to the list of
include directories.