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

Как правильно установить флаги? И почему добавляется дополнительная опция?

Репо: 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. Чтобы решить эту проблему, я добавил этап к ограничениям флага, чтобы он теперь применялся только в нужное время и в нужном месте.

Другие вопросы по тегам