2013-01-17 27 views
7

Şu anda OCaml'de yazılmış bir web sitesi projesi üzerinde çalışıyorum ve js_of_ocaml kullanarak javascript'e derledim. ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml komutunu kullanarak sadece bir kaynak dosyam olduğu sürece oldukça iyi çalışıyor ancak projeme birkaç modül eklemek istiyorum. Bunu nasıl yapabilirim ?Js_of_ocaml ile modüller nasıl kullanılır?

Diğer modüller aslında bir lexer ve ocamllex ve menhir tarafından poduced bir ayrıştırıcıdır. Ocamllex ve menhir'i js_of_ocaml ile nasıl kullanabileceğimiz konusunda bir tutorial okumuştum ama js_of_ocaml'ın yüklü olduğu (yanlış yerleştirilmiş) ve ocamlbuild kullandığı yanlış varsayımlar yapar ve otomatik olarak kullanmadan elle nasıl yapılacağını bilmek isterim. ocamlbuild gibi bir araç.

cevap

8

(+site-lib varsayımlar ve OPAM ile ilgili olarak, bu size öğretici yazarlara rapor gereken bir şey, onlar. O da OPAM kullanıcıları için çalıştığından emin olmak isteyeceksiniz) Ben çalışarak çözüm buldu Resmi örnekler için maketleri anlayın.

İşte benim Makefile geçerli:

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, gerçekleştirdiği işlemlerin kaydını tutar. Bir ocamlbuild çağrısından sonra, _build/_log'a bakın ve tam argümanlar vb. Ile çağırdığı tüm komutları göreceksiniz. Muhtemelen el ile bunu nasıl yapacağınızı anlamanın en kolay yolu.

2

Bu deney bir demet aldı, ama sonunda o makefiles olarak ocsigen kullanımını ocamlfind aynı bayrakları geçmesi ocamlbuild olması yolunu bulmuştur. Ayrıca OPAM ile birlikte js_of_ocaml kullanıyorum.

Test durumum için iki dosya ile çok küçük bir örnek oluşturdum - main.ml ve square.ml.

square.ml:

let square x = x * x 

main.ml:

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

komut başarılı bir şekilde bu oluşturmak için:

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

Bu zaman ilk test durumda özdeş JS çıktı üretir kare işlevinin main.ml olduğu yer. Ocamlbuild günlüğü tam olarak ne beklediğimi gösterir (ocamldep'e iki, ocamlc -c'ye bir, ocamlc -linkpkg için iki çağrı).