首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对cppo和dune使用ocamlformat

对cppo和dune使用ocamlformat
EN

Stack Overflow用户
提问于 2021-01-23 08:42:22
回答 1查看 54关注 0票数 0

为了使我们的代码与多个ocamlgraph版本一起工作,我们在one of our files中使用以下代码片段

代码语言:javascript
复制
#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对其进行预处理,如下所示:

代码语言:javascript
复制
(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中,但该文件相当大,因此没有自动格式化它将是一种遗憾。

这个问题有没有简单的解决方案?也许有一个共同的模式可以用沙丘来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2021-01-23 18:11:06

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

  • ,你可以将预处理的部分移到另一个文件dom.ml中,并放弃格式化这个文件,因为这个文件可能会很小。我知道这并不理想。

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

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

  • 您也可以使用第一类模块,但我认为这不能令人满意,因为您希望在编译时而不是在运行时做出选择。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65854619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档