Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Caml-list] ocamlbuild - missing dependencies at byte-code link with mlpack

62 views
Skip to first unread message

Grégoire Sutre

unread,
Jun 29, 2010, 9:53:04 AM6/29/10
to caml...@yquem.inria.fr, Alexander Heussner
Hi,

I obtain an error `Reference to undefined global ...' with ocamlbuild in
the following situation (simplified example, attached as example.diff).

[File] [Contents]

example
|-- Main.ml let _ = Pack.Packed.g ()
|
|-- Pack.mlpack pack/Packed
|
|-- _tags <lib>: include
| <pack/*.cmx>: for-pack(Pack)
|
|-- lib
| |-- Lib.ml let f () = ()
| `-- Lib.mli val f : unit -> unit
`-- pack
`-- Packed.ml let g () = Lib.f ()


$ ocamlbuild -classic-display Main.byte
/usr/pkg/bin/ocamldep.opt -modules Main.ml > Main.ml.depends
/usr/pkg/bin/ocamldep.opt -modules pack/Packed.ml > pack/Packed.ml.depends
/usr/pkg/bin/ocamldep.opt -modules lib/Lib.mli > lib/Lib.mli.depends
/usr/pkg/bin/ocamlc.opt -c -I lib -o lib/Lib.cmi lib/Lib.mli
/usr/pkg/bin/ocamlc.opt -c -I pack -I lib -o pack/Packed.cmo pack/Packed.ml
/usr/pkg/bin/ocamlc.opt -pack pack/Packed.cmo -o Pack.cmo
/usr/pkg/bin/ocamlc.opt -c -I lib -o Main.cmo Main.ml
/usr/pkg/bin/ocamlc.opt Pack.cmo Main.cmo -o Main.byte
+ /usr/pkg/bin/ocamlc.opt Pack.cmo Main.cmo -o Main.byte
File "_none_", line 1, characters 0-1:
Error: Error while linking Pack.cmo:
Reference to undefined global `Lib'
Command exited with code 2.

This is with ocaml 3.11.1, but I obtain the same result with ocaml
3.12.0+beta1.


If I read the code correctly, this comes from the function prepare_link
in ocaml_compiler.ml which derives the dependencies from the files
ml.depends and .mli.depends. But these files are not generated for
packs, hence the required dependencies are not build.

The attached small patch (patch-ocamlbuild-link-pack-deps.diff) simply
treats the .mlpack files as dependency files for packs, which fixes
the issue. This has been tested on a larger project with more nested
dependencies. But I'm new to ocamlbuild, and I may have overlooked
something.


Alternatively, the problem can be fixed with an ocamlbuild plugin that
generates appropriate %.ml.depends from %.mlpack. In case it helps
others encountering the same issue, I attach an implementation of such
a plugin.

If there is a better/simpler solution to this problem, please let me
know.

Thanks,

Grégoire Sutre

p.s. This byte-code linking problem with packs was reported to the list
two years ago [1], but with no answer.

[1]
http://caml.inria.fr/pub/ml-archives/caml-list/2008/06/784c154d0f7b53995c0167ac63fc5bb9.en.html


example.diff
patch-ocamlbuild-link-pack-deps.diff
myocamlbuild.ml
0 new messages