Hello,

This is consistent with how ocamlc/ocamlopt work: separate compilation is ensured the way you think by bytecode .cmo compilation: to build a module, you only need the *interfaces* of its dependencies, but it is unfortunately not ensured when compiling to native code, because of the global (inter-modules) optimizations performed (inlining AFAIK). Thus, to build a .cmx module, you need to be aware of the actual *code* of its dependencies.

I wonder now if it would be theoretically possible to do these optimization, not at compile-time, but delay them until link-time, when the code is fully known...

Cheers,
    -m

Le 03/13/2012 07:19 PM, Matej Košík a écrit :
Hi,

The "ocamldep" tool generates Makefile dependencies for both situations:
- when we use "ocamlc"
- as well as when we use "ocamlopt"

Dependencies, generated for "*.cmo" files,
are corresponding "*.cmi" files.

This is not surprising.

However, dependencies, generated for "*.cmx" files,
are always other "*.cmx" files.

This is surprising.

Why "*.cmx" files do not depend on "*.cmi" files?

I have noticed this in a bigger project but this phenomenon appear to
happen for arbitrarily small projects.

Consider the following ocamldep-generated couple of rules:

src/ml2c/typing/printtyp.cmo: src/ml2c/typing/types.cmi \
     src/ml2c/typing/primitive.cmi src/ml2c/typing/predef.cmi \
     src/ml2c/typing/path.cmi src/ml2c/typing/outcometree.cmi \
     src/ml2c/typing/oprint.cmi src/ml2c/utils/misc.cmi \
     src/ml2c/parsing/longident.cmi src/ml2c/typing/ident.cmi \
     src/ml2c/typing/env.cmi src/ml2c/typing/ctype.cmi \
     src/ml2c/utils/clflags.cmi src/ml2c/typing/btype.cmi \
     src/ml2c/parsing/asttypes.cmi src/ml2c/typing/printtyp.cmi
src/ml2c/typing/printtyp.cmx: src/ml2c/typing/types.cmx \
     src/ml2c/typing/primitive.cmx src/ml2c/typing/predef.cmx \
     src/ml2c/typing/path.cmx src/ml2c/typing/outcometree.cmx \
     src/ml2c/typing/oprint.cmx src/ml2c/utils/misc.cmx \
     src/ml2c/parsing/longident.cmx src/ml2c/typing/ident.cmx \
     src/ml2c/typing/env.cmx src/ml2c/typing/ctype.cmx \
     src/ml2c/utils/clflags.cmx src/ml2c/typing/btype.cmx \
     src/ml2c/parsing/asttypes.cmx src/ml2c/typing/printtyp.cmi

The second rule seems to be unnecessarily demanding (unless it makes no
sense to compile *.cmi files if we use ocamlopt). It should read:

src/ml2c/typing/printtyp.cmx: src/ml2c/typing/types.cmi \
     src/ml2c/typing/primitive.cmi src/ml2c/typing/predef.cmi \
     src/ml2c/typing/path.cmi src/ml2c/typing/outcometree.cmi \
     src/ml2c/typing/oprint.cmi src/ml2c/utils/misc.cmi \
     src/ml2c/parsing/longident.cmi src/ml2c/typing/ident.cmi \
     src/ml2c/typing/env.cmi src/ml2c/typing/ctype.cmi \
     src/ml2c/utils/clflags.cmi src/ml2c/typing/btype.cmi \
     src/ml2c/parsing/asttypes.cmi src/ml2c/typing/printtyp.cmi

Shouldn't it?



--
Caml-list mailing list.  Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Reply via email to