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
如何正确设置标志?为什么要添加其他选项?
短篇小说
您没有指定特定的阶段,所以您的标志应用在了错误的地方。可能这可以被认为是 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。为了解决这个问题,我在标志约束中添加了一个阶段,这样它现在只会在适当的时间和地点应用。
我正在尝试释放 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_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。为了解决这个问题,我在标志约束中添加了一个阶段,这样它现在只会在适当的时间和地点应用。