Ocamlbuild: используйте два препроцессора в одном файле
Я пытаюсь раскрыть возможности двух препроцессоров в ocamlbuild. Я старался
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
Как правильно установить флаги? И почему добавляется дополнительная опция?
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. Чтобы решить эту проблему, я добавил этап к ограничениям флага, чтобы он теперь применялся только в нужное время и в нужном месте.