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

将构建工具添加到ocamlbuild项目(Ragel),ocaml,ocamlbuild,Ocaml,Ocamlbuild,我希望能够在的上下文中将源文件编译成Ocaml源文件。具体来说,对于扩展名为“.rl”的源文件,我希望它执行: ragel -O source.rl 构建系统当然应该像往常一样编译生成的Ocaml文件。做这件事的简单方法是什么 以下是_标记文件: <{lexer,parser}.ml>: use_camlp4, pp(camlp4of) <*.{byte,native}>: g++, use_llvm, use_llvm_analysis <*.{byte,nat

我希望能够在的上下文中将源文件编译成Ocaml源文件。具体来说,对于扩展名为“.rl”的源文件,我希望它执行:

ragel -O source.rl
构建系统当然应该像往常一样编译生成的Ocaml文件。做这件事的简单方法是什么

以下是_标记文件:

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

如果没有整个源代码目录,很难确定,但是您必须创建一个规则来调用
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

请查看有关的
ocamlbuild
源代码。这应该是一个很好的开始。

我建议按宿主语言区分
.rl
文件,即
.ml.rl
用于OCaml代码,
用于c代码,等等

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。在
\u标签中

"generated.ml": warn(-32-38)

这将放在build.ml的底部,对吗?还有什么我需要做的吗?它似乎完全忽视了这一点。我所有的源文件都在同一个顶级目录中。调用\u rules
后,当调用
时,它会进入传递到
dispatch
的函数中。不一定。如果prod和dep参数满足依赖关系,那么您不应该这样做。如果你遇到麻烦,你能更具体一点吗?(您希望运行的命令及其产生的内容)。哦,要将文件“移动”到“_build”目录中,您需要所有文件的dep,是的。
"generated.ml": warn(-32-38)