OCamlのパッケージマネージャOPAMを試してみた

この記事は完全に古くなっています。他をあたってください。
OCamlのライブラリインストールは毎回本当に苦行なので期待が高まる。

基本、

https://github.com/OCamlPro/opam
ここにあるとおりにやればいい。
が、微妙に書いてない事とかあったのでメモ。

インストール

$ git clone git://github.com/OCamlPro/opam.git
$ cd opam
$ ./configure --prefix=$HOME/local # 適当な場所に
$ make
$ make install
$ opam init
$ eval `opam config -env`

注意: OCamlのバージョンが3.12.0以上である必要がある(多分)
3.11.2だと出たエラー

Fatal error: unknown C primitive `unix_setgroups'

あと、

opam init failed.
Run.process_error(_,1,_,_,1)

とか出たら、mkdir -p ~/.opam/repo/defaut && touch ~/.opam/repo/default/urls.txt すると動くかもしれない。

opam switch

ocamlコンパイラの切り替え(+インストール)

$ opam switch -list
$ opam switch -install 4.00.0
$ opam switch -install 3.12.1
$ opam switch 4.00.0
$ eval `opam config -env`

注意(?): opam switch system; ocaml すると,

Fatal error: cannot load shared library dllunix
Reason: /home/kfujima/local2/lib/ocaml/stublibs/dllunix.so: undefined symbol: caml_debugger_fork_mode

とか言って死ぬ。原因不明

opam install

ライブラリのインストール

$ opam list
$ opam install batteries

urls.txt does not exist. って言われたら、touch ~/.opam/repo/default/urls.txt すると動くかもしれない。

試しにbatteriesを使ってみる。

open Batteries_uni

let () =
  (1--999)
  |> Enum.filter (fun i -> i mod 3 = 0 || i mod 5 = 0)
  |> Enum.reduce (+)
  |> Int.print stdout
$ ocamlfind ocamlc -package batteries -linkpkg test.ml

...だと動かなかったので(多分自分だけ? ocamlfind listの表示が古かったりしておかしい -> 追記: 別のマシンでは上のコマンドで動いた。)

$ ocamlc -I .opam/4.00.0/lib/batteries/ -I .opam/4.00.0/lib/camomile/ nums.cma bigarray.cma unix.cma str.cma camomile.cma batteries_uni.cma test.ml

とりあえずこれで動いたのでインストールできてるのは間違いない。

まとめ

rvm+rubygems的なゆるふわさが実現されてる気がする。