我正试图释放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
如何设置标志?为什么要添加其他选项?
答案 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。为了解决这个问题,我在标志约束中添加了一个阶段,以便现在只在适当的时间和地点应用它。