2

LLVM Ocaml チュートリアルのコンテキストで、 Ragelソース ファイルを Ocaml ソース ファイルにコンパイルする機能を追加しようとしています。具体的には、拡張子が「.rl」のソース ファイルの場合は、次のように実行します。

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"];;
4

2 に答える 2

2

ソース ディレクトリ全体をいじらずに判断するのは困難ですが、ragelコンパイラを呼び出すルールを作成する必要があります。これらのdepファイルを _build ディレクトリにコピーするように ocamlbuild に指示します。このタグは、必要に応じて異なる場合があります。何かのようなもの、

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

OCaml ファイルに関するルールocamlbuildのソースを確認してください。それは非常に良いスタートになるはずです。

于 2014-01-14T15:11:27.290 に答える
0

OCaml コード用、C コード用など、.rlホスト言語ごとにファイルを区別することをお勧めします。.ml.rl.c.rl

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)
于 2014-01-15T05:42:51.387 に答える