2016-10-06 3 views
1

Я пытаюсь развязать мощность двух препроцессоров в 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 

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

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

+0

Ваш комментарий очень полезный, но я застрял, потому что внезапно я не могу использовать два параметра '-pp' beacuse, последний переопределяет первый. – Kakadu

+0

Да ... может быть только один препроцессор (в отличие от опции 'ppx'), поэтому в целом было бы сложно запустить несколько препроцессоров. Если бы я был вами, я бы не стал полагаться на опцию 'pp' для запуска препроцессора' m4', но я бы написал правило ocamlbuild, в котором будут выполняться препроцессоры, т. Е. Правило 'm4: file.m4 -> file'. – ivg

Смежные вопросы