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 に報告。