2014-01-14 3 views
2

Ragel 소스 파일을 LLVM Ocaml tutorial의 컨텍스트에서 Ocaml 소스 파일로 컴파일하는 기능을 추가하고자합니다. 특히, ".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 

체크 아웃 rules on OCaml files에 대한 ocamlbuild 소스. 그것은 아주 좋은 출발이어야합니다.

+0

그리고 이것은 올바른 myocamlbuild.ml의 바닥에 갈 것? 내가해야 할 일이 또 있니? 그것 모두를 무시하는 것 같습니다. 모든 소스 파일은 같은 최상위 디렉토리에 있습니다. – brooks94

+0

'After_rules'가 호출 될 때'dispatch'에 전달 된 함수로갑니다. – nlucaroni

+0

어딘가에 "dep"명령이 필요합니까? – brooks94

0

나는 OCaml의 코드, C 코드 .c.rldispatch를 호출하기 전에

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

규칙은 탑 레벨에서 정의 할 수 있습니다에 대한 호스트 언어 즉 .ml.rl에 의해 .rl 파일을 구별 건의 할 것입니다.

또한 대부분의 경우 ragel 생성 코드에 대한 경고 32와 38을 해제하고 싶을 것입니다. _tags에서 :

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