2013-06-26 6 views
9

Voglio compilare qualche bytecode OCaml e farlo girare su sistemi Windows e Unix. Il mio codice sorgente funziona bene se lo ricompilifico su ogni piattaforma, ma il bytecode non è portabile.Come realizzare il bytecode OCaml che funziona su Windows e Linux

codice di esempio: comando

open Unix 

let on_windows = Filename.dir_sep <> "/";; 
Printf.printf "On windows: %b\n" on_windows;; 

let child = create_process "gpg" (Array.of_list ["gpg"; "--version"]) stdin stdout stderr;; 
Printf.printf "Child %d\n" child;; 

Corporatura:

ocamlbuild -use-ocamlfind -pkg unix test.byte 

Se compilo in Windows ed eseguire su Linux, ottengo

Fatal error: unknown C primitive `win_waitpid' 

Se compilo su Linux ed eseguire su Windows ottengo:

Fatal error: unknown C primitive `unix_waitpid' 

Come posso far funzionare il bytecode ovunque?

+0

Si prega di mostrare il comando di compilazione. – ygrek

+0

Sto usando ocamlbuild - Ho modificato la domanda. –

risposta

2

Rinominare semplicemente i simboli C non funziona perché ci sono due versioni completamente diverse del modulo unix.ml (sebbene con la stessa interfaccia). Se colleghi il tuo codice staticamente, otterrai quello per la piattaforma di build e non funzionerà sull'altra piattaforma.

La soluzione è creare e distribuire un archivio .cma (con il modulo Unix non collegato in) anziché un eseguibile. Quindi utilizzare ocaml per collegare in modo dinamico sulla piattaforma di destinazione:

http://roscidus.com/blog/blog/2013/07/07/ocaml-binary-compatibility/#windows--linux-compatibility

Update: Questo non è sicuro. Quando si esegue ocaml /path/to/script.ml, aggiunge la directory corrente (non la directory contenente lo script) all'inizio del percorso di ricerca. Così:

$ cd /tmp 
$ /usr/bin/myprog 

tenterà prima di caricare le librerie di myprog (ad esempio unix.cma) da /tmp.

dovrebbe essere fissato in 4.03: http://caml.inria.fr/mantis/view.php?id=6081

8

Ovviamente, la ragione è che la libreria ocaml unix ha nomi diversi per gli stub C a seconda della piattaforma e questo ostacola la portabilità del codice. Non vedo l'uscita tranne patch per i nomi stub.

+0

Come faccio a farlo (nomi di stub delle patch)? –

+0

Devi installare (almeno) mingw sotto Windows. Puoi provare a hackerare il pacchetto aggiungendo mingw DLL nel PERCORSO e avviare bytecode quindi – Ontologiae

+0

Sembra che win_waitpid sia una funzione OCaml, non una di tipo mingw (non che io sappia nulla di ciò). http://caml.inria.fr/svn/ocaml/branches/sse2/otherlibs/win32unix/winwait.c –

Problemi correlati