2

我希望在LLVM Ocaml 教程的上下文中添加将Ragel源文件编译成 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"];;
4

2 回答 2

2

没有整个源目录就很难确定,但是您必须创建一个规则来调用ragel编译器。告诉 ocamlbuild将dep这些文件复制到 _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

查看OCaml 文件规则ocamlbuild的来源。这应该是一个非常好的开始。

于 2014-01-14T15:11:27.290 回答
0

我建议.rl按宿主语言区分文件,即.ml.rlOCaml 代码、.c.rlC 代码等。

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;;

该规则可以在dispatch调用之前在顶层定义。

此外,您很可能希望关闭 ragel 生成代码的警告 32 和 38。在_tags

"generated.ml": warn(-32-38)
于 2014-01-15T05:42:51.387 回答