2014-01-14 46 views
2

我期待加入到编译在LLVM Ocaml tutorial的背景下Ragel源文件到Ocaml程序编写的源文件的能力。具体来说,对于具有“.rl”扩展名的源文件我希望它来执行:添加构建工具ocamlbuild项目(Ragel)

ragel -O source.rl 

构建系统当然应该再编译生成的ocaml的文件(S)和往常一样。什么是直接的方法来做到这一点?

这里是_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

很难确定无需将整个源代码目录乱动,但你会必须创建一个规则来调用编译器rageldep会通知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来源为rules on OCaml files。这应该是一个非常好的开始。

+0

,这将去myocamlbuild.ml的底部,是否正确?还有什么我需要做的?它似乎完全忽略了它。我所有的源文件都在同一个顶级目录中。 – brooks94

+0

当'After_rules'被调用时,它进入传递给'dispatch'的函数。 – nlucaroni

+0

我还需要一个“dep”命令吗? – brooks94

0

我建议区分.rl文件由宿主语言即.ml.rl为OCaml的代码,.c.rl对于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。在_tags

"generated.ml": warn(-32-38) 
相关问题