1

我正在尝试制作一个我正在使用 ocamlbuild 编译的项目,以避免使用常规的 Makefile,我发现它稍微复杂一些。

具体来说,我有一个语法扩展文件(extend.ml),我需要先编译它。在常规的 Makefile 中会有一条规则:

extend.cmo: extend.ml
    $(OCAMLC) -pp "camlp5o pa_extend.cmo q_MLast.cmo" -I +camlp5 -c $<

然后,为了计算依赖关系,会有这样的规则:

depend: $(MLFILES) extend.cmo
    $(OCAMLDEP) -pp "camlp5o ./extend.cmo"

当然,任何目标文件的创建都需要与上述类似的规则。


我的问题是,如何将这些规则/要求集成到一个 ocamlbuild 命令(如果可能)?

我尝试先编译extend.ml文件,然后使用以下命令:

ocamlbuild -pp "camlp5o ./extend.cmo" -I +camlp5 -use-menhir -no-hygiene Main.byte

但我认为它在任何方面都不是最佳的。

不幸的是,我不熟悉使用 ocamlbuild 作为编译工具,所以任何帮助将不胜感激。

4

1 回答 1

1

您可以定义两个新标签compile_extenduse_extend,它们指定预期的选项。在您的 myocamlbuild.ml 文件中:

open Ocamlbuild_plugin

let my_flags () =
  flag ["ocaml"; "pp"; "compile_extend"]
    (S [A"camlp5o"; A "pa_extend.cmo"; A "q_MLast.cmo"]);
  flag ["ocaml"; "pp"; "use_extend"]
    (S [A"camlp5o"; A "extend.cmo"]);
  (* files with the use_extend flag must depend on extend.cmo *)      
  dep  ["ocaml"; "use_extend"] ["extend.cmo"];
   ()

let () =
  dispatch (function
    | After_rules ->
      my_flags (); 
    | _ -> ())

然后你会有一个标签文件:

"extend.cmo": compile_extend
<Main.*>: use_extend

也就是说,这都是金光闪闪的猜测,我还没有测试过这个设置。您能否提供带有示例extend.ml文件的 tarball 并Main.ml允许重现您的情况?

于 2015-10-30T18:39:04.237 回答