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

Ocamlbuild:在同一个文件上使用两个预处理器,ocaml,ocamlbuild,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/kaka

我试图释放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
如何正确设置标志?为什么要增加额外的选项

回购:短篇故事 您没有指定特定的阶段,因此您的标记应用于错误的位置。这可能是
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\u utils
模块中有一种黑客功能,实现如下:

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标志跳入。我不确定,为什么需要它,因为必须用钩子将旗帜注入一个特定的位置。也许这是一些本地黑客,他们活得太久了


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

你的评论非常有用,但我被卡住了,因为突然我不能使用两个
-pp
选项,因为后者会覆盖前者。是的。。。只能有一个预处理器(与
ppx
选项不同),因此,通常很难运行多个预处理器。如果我是你,我不会依赖
pp
选项来运行
m4
预处理器,但我会编写一个运行预处理器的ocamlbuild规则,即
m4:file.m4->file
规则。