将构建工具添加到ocamlbuild项目(Ragel)

时间:2014-01-14 13:57:01

标签: ocaml ocamlbuild

我希望在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"];;

2 个答案:

答案 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 filesocamlbuild来源。这应该是一个非常好的开始。

答案 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