osiire’s blog

ふしぎなそふとやさん

OCamlの開発環境の作り方 2012年暮れ版

この記事はLL/MLアドベントカレンダーの記事です。

一時期停滞していたOCamlの開発環境は最近進化してきています。2012年暮れ時点における知見をまとめてみましょう。なお、これらの進化はOCaml開発チームはもとより、OCamlPro, @camlspotter氏、@m2ym氏の多大な貢献によるものです。

OPAM

OPAMはGODI,OASISと同様OCaml専用のパッケージマネージャーです。従来システムに比べて使いやすさが格段にアップしています。現時点ではパッケージマネージャとしてOPAM一択で問題ないでしょう。

http://opam.ocamlpro.com/

ダウンロード&インストール:
$ wget http://opam.ocamlpro.com/build/opam64
$ chmod +x opam64
$ sudo cp opam64 /usr/local/bin/opam
$ opam init
$ echo 'eval `opam config -env`' >> ~/.bashrc
$ source ~/.bashrc
使い方:
$ opam switch -install 4.00.1 <- 4.00.1のインストール
$ ln -s ~/.opam/4.00.1 ~/.opam/current
$ opam list  <- 利用可能なパッケージの一覧
$ opam install lwt <- ライブラリのインストール(例えばlwt)

なお、opam switchで複数のバージョンのコンパイラを切り替えることもできます。しかし、その場合ocamlコマンドが入っているbinディレクトリへのパスが変わってしまいます。そこでopam switchは使わず、~/.opam内にcurrentというシンボリックリンクを作って対応すると良いと思います。

typerex

typerexはemacsOCaml開発環境です。式の型表示、定義ジャンプ、補完などが可能で、emacsを使っている人は現時点ではこれを使うと良いと思います。Version 4.00系でのインストール方法と使い方は次の通り。

http://www.typerex.org/

ダウンロード:
$ https://github.com/OCamlPro/typerex.git
$ cd typerex
$ git checkout typerex2
コンパイル&インストール:
$ ./configure -prefix /usr/local
$ make
$ make install

.emacsの定義。

;; REPLのためにocamlコマンドへのパスを通しておく.
(add-to-list 'exec-path (expand-file-name "~/.opam/current/bin"))

;; typerex2の設定.
(with-temp-buffer (insert (shell-command-to-string "ocp-edit-mode emacs -load-global-config")) (eval-buffer))

:; flymakeのための設定(OMake限定)
(require 'flymake)
(push '("File \"\\(.*\\)\", line \\([0-9]+\\), characters \\([0-9]+\\)--?\\([0-9]+\\):\\(.*\\)" 1 2 3 5) flymake-err-line-patterns)
(push '("\\.ml\\'" flymake-ocaml-init) flymake-allowed-file-name-masks)
(defun flymake-ocaml-init ()
  (list (expand-file-name "~/.emacs.d/ocaml-flymake.sh")))

ocaml-flymake.shの内容。omakeへのパスが通っていない場合にはenv PATH=${PATH}などでパスを通します。(teeでログ出力するのは@tomy_kairaさんの改良!)

$cat ~/,emacs.d/ocaml-flymake.sh
#!/bin/bash
omake -s 2>&1 | tee -a /tmp/ocaml_log | tr -d "\n" | sed -e 's/\t//g'

typerexの設定ファイルの一部である~/.ocp/ocp-edit-mode.confを書き換えておきます。これで標準ライブラリの補完が効くようになります。

mli_directories = [
  "/usr/lib/ocaml";
  "/home/osiire/.opam/current/lib/ocaml";  <- この行を加える. 絶対パスで.
]

emacs上での主な使い方は次の通り.

  • Cc-tでカーソル上の式の型を表示.
  • Cc-;でカーソル上の値の定義位置へジャンプ.
  • モジュール名ドットの後でタブキーを押すと補完.

その他整備

さて、typerexとOPAMで一通りの環境が揃いました。しかし、実際OCamlを使ったプロジェクトで開発を行うにはもう一工夫欲しいところです。そういったちょっとしたノウハウを集めたプロジェクトスケルトンを用意しました。プロジェクトを始めるときにcloneして.git消して使うと便利かと。

https://github.com/osiire/optemplate

たぶん参考になる点:

  • ライブラリをロードしたToplevelの起動方法
  • OMakeでの複数ディレクトリの取り扱い方
  • Cのソースを含むOCamlプログラムのビルド
  • pack付きでライブラリをビルドする方法

以上、OCamlの開発環境についてまとめてみました。Happy Hacking!