テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

OCamlのビルド調査

OCamlは, 言語コアを極めることに熱中してしまったがため, ライブラリやツールがしょぼい言語として知られる. INRIAとかいう学術機関が作ってるものだから, しょうがない. 彼らの才能は, コアという骨に捧ぐべきだ. 古来より優れた才能は言語かカーネルに注がれてきた.

OCamlユーザが全世界にこれだけいるのは奇跡だ. 会社名を全面に出して, ライブラリやツールに重きを置くことで(つまりゴリ押しで), 目論見どおりユーザを獲得した言語がGo(riki Ayame)なりPythonなので, GoogleOCamlサポートを全面に打ち出せば良かったのだが, どうしてそうならないのかが全く分からない. 特にあのパから始まる言語とか, OCamlに比べて良いところはどこなのだ?アメリカのソフトウェアはどうもゴリ押し感があってダメだ. 個人的には, Pythonの存在には老害感がある.

OCamlのビルド方法は, 常に議論の下に置かれる. 適当にぐぐると色々スレッドが見つかるので, ぐぐると良い. 例えばこういうスレッド http://stackoverflow.com/questions/5956317/what-is-the-preferred-way-to-structure-and-build-ocaml-projects

OCamlはどうやってビルドするのが良いのだろうか?世の中にはOCamlBuild派とOMake派がいる. 前者は言語コアに入ったが, 後者はサードパーティ扱いだ. しかしOCamlBuildは評判が悪い. 少なくとも, 出たばかりの時はゴミ扱いされてた形跡がある. これら2つの違いは,

  • OCamlBuild: ocamlbuild hoge.nativeとか叩くだけで, モジュール間の依存性とか解決して, バイナリを作り出してくれる. 挙動を変更したい場合は, myocamlbuild.mlというスクリプトを書く(これをプラグインという). 少し複雑なことをしようとするとこのプラグインが巨大になるので, 最初からOMakeでやった方がいいという人もいる. RWOでビルドツールとして使われているcorebuildは, このラッパーである. 初期の実装では, ocamlfindを使うことが出来なかったが, 少なくともv4.0.1の段階では, ocamlfindを使ってライブラリの依存関係を記述する口がある.
  • OMake: makeのようなものである. ファイルの変更を自動検知して自動テストをすることが出来る(OCamlBuildでも出来るかは良く分からない. 出来ないはずはないと思うのだが, オプションが見つからない). @ocamlspotter氏は, ocamlc(ocamlopt)とocamlfindを使ってOMake内にビルドルールを書くのが好みらしい.

今出てきたocamlfindというのは, 「どういうライブラリを使うか」を書くと, それらを使うためにどのようなコンパイルフラグが必要かということを自動的に解決してくれるありがたいツールのことであり, このツールのことを悪く言う人間はいない.

OCamlのライブラリを公開する時はOPAMを使うのが今のところ最善だ. GODIやOASIS-DBなるものも存在したが, 糞らしい. このOPAMというのにライブラリを登録するためには, 「ソースはどこにあり」「どうやってコンパイルするか」を記述するようである. 素晴らしいと思うので, きっと永遠にデフォルトになる.

ここで話を, どうやってコンパイルするかに戻す. OCamlBuildかOMakeか. これで悩むことは無駄である, setup.mlから始めろというのが先にも登場した@ocamlspotter氏である.

OCaml のパッケージシステム OASIS を使ってみた - Oh, you `re no (fun _ → more)

そんなこんなで OASIS 体験してみました。親指シフトより簡単です。 見てきたように、別に OCamlBuild 使わないとダメということもありません。 OCaml でプログラムを書いてる皆さんはとりあえずゆっくりと_oasis を書き始めてみたらいいんじゃないかな?

setup.mlというのは, ocaml setup.ml xxxの形でビルドを抽象化するためのラッパーである. このラッパーを使うと, この下でOCamlBuildを使おうがOMakeを使おうが知ったことではないという態度をとることが出来る. 後述するように, どうやってビルドするかはOPAMに登録してしまう手前, 変更されるべきでない. 従って, setup.mlでないにしろ何かしら具体的なビルドを隠蔽するラッパーが必要なことは間違いない(それはmakeでもいいと思うしむしろmakeが良いような気もする).

setup.mlは手で書くものではない. OASISによって生成する. OASIS_oasisスクリプトを素にしてsetup.mlを含む色々なコードを生成する. この_oasisファイルは手で書く必要がある. _oasisからは, setup.mlの他, 先に述べたmyocamlbuild.mlも生成される. OASISは, アップストリームのツールであるOCamlBuild推しであり, こいつ向けのスクリプトは吐いてくれるが, OMakeスクリプトを吐いてくれたりはしない. しかしOASISはOMakeユーザ向けに逃げ道も作っており, ユーザが自分で書いたOMakeを単に叩くだけというsetup.mlならば作ってくれる. こうやってOMakeユーザの心も掴んで放さない作戦だ.

以上, OCamlのビルドに関して一定の結論を出さねばならないと思って調査してきた結果をまとめた. 私は目下, コンピュータ碁プロジェクトのビルドとテストを完全に自動化する必要があるため, この調査は急務であった. OASISを使ってsetup.mlを作るところまではガチであり, もしかしたらmake(あるいはrake)をさらに被せるかどうかというのが選択の余地だと思う.