现在我尝试使用ocamlfind
和一些软件包编写编译器,尤其是ppx_sexp_conv
和opam
。
以某种方式ppx_sexp_conv
的依赖关系需要compiler-libs
,因此在按-I ~/.opam/VERSION/lib/compiler-libs
编译文件时会添加编译选项ocamlfind 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.cmi
,parsing.cmi
,lexing.cmi
和main.cmi
存在于同一目录中。
我相信这样的文件名很常见,每个人都想使用 我的问题是,如何安静这种嘈杂的警告 多亏了他们,很难立即找到更重要的警告和错误......
我的环境:ocaml 4.02.3,opam 1.2.2。
答案 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
已预处理,不会发出额外警告。
参考: