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

时间:2016-07-10 16:32:26

标签: ocaml opam ocamlfind

现在我尝试使用ocamlfind和一些软件包编写编译器,尤其是ppx_sexp_convopam
以某种方式ppx_sexp_conv的依赖关系需要compiler-libs,因此在按-I ~/.opam/VERSION/lib/compiler-libs编译文件时会添加编译选项ocamlfind 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。

1 个答案:

答案 0 :(得分:9)

抑制这些警告的一种方法是将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已预处理,不会发出额外警告。

参考: