7

我目前正在开发一个用 OCaml 编写并使用 js_of_ocaml 编译为 javascript 的网站项目。只要我只有一个使用该命令的源文件,它就可以很好地工作,ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml但我想在我的项目中包含几个模块。我怎样才能做到这一点 ?

其他模块实际上是由 ocamllex 和 menhir 生成的词法分析器和解析器。我已经阅读了有关如何将 ocamllex 和 menhir 与 js_of_ocaml 一起使用的教程,但它对 js_of_ocaml 的安装位置做出了错误的假设(我使用 opam 安装它)并且它使用 ocamlbuild,我想知道如何在不使用自动化的情况下手动操作ocamlbuild 等工具。

4

3 回答 3

8

我通过尝试了解官方示例的 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 $<
...
于 2013-01-17T23:53:01.450 回答
5

ocamlbuild记录它执行的操作。在 ocamlbuild 调用之后,查看_build/_log并查看它调用的所有命令,以及完整的参数等。这可能是您了解如何手动执行此操作的最简单方法。

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

于 2013-01-17T18:25:36.033 回答
2

它进行了大量的实验,但我终于弄清楚了如何让 ocamlbuild 将相同的标志传递给 ocamlfind,因为 ocsigen 在这些 makefile 中使用。我还在使用随 OPAM 一起安装的 js_of_ocaml。

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

平方毫升:

let square x = x * x

主要.ml:

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

成功构建的命令:

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

这会产生与我的初始测试用例相同的 JS 输出,其中 square 函数位于 main.ml 中。ocamlbuild 日志完全显示了我的预期(两次调用 ocamldep,两次调用 ocamlc -c,一次调用 ocamlc -linkpkg)。

于 2014-02-10T05:45:58.173 回答