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