ocamlbuild 対処法
前にも書いた ocamlbuild の hygiene violation に関する問題の解決法が判ったのでメモしておく。OCaml を改造しようとする人以外は意味のない内容だ:
新しいディレクトリを OCaml コンパイラソースに追加、そこで .ml ファイルをコンパイルする場合、ocamlbuild 様が御親切にも hygiene violation とやらでコンパイルを中断される。出所不明のオブジェクトファイル(.cmo, .cmi)ファイルが存在するとご機嫌が斜めになる仕様。
ポイントは ocamlbuild システムでは OCaml で書かれたプロジェクトに対し、コンパイル作業を行う myocamlbuild というプログラムを生成して、それを実行するのだが、(OCaml コンパイラのビルドでは) このプログラムに bootstrap が必要、というだった。設定ファイルを変えるだけではダメなのだ。
対処法: 色々試してしまっているので、幾つかは不要であるかもしれない:
- まず、make world で新ディレクトリでのビルドを行わないようにする。ビルドしてしまうとオブジェクトファイルが作成されるので、 hygiene violation してしまう。
- _tags の Traverse only these directories の項、 myocamlbuild.ml の Before_hygiene の項に該当ディレクトリ名を書く。
- 新ディレクトリにオブジェクトファイルがないことを確認して、make world
- boot/myocamlbuild というファイルが出来ているはずなので、これを boot/myocamlbuild.boot にコピー
- これで新ディレクトリにオブジェクトファイルが存在していても hygiene violation でゴネられることはなくなる
- make world で新ディレクトリのビルドを行っても怒られなくなる。
これは ocamlbuild と OCaml コンパイラのビルドシステムのバグかと思われるので、いつか解消されることを期待したい。ということで caml-devel に報告。