ocamlbuild huga.topの罠

OCamlには,ocamlmktopというコマンドがあって,適当なオブジェクトを事前にロードしたインタプリタを作ることができます.

let a = 100

とか書いておいたhoge.mlを用意しておいて,

$ ocamlc -c hoge.ml
$ ocamlmktop -o huga hoge.cmo

とかすると./hugaができるので,

$ ./huga
        Objective Caml version 3.10.1

# Hoge.a;;
- : int = 100

とかできて,replしたいときに幸せになれます.

ocamlbuildも当然サポートしていて,

Hoge

とか,ロードしておきたいライブラリ名を書いたhuga.mltopを書いておくと,

$ ocamlbuild huga.top

で勝手に依存関係とかを解決して作ってくれます.


が,こいつが良い感じに意味不明なわけです.

./huga.top
        Objective Caml version 3.10.1

# Hoge.a;;
Unbound value Hoge.a

なんでやねん.


小一時間悩んだのですが,ocamlmktopで作ったトップレベルは,.cmoのコードを全て含んでいるわけではなくて,起動時に自動的に#loadしてくれる,というだけのもののよう.つまり,-Iとかのオプションを付けてあげないと,「カレントディレクトリには hoge.cmo なんてないよー」と諦めてしまうみたい.うん.なんつーかさ,エラーくらい表示してくれよぉ………

$ ./huga.top -I _build
        Objective Caml version 3.10.1

# Hoge.a;;
- : int = 100

先生,もうちょっとできる子だと思ってたんだけどな……