используйте ocamlformat с cppo и dune

чтобы наш код работал с несколькими версиями ocamlgraph, мы используем этот фрагмент в один из наших файлов

#if OCAMLGRAPH_VERSION >= (2,0,0)
  let module Dom = Dominator.Make_graph(struct
      include G
      let empty () = create ()
      let add_edge g v1 v2 = add_edge g v1 v2; g
    end) in
#elif OCAMLGRAPH_VERSION >= (1,8,6)
  let module Dom = Dominator.Make_graph(G) in
#else
  let module Dom = Dominator.Make(G) in
#endif

И в нашем dune файле мы предварительно обрабатываем это с помощью cppo следующим образом:

(library
 [...]
 (preprocess (action (run %{bin:cppo} -V OCAMLGRAPH:%{read:ocamlgraph.version} %{input-file})))

(rule
 (target ocamlgraph.version)
 (action (with-stdout-to %{target} (run ocamlfind query -format %v ocamlgraph))))

Теперь мы хотим использовать dune build @fmt. Проблема в том, что ocamlformat не понимает файлы, которые еще не были обработаны. Одним из обходных путей было бы добавить затронутый файл в .ocamlformat-ignore, но файл довольно большой, поэтому было бы жаль, если бы он не был автоматически отформатирован.

Есть ли простое решение этой проблемы? Может быть, есть общая закономерность, как это можно решить с помощью дюны?


person josch    schedule 23.01.2021    source источник


Ответы (1)


Технически не ответ, но несколько выводов:

  • Вы можете переместить предварительно обработанную часть в другой файл dom.ml и отказаться от форматирования этого файла, которое было бы небольшим. Не идеально, я знаю.

  • Может быть, вы можете взглянуть на Альтернативные зависимости от Dune, которые позволяют вам выбирать модуль среди различных в зависимости от наличия или отсутствия данной библиотеки. Но насколько я знаю, вы все равно не можете выбрать по версии какой-то библиотеки, см. этот выпуск.

  • Вы можете использовать смесь Makefile + Dune, часть предварительной обработки должна обрабатывать makefile, а форматирование - dune.

  • Вы также можете использовать модуль первого класса, но я полагаю, что это неудовлетворительно, поскольку вы хотите, чтобы выбор был сделан во время компиляции, а не во время выполнения.

person ghilesZ    schedule 23.01.2021