Короткий рассказ
Вы не указали конкретной стадии, поэтому флаг был применен в неправильном месте. Вероятно, это можно рассматривать как проблему на стороне 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
-ed. Чтобы решить эту проблему, я добавил этап ограничения флага, так что теперь он будет применяться только во времени и в нужном месте.
Ваш комментарий очень полезный, но я застрял, потому что внезапно я не могу использовать два параметра '-pp' beacuse, последний переопределяет первый. – Kakadu
Да ... может быть только один препроцессор (в отличие от опции 'ppx'), поэтому в целом было бы сложно запустить несколько препроцессоров. Если бы я был вами, я бы не стал полагаться на опцию 'pp' для запуска препроцессора' m4', но я бы написал правило ocamlbuild, в котором будут выполняться препроцессоры, т. Е. Правило 'm4: file.m4 -> file'. – ivg