2013-01-17 19 views
7

Attualmente sto lavorando su un progetto di sito web scritto in OCaml e compilato a JavaScript utilizzando js_of_ocaml. Funziona abbastanza bene finché ho un solo file sorgente usando il comando ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml ma vorrei includere diversi moduli nel mio progetto. Come lo posso fare ?Come utilizzare i moduli con js_of_ocaml?

Gli altri moduli sono in realtà un lexer e parser poduced da ocamllex e menhir. Ho letto un tutorial su come utilizzare ocamllex e menhir con js_of_ocaml ma rende ipotesi sbagliate su cui è installato js_of_ocaml (ho installato con OPAM) e utilizza ocamlbuild e voglio sapere come fare a mano senza l'utilizzo di un sistema automatizzato strumento come ocamlbuild.

risposta

8

ho trovato la soluzione, cercando di capire i makefile per gli esempi ufficiali.

Ecco il mio Makefile:

OBJS=file1.cmo file2.cmo file3.cmo 
NAME=projectname 
OCAMLC=ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o 

$(NAME).byte: $(OBJS) 
     $(OCAMLC) -linkpkg -o [email protected] $(OBJS) 

$(NAME).js: $(NAME).byte 
     js_of_ocaml $< 

%.cmo: %.ml 
     $(OCAMLC) -c $< 
... 
5

ocamlbuild tiene un registro delle operazioni che esegue. Dopo una chiamata ocamlbuild, guardi _build/_log e vedrete tutti i comandi che ha invocato, con il massimo dei argomenti ecc Questo è probabilmente il modo più facile per voi di capire come farlo a mano.

(Per quanto riguarda +site-lib ipotesi e OPAM, questo è qualcosa che si dovrebbe riferire al del tutorial gli autori, vorranno fare in modo che funziona anche per gli utenti di OPAM.)

2

C'è voluto un po 'di sperimentazione, ma alla fine ho capito come avere ocamlbuild passare le stesse bandiere al ocamlfind uso come ocsigen in quelle makefile. Sto anche usando js_of_ocaml installato con OPAM.

Per il mio banco di prova, ho creato un piccolo esempio con due file - main.ml e square.ml.

square.ml:

let square x = x * x 

main.ml:

let() = (Js.Unsafe.coerce Dom_html.window)##square <- Js.wrap_callback Square.square 

Il comando per costruire questo successo:

ocamlbuild -use-ocamlfind -pkgs js_of_ocaml,js_of_ocaml.syntax -syntax camlp4o main.byte 

Questo produce identica uscita JS al mio banco di prova iniziale dove la funzione quadrata era in main.ml. Il registro ocamlbuild mostra esattamente quello che mi aspetto (due chiamate a ocamldep, due a ocamlc -c, uno a ocamlc -linkpkg).

Problemi correlati