5

现在我尝试使用ocamlfind和一些包编写编译器,尤其是ppx_sexp_conv使用opam. 不知何故需要
依赖,因此在编译文件时添加了编译选项。ppx_sexp_convcompiler-libs-I ~/.opam/VERSION/lib/compiler-libsocamlfind ocamlc -package ppx_sexp_conv

问题是,compiler-libs包括非常常见的名称文件,如parsing.cmi, main.cmi, lexing.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。

4

1 回答 1

10

抑制这些警告的一种方法是将 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 的示例。

解析器.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已预处理并且没有发出额外的警告。

参考:

于 2016-07-10T18:20:24.240 回答