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

时间:2016-10-06 16:28:25

标签: ocaml ocamlbuild

我正试图释放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

1 个答案:

答案 0 :(得分:1)

短篇小说

您没有指定特定的阶段,因此您的标记应用于错误的位置。可能这可以被视为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。为了解决这个问题,我在标志约束中添加了一个阶段,以便现在只在适当的时间和地点应用它。