I want an 'ocamlopt' to be a Linux native binary[1] that generates
Windows executables.
We have a cross-assembler and cross-linker (i686-pc-mingw32-as and
i686-pc-mingw32-gcc respectively). We also have a cross-compiler
version of flexdll.
My best attempt so far has been to generate config/{m,s}.h from
prepared Windows versions, and then build using the Unix Makefiles.
This gets some way, but produces an ocamlc which searches for files
using \ as a path separator, which is wrong and causes it to fail
looking for pervasives.cmi.
Anyone done this, or care to share any more hints?
Rich.
[1] Running stuff under Wine isn't acceptable and nor is installing
binaries.
--
Richard Jones
Red Hat
_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs
Here is a Linux -> Win32 OCaml cross-compiler, developed and sponsored
by Red Hat's Fedora MinGW project[1]. Red Hat are sponsoring this
project so that we can build our OCaml virt tools for Windows without
the hassle of using Windows.
http://hg.et.redhat.com/misc/fedora-mingw--devel/
(There is no direct link - to get the latest version you have
to click "manifest" then "ocaml").
If you're not familiar with RPM builds, then start with the .spec file
and the patches. Pay close attention to the 'BuildRequires' which are
the parts of the MinGW project you will need to build it - in
particular, we use a version of FlexDLL which we have modified for
cross-compilation.
It's probably best to say what does work, because the list of what
_doesn't_ work is quite long. But with this you get:
i686-pc-mingw32-ocamlopt
The cross-compiler replacement for ocamlopt
(bytecode so you need a corresponding
ocamlrun interpreter to use it)
*.cmx, *.cmxa
The usual OCaml stdlib libraries, eg. nums, dynlink, unix, threads
(only lightly tested)
eg:
$ cat /tmp/test.ml
open Printf
let () =
printf "reported os_type = %S\n" Sys.os_type;
printf "ok\n"
$ boot/ocamlrun i686-pc-mingw32-ocamlopt -verbose -I stdlib /tmp/test.ml \
-o /tmp/test.exe
+ i686-pc-mingw32-as -o '/tmp/test.o' '/tmp/camlasm56b36c.s'
+ i686-pc-mingw32-as -o '/tmp/camlstartup4b26a5.o' '/tmp/camlstartup76cf6d.s'
+ flexlink -chain mingw -exe -o '/tmp/test.exe' -I'/usr/lib64/i686-pc-mingw32-ocaml' '-Lstdlib' '-L/usr/lib64/i686-pc-mingw32-ocaml' '/tmp/camlstartup4b26a5.o' 'stdlib/std_exit.o' '/tmp/test.o' 'stdlib/stdlib.a' 'stdlib/libasmrun.a'
$ file /tmp/test.exe
/tmp/test.exe: PE32 executable for MS Windows (console) Intel 80386 32-bit
$ wine /tmp/test.exe
reported os_type = "Win32"
ok
There are about a million things to fix, but this should be enough to
get people started.
Rich.
[1] https://fedoraproject.org/wiki/MinGW
Thanks for this work, that seems an awsome achievement !
Romain