Build 如何使用带有js_或ocaml的模块?

Build 如何使用带有js_或ocaml的模块?,build,module,ocaml,menhir,js-of-ocaml,Build,Module,Ocaml,Menhir,Js Of Ocaml,我目前正在从事一个用OCaml编写的网站项目,并使用js_of_OCaml编译成javascript。只要我使用命令ocamlfind ocamlc-package js_of_ocaml-package js_of_ocaml.syntax-syntax camlp4o-linkpkg-o file.byte file.ml只有一个源文件,它就工作得很好,但我想在我的项目中包括几个模块。我该怎么做 其他模块实际上是由ocamlex和menhir开发的lexer和parser。我读过一篇关于如何

我目前正在从事一个用OCaml编写的网站项目,并使用js_of_OCaml编译成javascript。只要我使用命令
ocamlfind ocamlc-package js_of_ocaml-package js_of_ocaml.syntax-syntax camlp4o-linkpkg-o file.byte file.ml
只有一个源文件,它就工作得很好,但我想在我的项目中包括几个模块。我该怎么做


其他模块实际上是由ocamlex和menhir开发的lexer和parser。我读过一篇关于如何将ocamlex和menhir与js_of_ocaml结合使用的文章,但它对js_of_ocaml安装在何处(我是用opam安装的)做出了错误的假设,并且它使用ocamlbuild,我想知道如何不用像ocamlbuild这样的自动化工具手工操作。

ocamlbuild
记录了它执行的操作。在ocamlbuild调用之后,查看
\u build/\u log
,您将看到它调用的所有命令,以及完整的参数等。这可能是最简单的手动方式


(关于
+site lib
假设和OPAM,你应该向本教程的作者报告,他们希望确保它也适用于OPAM用户。)

我通过尝试理解官方示例的makefile找到了解决方案

这是我的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 $@ $(OBJS)

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

%.cmo: %.ml
        $(OCAMLC) -c $<
...
OBJS=file1.cmo file2.cmo file3.cmo
NAME=projectname
OCAMLC=ocamlfind OCAMLC-package js_of_ocaml-package js_of_ocaml.syntax-syntax camlp4o
$(名称)。字节:$(OBJS)
$(OCAMLC)-linkpkg-o$@$(OBJS)
$(名称).js:$(名称).byte
js_of_ocaml$<
%.cmo:%.ml
$(OCAMLC)-c$<
...

这需要大量的实验,但我最终找到了如何让ocamlbuild将与ocsigen在这些makefile中使用的相同标志传递给ocamlfind的方法。我还使用了与OPAM一起安装的js_of_ocaml

对于我的测试用例,我创建了一个非常小的示例,其中包含两个文件-main.ml和square.ml

square.ml:

let square x = x * x
main.ml:

let () = (Js.Unsafe.coerce Dom_html.window)##square <- Js.wrap_callback Square.square
这将产生与我的初始测试用例相同的JS输出,其中square函数位于main.ml中。ocamlbuild日志正好显示了我的期望(两个调用ocamldep,两个调用ocamlc-c,一个调用ocamlc-linkpkg)

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