【问题标题】:use ocamlformat with cppo and dune将 ocamlformat 与 cppo 和 dune 一起使用
【发布时间】:2021-04-27 11:29:25
【问题描述】:

为了使我们的代码适用于多个 ocamlgraph 版本,我们在 one of our files 中使用了这个 sn-p

#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,但该文件相当大,因此很遗憾没有自动格式化。

这个问题有简单的解决方案吗?也许有一个常见的模式可以用沙丘解决这个问题?

【问题讨论】:

    标签: ocaml ocaml-dune


    【解决方案1】:

    技术上不是答案,但有几个线索:

    • 您可以将已预处理的部分移动到另一个文件dom.ml 中,并放弃对该文件的格式设置,因为该文件会比较小。我知道不理想。

    • 也许您可以看看 Dune 的 Alternative dependencies,它允许您根据给定库的存在与否在不同的模块中选择一个模块。但据我所知,你仍然不能根据某些库的版本来选择,see this issue。

    • 你可以混合使用 Makefile+Dune,预处理部分由 makefile 处理,格式化由 dune 处理。

    • 您也可以使用第一类模块,但我认为这并不令人满意,因为您希望在编译时而不是在运行时做出选择。

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 2020-05-01
      • 2022-01-24
      • 2014-06-09
      • 2013-01-18
      • 2013-11-06
      • 2016-05-04
      • 2013-02-14
      • 2013-06-25
      相关资源
      最近更新 更多