[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