ON THU, MAR 20, 2008 AT 11:04:23AM +0100, FRAN?½OIS PUITG WROTE:
> I'VE TRIED TO USE FILE.CM[IO] ON A LINUX BOX (SAY HOST1) ON A SUN
> ULTRA-SPARC (SAY HOST2).
>
> I GET THE FOLLOWING ERROR ON HOST2 :
>
> # #LOAD "FILE.CMO";;
> THE FILES FILE.CMO
> AND /USR/LOCAL/BIN/OCAML
> DISAGREE OVER INTERFACE PERVASIVES
> #
>
> I SUSPECT A PROBLEM OF VERSION SINCE FILE.CM[IO] HAVE BEEN COMPILED
> WITH OCAML 3.10.0 ON HOST1 WHEREAS HOST1 PROVIDES ONLY OCAML 3.09.3.
YOU WERE ACTUALLY LUCKY THAT YOU GOT AN ERROR MESSAGE. IT COULD JUST
AS EASILY HAVE BEEN A SEGFAULT.
*.CMI & *.CMO FILES CONTAIN INTERNAL COMPILER STRUCTURES, SERIALIZED
INTO A FILE USING THE MARSHAL MODULE. MARSHAL IS UNSAFE IF THE TYPES
OF WHAT YOU MARSHAL CHANGE AT ALL, AND SINCE THESE STRUCTURES CHANGE
WITH EACH COMPILER RELEASE (EVEN POINT RELEASES), THERE IS NO
COMPATIBILITY AT ALL.
YOU NEED TO HAVE IDENTICAL COMPILER VERSIONS -- SAY 3.10.0 ON BOTH OR
3.09.3 ON BOTH. BUT IT'S BETTER TO COMPILE FROM SOURCE (IN FACT I
SUSPECT IF YOU ASK INRIA THEY'LL TELL YOU TO COMPILE FROM SOURCE IN
ALL CASES).
A DIFFERENT ASPECT TO THIS IS WHETHER A *.CM[IO] FILE COMPILED ON A
LINUX BOX WOULD WORK ON A SUN BOX WITH THE SAME OCAML VERSION, IF THE
LINUX BOX AND SUN BOX HAD DIFFERENT ENDIANNESS OR WORD SIZE. THE
ANSWER HERE IS (SURPRISINGLY) YES - IT WILL WORK. MARSHAL IS SAFE
AGAINST ENDIANNESS AND WORD SIZE CHANGES. I TESTED THIS RECENTLY BY
COMPILING SOME MODULE ON I386, X86-64, PPC AND PPC64 AND COMPARING THE
RESULTING *.CMO FILES, AND THEY WERE INDEED IDENTICAL.
AND A FINAL POINT: *.CMI & *.CMO FILES CAN BE TRANSFERRED BETWEEN
UNIX-LIKE SYSTEMS (LINUX, SOLARIS, MACS), BUT NOT BETWEEN *NIX AND
WINDOWS. THE REASON IS THAT THE STDLIB IS COMPILED DIFFERENTLY ON
WINDOWS. IN PARTICULAR THE 'UNIX' (REALLY POSIX) MODULE ON WINDOWS
HAS IIRC A DIFFERENT SIGNATURE. ON *NIX SYSTEMS IT JUST MAKES DIRECT
POSIX CALLS, BUT ON WINDOWS IT HAS TO DO A WHOLE LOT OF EMULATION.
RICH.
--
RICHARD JONES
RED HAT
.