使用 ocamlbuild 和 camlp5 编译
Compiling with ocamlbuild and camlp5
我正在尝试使用 ocamlbuild 编译我正在处理的项目,以避免使用常规 Makefile,我发现它稍微复杂一些。
具体来说,我有一个语法扩展文件(extend.ml),我需要先编译它。在常规 Makefile 中会有一条规则:
extend.cmo: extend.ml
$(OCAMLC) -pp "camlp5o pa_extend.cmo q_MLast.cmo" -I +camlp5 -c $<
然后,为了计算依赖关系,会有这样的规则:
depend: $(MLFILES) extend.cmo
$(OCAMLDEP) -pp "camlp5o ./extend.cmo"
当然,任何目标文件的创建都需要与上述类似的规则。
我的问题是,如何将这些rules/requirements集成到一个ocamlbuild命令(如果可能)?
我试过先编译extend.ml文件,然后使用以下命令:
ocamlbuild -pp "camlp5o ./extend.cmo" -I +camlp5 -use-menhir -no-hygiene Main.byte
但我认为它在任何方面都不是最佳选择。
不幸的是,我不熟悉 ocamlbuild 作为编译工具的使用,所以任何帮助将不胜感激。
您可以定义两个新标签,compile_extend
和 use_extend
,它们指定预期的选项。在您的 myocamlbuild.ml 文件中:
open Ocamlbuild_plugin
let my_flags () =
flag ["ocaml"; "pp"; "compile_extend"]
(S [A"camlp5o"; A "pa_extend.cmo"; A "q_MLast.cmo"]);
flag ["ocaml"; "pp"; "use_extend"]
(S [A"camlp5o"; A "extend.cmo"]);
(* files with the use_extend flag must depend on extend.cmo *)
dep ["ocaml"; "use_extend"] ["extend.cmo"];
()
let () =
dispatch (function
| After_rules ->
my_flags ();
| _ -> ())
那么您将拥有一个包含以下内容的标签文件:
"extend.cmo": compile_extend
<Main.*>: use_extend
也就是说,这都是瞎猜,我还没有测试过这个设置。您能否提供一个包含示例 extend.ml
文件和 Main.ml
的 tarball 以重现您的情况?
我正在尝试使用 ocamlbuild 编译我正在处理的项目,以避免使用常规 Makefile,我发现它稍微复杂一些。
具体来说,我有一个语法扩展文件(extend.ml),我需要先编译它。在常规 Makefile 中会有一条规则:
extend.cmo: extend.ml
$(OCAMLC) -pp "camlp5o pa_extend.cmo q_MLast.cmo" -I +camlp5 -c $<
然后,为了计算依赖关系,会有这样的规则:
depend: $(MLFILES) extend.cmo
$(OCAMLDEP) -pp "camlp5o ./extend.cmo"
当然,任何目标文件的创建都需要与上述类似的规则。
我的问题是,如何将这些rules/requirements集成到一个ocamlbuild命令(如果可能)?
我试过先编译extend.ml文件,然后使用以下命令:
ocamlbuild -pp "camlp5o ./extend.cmo" -I +camlp5 -use-menhir -no-hygiene Main.byte
但我认为它在任何方面都不是最佳选择。
不幸的是,我不熟悉 ocamlbuild 作为编译工具的使用,所以任何帮助将不胜感激。
您可以定义两个新标签,compile_extend
和 use_extend
,它们指定预期的选项。在您的 myocamlbuild.ml 文件中:
open Ocamlbuild_plugin
let my_flags () =
flag ["ocaml"; "pp"; "compile_extend"]
(S [A"camlp5o"; A "pa_extend.cmo"; A "q_MLast.cmo"]);
flag ["ocaml"; "pp"; "use_extend"]
(S [A"camlp5o"; A "extend.cmo"]);
(* files with the use_extend flag must depend on extend.cmo *)
dep ["ocaml"; "use_extend"] ["extend.cmo"];
()
let () =
dispatch (function
| After_rules ->
my_flags ();
| _ -> ())
那么您将拥有一个包含以下内容的标签文件:
"extend.cmo": compile_extend
<Main.*>: use_extend
也就是说,这都是瞎猜,我还没有测试过这个设置。您能否提供一个包含示例 extend.ml
文件和 Main.ml
的 tarball 以重现您的情况?