2014-01-14 2 views
2

Я хочу добавить возможность компилировать исходные файлы Ragel в исходные файлы Ocaml в контексте LLVM Ocaml tutorial. В частности, для исходных файлов с расширением «.rl» Я хотел бы, чтобы это выполнить:Добавить инструмент построения в проект ocamlbuild (Ragel)

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

Это трудно определить без всего исходного каталога возиться с, но вы будете необходимо создать правило для вызова компилятора 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 источник для rules on OCaml files. Это должно быть очень хорошим началом.

+0

И это будет в нижней части myocamlbuild.ml, правильно? есть ли что-нибудь еще, что мне нужно будет сделать? это, кажется, игнорирует его вообще. все мои исходные файлы находятся в одном и том же каталоге верхнего уровня. – brooks94

+0

Он переходит в функцию, переданную 'dispatch', когда вызывается' After_rules'. – 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 называется.

Также вы, скорее всего, захотите отключить предупреждения 32 и 38 для генерируемого ragel кода. В _tags:

"generated.ml": warn(-32-38) 
Смежные вопросы