ocamlbuild包括额外的包

时间:2014-01-14 13:48:47

标签: ocaml ocamlbuild

我正在使用LLVM ocaml tutorial,并使用以下命令行进行编译:

ocamlbuild -cflags -g,-I,+llvm-3.4 -lflags -I,+llvm-3.4 toy.byte

有没有办法将这些额外的cflags和lflags移动到_tags或myocamlbuild.ml文件中,这样我就不需要输入它们/可以将它们存储在源代码控制/制作可重现的构建中?

这是_tags文件:

<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
<*.{byte,native}>: use_llvm_scalar_opts, use_bindings

这是myocamlbuild.ml文件:

open Ocamlbuild_plugin;;

ocaml_lib ~extern:true "llvm";;
ocaml_lib ~extern:true "llvm_analysis";;
ocaml_lib ~extern:true "llvm_executionengine";;
ocaml_lib ~extern:true "llvm_target";;
ocaml_lib ~extern:true "llvm_scalar_opts";;

flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++ -rdynamic"]);;
dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;

2 个答案:

答案 0 :(得分:2)

我做的事情......

let mlflags = []
and cflags = []
and clibs = []

let rec arg_weave p = function
  | x::xs -> (A p) :: (A x) :: arg_weave p xs
  | []    -> []
and arg x = A x
...
let () = dispatch begin function
  | After_rules ->
    flag ["ocaml"; "compile"] (S (List.map arg mlflags));
    flag ["c"; "compile"]     (S (arg_weave "-ccopt" cflags));
    flag ["c"; "link"]        (S (arg_weave "-cclib" clibs));
    ...
  end

另一种选择是标记其他选项。例如,在ocaml_specific.ml文件中,他们有一个用于调试的设置以及用于选项相关位置的所有标志选项组合。

flag ["ocaml"; "debug"; "compile"; "byte"] (A "-g");;
flag ["ocaml"; "debug"; "link"; "byte"; "program"] (A "-g");;
flag ["ocaml"; "debug"; "pack"; "byte"] (A "-g");;
flag ["ocaml"; "debug"; "compile"; "native"] (A "-g");;
flag ["ocaml"; "debug"; "link"; "native"; "program"] (A "-g");;
flag ["ocaml"; "debug"; "pack"; "native"] (A "-g");;

然后,在_tags文件中,您可以让true : debug为所有文件启用它,或者true可以替换为限制该选项的模式。因此,如果某个选项已经不存在,您可以创建自己的选项,并且您将看到它与完全myocamlbuild.ml解决方案类似,但是每个标记都有其他标记,而不是一次性包含它们。

答案 1 :(得分:1)

-g已被true: debug中的_tags取代。

理想情况下,

-I选项应替换为相应的ocamlfind包,例如在ocamlbuild -use-ocamlfind中调用true: package(llvm,llvm_analysis)并指定_tags和/或调用其他任何其他包(并删除ocaml_lib中的myocamlbuild.ml次调用)。

在旁注中,只需创建一个Makefile,只需要ocamlbuild次调用,然后运行make即可构建。