OCaml:如何解决多个 `cmi` 的 findlib 警告

OCaml: how to solve findlib warnings of multiple `cmi`s

现在我尝试使用 ocamlfind 和一些包编写编译器,尤其是 ppx_sexp_convopam
ppx_sexp_conv 的依赖关系需要 compiler-libs 所以编译选项 -I ~/.opam/VERSION/lib/compiler-libsocamlfind ocamlc -package ppx_sexp_conv.

编译文件时被添加

问题是,compiler-libs 包含非常常见的名称文件,例如 parsing.cmimain.cmilexing.cmi
这会造成 .cmi 个文件的冲突,并产生许多嘈杂的警告,如下所示:

$ ocamlfind ocamlc  -package ppx_sexp_conv -c parser.mli
findlib: [WARNING] Interface main.cmi occurs in several directories: ., /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs
findlib: [WARNING] Interface lexer.cmi occurs in several directories: ., /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs
findlib: [WARNING] Interface topdirs.cmi occurs in several directories: /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs, /home/nomaddo/.opam/4.02.3/lib/ocaml
findlib: [WARNING] Interface parser.cmi occurs in several directories: ., /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs

```

请注意,main.cmiparsing.cmilexing.cmimain.cmi 存在于同一目录中。

相信这样的文件名很常见,大家都想用
我的问题是,如何消除这些嘈杂的警告。
多亏了他们,很难立即找到更重要的警告和错误...

我的环境:ocaml 4.02.3 和 opam 1.2.2。

抑制这些警告的一种方法是将 findlib 环境变量 OCAMLFIND_IGNORE_DUPS_IN 设置为 /home/nomaddo/.opam/4.03.0/lib/ocaml/compiler-libs

这是 OCaml 4.03.0 和 ppx_sexp_conv 版本 113.33.01+4.03 的示例。

parser.mli:

type t = int [@@deriving sexp]

在shell中,执行以下操作

export OCAMLFIND_IGNORE_DUPS_IN=/home/nomaddo/.opam/4.03.0/lib/ocaml/compiler-libs

ocamlfind ocamlc  -package ppx_sexp_conv -dsource -c parser.mli

您可以看到 .mli 已经过预处理,没有发出额外的警告。

参考: