18137


`ocaml 4.02.3`において、以下のコマンドで`longident.ml`というファイルを  
コンパイルする際に下で示すエラーが表示されました。

`longident.ml`の中身は`type t = int`のみで、他にファイルがないディレクトリでコンパイルしました。  
`longident.ml`はコンパイラのコードで`parsing/longident.ml`が存在するため  
`ocamlcommon.cmxa`に含まれているからエラーになっていると思うのですが  
なぜ`compiler-libs`が以下のコンパイルコマンドで`ocamlfind`により認識されているのでしょうか？

ちなみに`-package`から`batteries`、`sexplib`のどちらかを外した時にも同様のエラーが発生しました。  
`-package`を書かないで`ocamlfind opt`でコンパイルした時には通常通りコンパイルできました。  
`.opam/package/`から`batteries`と`sexplib`の依存関係とその依存パッケージの依存関係を見ても`compiler-
libs`にdependしているという記述は見つけられませんでした。

[code]

    ocamlfind opt -package batteries,sexplib.syntax -linkpkg -syntax camlp4o ./longident.ml 
    findlib: [WARNING] Interface longident.cmi occurs in several directories: ., /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs
    findlib: [WARNING] Interface topdirs.cmi occurs in several directories: /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs, /home/tokuda/.opam/4.02.3/lib/ocaml
    File "./longident.ml", line 1:
    Error: Files ./longident.cmx
           and /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs/ocamlcommon.cmxa
           both define a module named Longident
    
[/code]

`-verbose`をつけた時の表示は以下のとおりです。

[code]

    ocamlfind opt -package batteries,sexplib.syntax -linkpkg -syntax camlp4o -verbose ./longident.ml 
    findlib: [WARNING] Interface longident.cmi occurs in several directories: ., /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs
    findlib: [WARNING] Interface topdirs.cmi occurs in several directories: /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs, /home/tokuda/.opam/4.02.3/lib/ocaml
    Effective set of preprocessor predicates: preprocessor,syntax,camlp4o
    Effective set of compiler predicates: pkg_unix,pkg_num.core,pkg_num,pkg_bigarray,pkg_str,pkg_bytes,pkg_batteries,pkg_camlp4,pkg_compiler-libs,pkg_compiler-libs.common,pkg_type_conv,pkg_sexplib,pkg_sexplib.syntax,syntax,autolink,native
    + ocamlopt.opt -verbose -I /home/tokuda/.opam/4.02.3/lib/num -I /home/tokuda/.opam/4.02.3/lib/bytes -I /home/tokuda/.opam/4.02.3/lib/batteries -I /home/tokuda/.opam/4.02.3/lib/ocaml/camlp4 -I /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs -I /home/tokuda/.opam/4.02.3/lib/type_conv -I /home/tokuda/.opam/4.02.3/lib/sexplib -pp "camlp4 '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml/camlp4' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs' '-I' '/home/tokuda/.opam/4.02.3/lib/type_conv' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml' '-I' '/home/tokuda/.opam/4.02.3/lib/sexplib' '-I' '/home/tokuda/.opam/4.02.3/lib/sexplib' '-parser' 'o' '-parser' 'op' '-printer' 'p' 'ocamlcommon.cma' 'pa_type_conv.cma' 'unix.cma' 'bigarray.cma' 'sexplib.cma' 'pa_sexp_conv.cma' " /home/tokuda/.opam/4.02.3/lib/ocaml/unix.cmxa /home/tokuda/.opam/4.02.3/lib/ocaml/nums.cmxa /home/tokuda/.opam/4.02.3/lib/ocaml/bigarray.cmxa /home/tokuda/.opam/4.02.3/lib/ocaml/str.cmxa /home/tokuda/.opam/4.02.3/lib/batteries/batteries.cmxa /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs/ocamlcommon.cmxa /home/tokuda/.opam/4.02.3/lib/sexplib/sexplib.cmxa ./longident.ml
    + camlp4 '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml/camlp4' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs' '-I' '/home/tokuda/.opam/4.02.3/lib/type_conv' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml' '-I' '/home/tokuda/.opam/4.02.3/lib/ocaml' '-I' '/home/tokuda/.opam/4.02.3/lib/sexplib' '-I' '/home/tokuda/.opam/4.02.3/lib/sexplib' '-parser' 'o' '-parser' 'op' '-printer' 'p' 'ocamlcommon.cma' 'pa_type_conv.cma' 'unix.cma' 'bigarray.cma' 'sexplib.cma' 'pa_sexp_conv.cma'  './longident.ml' > /tmp/ocamlpp0f6ab1
    + as -o './longident.o' '/tmp/camlasmc75b90.s'
    File "./longident.ml", line 1:
    Error: Files ./longident.cmx
           and /home/tokuda/.opam/4.02.3/lib/ocaml/compiler-libs/ocamlcommon.cmxa
           both define a module named Longident
    ocamlopt.opt returned with exit code 2
    
[/code]


CC BY-SA 3.0
2015-10-27T09:01:20.583
18130
2015-10-27T12:47:41.533
2015-10-27T09:30:54.000
898
7768
question
ocaml
ocamlfindがcompiler-libsを認識して名前が被るモジュールがコンパイルできない


解決したようで良かったです。いくつかポイントをあげておきます。

`ocamlfind` コマンドが何をやっているか判らないときは `ocamlfind <command> -verbose ...`
として実際にどんなコマンドが起動されるか確認する

OCamlFind パッケージと OPAM パッケージは違う。OCamlFind はライブラリの使用を助けるためのツールで、 OCamlFind
パッケージはだいたいライブラリと一対一の関係にある。 OPAM
はリリースされているソフトウェアパッケージと一対一の関係にありそのインストールを助ける。OPAM パッケージをインストールすると OCamlFind
パッケージをインストールしないかもしれないし、するかもしれない。複数インストールすることもあり得る

OCamlFind はライブラリのリンク依存関係を `META` というファイルを使って把握する。OPAM パッケージの `opam`
ファイルはソフトウェアパッケージとしてのインストール依存関係を表すもので、もちろん大体リンク依存関係と似てはいるが、同じではない。

`compiler-libs` ライブラリは OCaml コンパイラをインストールすると一緒にインストールされるので、対応する OPAM パッケージはない。
OCamlFind パッケージとしては存在する。OCaml コンパイラをインストールした時には OCamlFind は存在しないので、 `compiler-
libs` という OCamlFind パッケージが存在するのはちょっと不思議だが、OCamlFind インストール時に勝手に作ってくれる。


CC BY-SA 3.0
2015-10-27T12:47:41.533
18137
2015-10-27T12:47:41.533
898
18130
answer