Компиляция с помощью ocamlbuild и camlp5

Я пытаюсь компилировать проект, над которым работаю, с помощью ocamlbuild, чтобы избежать использования обычного Makefile, который мне кажется несколько более сложным.

В частности, у меня есть файл расширения синтаксиса (extend.ml), который мне нужно сначала скомпилировать. В обычном Makefile было бы правило:

extend.cmo: extend.ml
    $(OCAMLC) -pp "camlp5o pa_extend.cmo q_MLast.cmo" -I +camlp5 -c $<

и тогда для расчета зависимостей будет такое правило:

depend: $(MLFILES) extend.cmo
    $(OCAMLDEP) -pp "camlp5o ./extend.cmo"

Конечно, для создания любого объектного файла потребуется правило, подобное приведенному выше.


Мой вопрос: как я могу интегрировать эти правила/требования в одну команду ocamlbuild (если возможно)?

Я попытался сначала скомпилировать файл extend.ml, а затем использовать следующую команду:

ocamlbuild -pp "camlp5o ./extend.cmo" -I +camlp5 -use-menhir -no-hygiene Main.byte

но я не думаю, что это оптимально в любом случае.

К сожалению, я не знаком с использованием ocamlbuild в качестве инструмента для компиляции, поэтому буду очень признателен за любую помощь.


person michalis-    schedule 26.08.2015    source источник
comment
Не могли бы вы предоставить архив с вашим кодом (или его упрощенную версию), чтобы мы могли поэкспериментировать и проверить, работают ли предлагаемые решения?   -  person gasche    schedule 29.10.2015


Ответы (1)


Вы можете определить два новых тега, compile_extend и use_extend, которые определяют ожидаемые параметры. В вашем файле myocamlbuild.ml:

open Ocamlbuild_plugin

let my_flags () =
  flag ["ocaml"; "pp"; "compile_extend"]
    (S [A"camlp5o"; A "pa_extend.cmo"; A "q_MLast.cmo"]);
  flag ["ocaml"; "pp"; "use_extend"]
    (S [A"camlp5o"; A "extend.cmo"]);
  (* files with the use_extend flag must depend on extend.cmo *)      
  dep  ["ocaml"; "use_extend"] ["extend.cmo"];
   ()

let () =
  dispatch (function
    | After_rules ->
      my_flags (); 
    | _ -> ())

Тогда у вас будет файл тегов с:

"extend.cmo": compile_extend
<Main.*>: use_extend

Тем не менее, это все догадки, я не тестировал эту настройку. Не могли бы вы предоставить архив с примерами файлов extend.ml и Main.ml, позволяющих воспроизвести вашу ситуацию?

person gasche    schedule 30.10.2015
comment
Чувак, я бы хотел, чтобы этот ответ появился раньше, это избавило бы меня от многих проблем. Во всяком случае, я сам придумал подобное решение около 1,5 месяцев назад, но совершенно забыл опубликовать ответ. Оказалось, мне нужен плагин ocamlbuild, такой же, как тот, который вы предлагаете. Большое спасибо за уделенное время. Я публикую ниже ссылки на мои файлы, если вы хотите сами увидеть, что помогло. myocamlbuild.ml: dropbox.com/s/1dd66zl7zy52jsp/myocamlbuild.ml? dl=0 файл _tags: dropbox.com/s/r0a5taua9rj9h5e/ _tags?dl=0 - person michalis-; 31.10.2015