2016-10-06 6 views
1

Ich versuche, die Macht von zwei Präprozessoren in ocamlbuild entfesseln. Ich habe versucht,Ocamlbuild: Verwenden Sie zwei Präprozessoren für die gleiche Datei

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

aber aus irgendeinem Grund es wiederholt Optionen erneut mit -pp Option. Und es ist falsch.

/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 

Wie setzt man Fahnen richtig? Und warum zusätzliche Option hinzugefügt wird?

Repo: https://github.com/Kakadu/ocamlbuild-two-pp

Antwort

1

Kurzgeschichte

Sie keine bestimmte Stufe angegeben haben, so dass Sie Flagge in einem falschen Ort angewandt wurde. Wahrscheinlich kann dies als ein Problem auf ocamlbuild Seite betrachtet werden.

Der folgende Zauber funktioniert:

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

Immerhin arbeitet m4 Teil, die camlp5 Datei mit einem Fehlen der cmo Dateien fehlschlägt, aber das sprengt den Rahmen der Frage ist.

Lange Geschichte

Es gibt eine Art von hackish Funktion in Ocaml_utils Modul mit der folgenden Umsetzung:

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] 

Die Funktion wörtlich folgendes tut: „ocaml“ und „pp“ hinzufügen der Satz von Tags und erhalten Flags. Wenn irgendetwas zusammenpasst, zitieren Sie das Ergebnis und fügen Sie es zu -pp flag)

Und es heißt in vielen Regeln, nur für den Fall, wenn pp Flags springen wird. Ich bin mir nicht sicher, warum es überhaupt benötigt wird, als Die Flaggen müssen an einer bestimmten Stelle mit dem Haken eingespritzt werden. Vielleicht ist das ein lokaler Hack, der zu lange überlebt hat.

Also, Ihre Flagge war zu unbeschränkt und übereinstimmte mit diesen Regeln, als Ergebnis waren Ihre Parameter pre -pp -ed. Um das Problem zu lösen, habe ich den Flag-Constraints eine Stufe hinzugefügt, so dass sie jetzt nur in der richtigen Zeit und am richtigen Ort angewendet wird.

+0

Ihr Kommentar ist sehr hilfreich, aber ich stecke fest, weil ich plötzlich nicht zwei '-pp'-Optionen verwenden kann, da letzterer den vorherigen außer Kraft setzt. – Kakadu

+0

yeah ... es kann nur einen Präprozessor geben (anders als die 'ppx'-Option), so dass es im Allgemeinen schwierig ist, mehrere Präprozessoren auszuführen. Wenn ich Sie wäre, würde ich mich nicht auf die 'pp'-Option verlassen, um den' m4'-Präprozessor auszuführen, aber ich würde eine ocamlbuild-Regel schreiben, die Präprozessoren ausführt, d.h. 'm4: file.m4 -> file'-Regel. – ivg

Verwandte Themen