2014-01-14 43 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) 
相關問題