Ocamlbuild:在同一个文件上使用两个预处理器

Ocamlbuild: use two preprocessors on the same file

我正在尝试释放 ocamlbuild 中两个预处理器的强大功能。我试过了

     flag ["ocaml"; "use_m4"] (S [ A"-pp"; Px"m4 macro.m4"
                                 ; A"-pp"; Px"camlp5o pr_o.cmo camlp5/pa_gt.cmo"
                                 ]); 

但出于某种原因,它会再次使用 -pp 选项重复选项。这是错误的。

/home/kakadu/.opam/4.03.0/bin/ocamldep.opt -pp 'm4 macro.m4' \
-pp 'camlp5o pr_o.cmo camlp5/pa_gt.cmo' \
-pp '-pp '\''m4 macro.m4'\'' -pp '\''camlp5o pr_o.cmo camlp5/pa_gt.cmo'\''' -modules test.ml > test.ml.depends

如何正确设置标志?为什么要添加其他选项?

回购:https://github.com/Kakadu/ocamlbuild-two-pp

短篇小说

您没有指定特定的阶段,所以您的标志应用在了错误的地方。可能这可以被认为是 ocamlbuild 方面的问题。

以下咒语会起作用:

 List.iter (fun stage ->
     flag ["ocaml"; stage; "use_m4"]
       (S [A"-pp"; A"m4 macro.m4";
           A"-pp"; Px"camlp5o pr_o.cmo camlp5/pa_gt.cmo"
          ]))
   ["ocamldep"; "compile"];

至少,m4 部分在工作,camlp5 文件因缺少 cmo 文件而失败,但这超出了问题的范围。

说来话长

Ocaml_utils模块中有一种hackish函数,实现如下:

let ocaml_ppflags tags =
  let flags = Flags.of_tags (tags++"ocaml"++"pp") in
  let reduced = Command.reduce flags in
  if reduced = N then N else S[A"-pp"; Quote reduced]

该函数实际上是在执行以下操作:将 "ocaml" 和 "pp" 添加到标记集并获取标志。如果有任何匹配,则引用结果并将其添加到 -pp 标志)

它在许多规则中被调用,以防 pp 标志跳入。我不确定为什么需要它,因为标志必须用钩子注入到一个特定的位置。也许这是一些本地黑客,存活了太久。

所以,您的标志太不受约束并且与此规则匹配,因此您的参数是预-pp-ed。为了解决这个问题,我在标志约束中添加了一个阶段,这样它现在只会在适当的时间和地点应用。