2013-01-17 8 views
7

Obecnie pracuję nad projektem strony internetowej napisanym w języku OCaml i skompilowanym do javascript przy użyciu js_of_ocaml. Działa to całkiem dobrze, o ile mam tylko jeden plik źródłowy za pomocą komendy ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml, ale chciałbym włączyć kilka modułów do mojego projektu. Jak mogę to zrobić ?Jak korzystać z modułów z js_of_ocaml?

Pozostałe moduły to tak naprawdę leksyser i parser podcykowany przez ocamllex i menhir. Przeczytałem tutorial o używaniu ocamllex i menhir z js_of_ocaml, ale robi błędne założenia, gdzie js_of_ocaml jest zainstalowany (zainstalowałem go z opam) i używa ocamlbuild i chcę wiedzieć, jak to zrobić ręcznie bez użycia automatycznego narzędzie takie jak ocamlbuild.

Odpowiedz

8

znalazłem rozwiązanie, starając się zrozumieć pliki Makefile dla oficjalnych przykładów.

Oto mój 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

prowadzi rejestr operacji, które wykonuje. Po wywołaniu ocamlbuild, spójrz na _build/_log, a zobaczysz wszystkie polecenia, które on wywołał, z pełnymi argumentami itd. To prawdopodobnie najłatwiejszy sposób, aby dowiedzieć się, jak to zrobić ręcznie.

(chodzi +site-lib założeń i OPAM, że coś należy zgłosić się do autorów poradnika, oni chcą, aby upewnić się, że działa również dla użytkowników OPAM.)

2

Zajęło kilka eksperymentów, ale w końcu zorientowali się, jak mieć ocamlbuild przechodzą te same flagi ocamlfind jak ocsigen zastosowanie w tych makefile. Używam również js_of_ocaml zainstalowanego z OPAM.

Dla mojego przypadku testowego, stworzyłem bardzo mały przykład z dwoma plikami - main.ml i square.ml.

square.ml:

let square x = x * x 

main.ml:

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

Komenda budować to z powodzeniem:

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

To daje identyczną moc JS do mojego początkowego przypadku testowego gdzie funkcja kwadratowa znajdowała się w pliku main.ml. Dziennik ocamlbuild pokazuje dokładnie to, czego oczekuję (dwa wywołania do ocamldep, dwa do ocamlc -c, jeden do ocamlc-linkpkg).