2016-10-06 2 views
1

ocamlbuildで2つのプリプロセッサのパワーを引き出そうとしています。私は Ocamlbuild:同じファイルに2つのプリプロセッサを使用する

 flag ["ocaml"; "use_m4"] (S [ A"-pp"; Px"m4 macro.m4" 
           ; A"-pp"; Px"camlp5o pr_o.cmo camlp5/pa_gt.cmo" 
           ]); 

を試してみましたが、何らかの理由でそれが -ppオプションで再びオプションを繰り返します。それは間違っています。

/home/kakadu/.opam/4.03.0/bin/ocamldep.opt -pp 'm4 macro.m4' \ 
-pp 'camlp5o pr_o.cmo camlp5/pa_gt.cmo' \ 
-pp '-pp '\''m4 macro.m4'\'' -pp '\''camlp5o pr_o.cmo camlp5/pa_gt.cmo'\''' -modules test.ml > test.ml.depends 

フラグを正しく設定するにはどうすればよいですか。なぜ追加のオプションが追加されているのですか?

レポ:https://github.com/Kakadu/ocamlbuild-two-pp

答えて

1

短編小説

あなたフラグが間違った場所に適用されたので、あなたは、特定のステージを指定しませんでした。これはおそらくocamlbuild側の問題と考えられます。

以下の呪文は動作します:

List.iter (fun stage -> 
    flag ["ocaml"; stage; "use_m4"] 
     (S [A"-pp"; A"m4 macro.m4"; 
      A"-pp"; Px"camlp5o pr_o.cmo camlp5/pa_gt.cmo" 
      ])) 
    ["ocamldep"; "compile"]; 

を、少なくとも、m4部分はcamlp5ファイルがcmoファイルが存在しない場合に失敗し、取り組んでいるが、これは質問の範囲を超えています。

長い話

Ocaml_utilsモジュール内のハック機能の種類は、次の実装で、あります:

let ocaml_ppflags tags = 
    let flags = Flags.of_tags (tags++"ocaml"++"pp") in 
    let reduced = Command.reduce flags in 
    if reduced = N then N else S[A"-pp"; Quote reduced] 

機能は、文字通り、以下をやっている:に「ocamlの」および「PP」を追加タグのセットとフラグを取得します。一致するものがある場合は、結果を引用して-ppフラグに追加してください)

ppフラグが入り込む場合に備えて、多くのルールで呼び出されます。フラグは特定の場所にフックで挿入する必要があります。たぶん、これは地元のハックであり、それはあまりにも長く生き残っています。

あなたのフラグはあまりにも拘束されず、このルールと一致しました。その結果、パラメータは-pp -edです。これを解決するために、フラグの制約にステージを追加し、適切な時間と場所でのみ適用されるようにしました。

+0

あなたのコメントは非常に役に立ちますが、突然私は2つの '-pp'オプションを使うことができず、前者を上書きしてしまいました。 – Kakadu

+0

ええと...( 'ppx'オプションとは違って)1つのプリプロセッサしかないので、一般的にはいくつかのプリプロセッサを実行するのは難しいでしょう。私の場合、 'pp'オプションを' m4'プリプロセッサを実行するのに依存しませんが、 'm4:file.m4 - > file'ルールというプリプロセッサを実行するocamlbuildルールを記述します。 – ivg

関連する問題