2013-01-17 1 views
7

Je travaille actuellement sur un projet de site web écrit en OCaml et compilé en javascript en utilisant js_of_ocaml. Cela fonctionne plutôt bien tant que je n'ai qu'un seul fichier source utilisant la commande ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml mais je voudrais inclure plusieurs modules dans mon projet. Comment puis je faire ça ?Comment utiliser les modules avec js_of_ocaml?

Les autres modules sont en fait un lexeur et un analyseur par ocamllex et menhir. J'ai lu un tutorial sur comment utiliser ocamllex et menhir avec js_of_ocaml mais il fait de fausses suppositions sur l'endroit où js_of_ocaml est installé (je l'ai installé avec opam) et il utilise ocamlbuild et je veux savoir comment le faire à la main sans utiliser un système automatisé outil tel que ocamlbuild.

Répondre

8

Je trouve la solution en essayant de comprendre les makefiles pour les exemples officiels.

Voici mon 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 conserve un journal des opérations qu'il effectue. Après un appel ocamlbuild, regardez _build/_log et vous verrez toutes les commandes qu'il a invoquées, avec des arguments complets, etc. C'est probablement le moyen le plus facile pour vous de comprendre comment le faire à la main.

(En ce qui concerne +site-lib hypothèses et OPAM, qui est quelque chose que vous devez signaler aux auteurs du tutoriel, ils veulent faire en sorte que cela fonctionne aussi pour les utilisateurs OPAM.)

2

Il a pris un tas d'expérimentation, mais j'ai finalement compris comment avoir ocamlbuild passer les mêmes drapeaux pour ocamlfind que Ocsigen utilisation dans les makefiles. J'utilise aussi js_of_ocaml installé avec OPAM.

Pour mon cas de test, j'ai créé un très petit exemple avec deux fichiers - main.ml et square.ml.

square.ml:

let square x = x * x 

main.ml:

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

La commande pour construire ce succès:

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

Ce produit sortie JS identique à mon cas de test initial où la fonction carré était dans main.ml. Le journal ocamlbuild montre exactement ce que j'attends (deux appels à ocamldep, deux à ocamlc -c, un à ocamlc -linkpkg).

Questions connexes