OCamlbuild和camlp4选项

5

我正在使用camlp4.macro实现条件编译。 我遇到了一个问题,就是如何通知OCamlbuild,某些标记为"use_jscore"的文件必须使用给定的camlp4选项进行预处理。以下是我目前拥有的内容:

let _ = dispatch begin function
  | After_rules ->
    flag ["ocaml"; "use_jscore"] (S[A"-package"; A"camlp4.macro"; A"-syntax"; A"camlp4o"; A"-ppopt"; A"-DUSE_JSCORE"]);

但是OCamlbuild对此进行了错误的转义。我正在使用ocamlfind,所以基本上我想告诉OCamlbuild的是所有标记为"use_jscore"的OCaml文件都必须通过camlp4.macro预处理,并且还要给出-DUSE_JSCORE选项。

2个回答

4

一种_tags和命令行方法也可以实现,尽管它不会针对单个文件。

_tags的内容:

<*.*>: syntax(camlp4o), package(camlp4.macro)

命令行:

ocamlbuild -use-ocamlfind -cflags -ppopt,-DUSE_JSCORE ...

3
您在匹配标志列表中缺少一个标志:
 let options = S[...] in
 flag ["ocaml"; "compile"; "use_jscore"] options;
 flag ["ocaml"; "ocamldep"; "use_jscore"] options

确实,您希望仅在计算依赖项(启用“ocamldep”标志的位置)和编译(启用“compile”标志的位置)时使用camlp4选项,而不是在使用预处理器(启用“pp”标志的位置)或链接(启用“link”标志的位置)时使用。

因此,如果您使用ocamlbuild -use-ocamlfind <target>,它应该可以正常工作。


但是我不需要重复完全相同的语句,只需使用s/compile/dep/吗?有没有避免重复的方法? - Jon Smark
你说得对,你可能需要为 dep 这个语句重复一遍。如果你不想重复它,你可以将 S(...) 的内容存储在一个局部变量中。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接