Inconsistent assumptions in compiler-libs interfaces
Opened this issue · 1 comments
OCaml-Java 2.0-alpha1, freshly-installed from OPAM, has the following problem:
$ cat t.ml
let g _ = Lambda.is_guarded
let h _ = Bytegen.reset
$ ocamljava -c -I +compiler-libs t.ml
File "t.ml", line 1:
Error: The files /home/jeremy/.opam/ocamljava-2.0-alpha1/lib/ocaml/compiler-libs/lambda.cmi
and /home/jeremy/.opam/ocamljava-2.0-alpha1/lib/ocaml/compiler-libs/bytegen.cmi
make inconsistent assumptions over interface Lambda
The ocamlobjinfo
tool shows that the crcs are indeed different:
$ ocamlobjinfo bytegen.cmi lambda.cmi | grep Lambda
f4443f50b0df5f177b11fcb7305bac35 Lambda
Unit name: Lambda
e86623cfe85b127520d0debaecc42ab2 Lambda
There is clearly a bug in the build/install scripts. However, what you
observe is the mere symptom of a deeper problem: compiler-libs
contains one version of the Lambda
module while two versions
actually exist during the build: one for the ocamlc
and ocamlopt
compilers, and one for the ocamljava
compiler (in the latter case,
the lambda structure is extended with additional cases, and some
typing information from previous phases is also kept).
Your reproduction case shows that the version actually installed in
compiler-libs
is the one for ocamljava
. To me, the bug is that the
Bytegen
module should not be installed as it cannot be used.
Now, another possibility would be to patch the code of the ocamlc
and ocamlopt
compilers to use the extended lambda structure, and
just ignore the additional elements. This is slightly heavier and would
imply maintenance costs, but if you have an interesting use case...