Компиляция с помощью ocamlbuild и camlp5
Я пытаюсь сделать проект, над которым я работаю, с помощью ocamlbuild, чтобы избежать использования обычного Makefile, который я считаю немного более сложным.
В частности, у меня есть файл с синтаксическим расширением (exte.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 (если это возможно)?
Я попытался сначала скомпилировать файл exte.ml, а затем использовать следующую команду:
ocamlbuild -pp "camlp5o ./extend.cmo" -I +camlp5 -use-menhir -no-hygiene Main.byte
но я не думаю, что это оптимально в любом случае.
К сожалению, я не знаком с использованием ocamlbuild в качестве инструмента компиляции, поэтому любая помощь будет высоко ценится.
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
позволяет воспроизвести вашу ситуацию?