我正在使用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"];;
答案 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
即可构建。