我希望在Ragel的上下文中添加将LLVM Ocaml tutorial源文件编译到Ocaml源文件中的功能。具体来说,对于具有“.rl”扩展名的源文件,我希望它能够执行:
ragel -O source.rl
构建系统当然应该像往常一样编译生成的Ocaml文件。有什么简单的方法可以做到这一点?
这是_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)
如果没有完整的源目录,很难确定,但是你必须创建一个规则来调用ragel
编译器。 dep
告诉ocamlbuild将这些文件复制到_build目录 - 根据您的需要,这些标签可能会有所不同。像,
let ragel_files = ["file1.rl"; ... ]
let () = dispatch begin function
| After_rules ->
rule "Build RL files with Ragel"
~prod:"%.ml"
~dep:"%.rl"
begin fun env _build ->
let rl = env "%.rl" in
Cmd(S[A"ragel"; A"-0"; A rl;])
end;
dep ["compile"; "ocaml"] ragel_files;
end
查看rules on OCaml files的ocamlbuild
来源。这应该是一个非常好的开始。
答案 1 :(得分:0)
我建议按宿主语言区分.rl
个文件,例如{0}代表OCaml代码,.ml.rl
代表C代码,等等。
.c.rl
可以在调用rule ("ragel: .ml.rl -> .ml") ~dep:"%.ml.rl" ~prod:"%.ml" begin fun env _ ->
let dep = env "%.ml.rl" and prod = env "%.ml" in
Cmd (S[ P"ragel";
T(tags_of_pathname prod ++ "ragel");
A "-O";
A "-F1";
A dep;
A"-o"; A prod;
])
end;;
之前在顶层定义规则。
此外,您很可能希望为ragel生成的代码关闭警告32和38。在dispatch
:
_tags