[Omake] Subtle dependency problem

Alain Frisch alain.frisch at lexifi.com
Thu May 29 09:50:28 PDT 2008


Dear omake community,

(Nicolas is in Cc: in case the discussion also concerns ocamlbuild.)

In OCaml, some dependencies can only be discovered at type-checking 
time. Indeed, consider the following modules:

a.ml:
type t = int

b.ml:
let x : A.t = 1

c.ml:
B.x + 1

To compile c.ml, we need not only to read b.cmi, but also a.cmi. 
Unfortunately, there is no way to know that by simply looking at its 
code. So of course, ocamldep misses this dependency:

$ ocamldep -modules c.ml
c.ml: B

In general, this is not a problem, because the build system will compile 
b.ml before c.ml, and so a.cmi will be available anyway. But consider 
the following scenario: c.ml is in another directory than a.ml and b.ml 
and instead of adding an extra -I option, we want to copy a.cmi and 
b.cmi into its directory. So we add to the OMakefile some copying rules 
(with proper dependencies) for these two files. But now, nothing forces 
omake to copy a.cmi in c.ml's directory before compiling c.ml.

This produces tricky errors that are difficult to diagnose because often 
the file a.cmi has already been copied by a former compilation.

A simple way to simplify the diagnosis would be to parse the .cmi files
after the compilation in order to check that all real dependencies had 
been found by omake. I know how to handle the 'parsing the .cmi' part, 
but I don't know how to implement the 'check' part. Any idea?


How should the problem be really addressed? Of course, it is possible to 
force an explicit dependency from c.ml to a.ml (by adding a dummy open 
statement for instance), but this is not very satisfactory. We could 
argue that copying .cmi files around is a bad idea, but there are good 
reasons to do so.

Have people been confronted to such problems already?


Alain



More information about the Omake mailing list