読者です 読者をやめる 読者になる 読者になる

type t (* void *)

関数型言語や英語学習の事とか。

OCaml: DebianでのOCamlの開発環境セットアップ2013年暮れ版

今年はメインで使っていたノートPCを気が触れてUbuntuにしたら快適かなぁとか思ってうっかりOSをクリーンインストールしたせいでn回(n>10)以上もOSをクリーンインストールすることになりました。

なんだかその都度OCaml環境を再構築していたので、段々手順を覚えてきたしそろそろ快適なOCaml環境を構築する方法みたいなものをまとめて他の人のフィードバックを頂きたいなぁとも思い、記事にまとめてみます。

主に僕が知り合いにここみてねという言う用と、フィードバックを貰いたいための記事です。

より良い方法をご存じの方がいらっしゃったらぜひ教えてくださいませ。

 

OSXへOCamlの開発環境をOPAMで構築し直した - tmaeda 日記(2012-10-28)

を参考にしていますが、4.01.0になりより楽な方法で構築できるようになってますので書き起こしておきます。

 

扱うのはEmacsを使う前提での、

  • tuareg-mode Emacsでのファジーなocaml用メジャーモード
  • OPAM パッケージ管理ソフト
  • ocamlspot ソースコードで使っている関数やモジュールの定義元を参照するためのソースコード読解補助ツール
  • spotinstall ocamlspotの補助ツール
  • core 拡張標準ライブラリ
  • utop より便利なREPL

のインストール・使い方・設定までです。

 紆余曲折あってDebian7.3で環境構築します。

多分Debian系OSならば参考になるかも。

 

OCamlのインストール

まずはともあれOCamlのインストールを行いましょう。OPAMを使えば好きなバージョンを簡単に入れることができますが、OPAMをインストールするにもまずはOCamlがインストールされていることが必要です。

apt-get なりソースからビルドするなりお好きにどうぞ。

詳細は省きますが、4.01.0をインストールするのが後述するocamlspotとの連携のためおすすめです。

Tuareg-mode 

何はともあれメジャーモード。色々ダウンロードする方法ありますが、簡単なのはapt-getで入れることでしょうか。

Emacs24はELPAを使って、M-x list-packageからダウンロードできます。

ちょっと標準のレポジトリに入っていたのか覚えてませんが、melpaかmarmaladeにはあったと思います。何のことかわからない人は、

(require 'package)

(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)

 

(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))

と書いておくと幸せになれると思います。

 

OPAMのインストール

http:// opam.ocaml.org/doc/Quick_Install.html

を参考に各ディストリビューションごとにOPAMをインストールします。

Debianの場合はtestingのレポジトリを追加しておけば、apt-getでインストールできるようですね。Ubuntuの時と比べて楽ちんでした。まぁ1行端末で実行するだけなのですが。

レポジトリを追加についてはhttp://www.debian.or.jp/using/mirror.htmlを読んでください。

まぁ/etc/apt/sources.list に1行加えるだけです。jessieを僕は追加してました。

それが終われば、

su

apt-get install opam -y 

 でインストールできるはずです。

インストールできたら、opam initしましょう。

nomaddo@debian-note:~$ time opam init

default    Downloading https://opam.ocaml.org/urls.txt

default    Downloading https://opam.ocaml.org/index.tar.gz

Updating ~/.opam/repo/compiler-index ...

Updating ~/.opam/compilers/ ...

Updating ~/.opam/repo/package-index ...

Updating ~/.opam/packages/ ...

Creating a cache of metadata in ~/.opam/state.cache ...

 

In normal operation, OPAM only alters files within ~/.opam.

 

During this initialisation, you can allow OPAM to add information to two

other files for best results. You can also make these additions manually

if you wish.

 

If you agree, OPAM will modify:

 

  - ~/.bashrc (or a file you specify) to set the right environment

    variables and to load the auto-completion scripts for your shell (bash)

    on startup. Specifically, it checks for and appends the following line:

 

    . ~/.opam/opam-init/init.sh > /dev/null 2> /dev/null || true

 

  - ~/.ocamlinit to ensure that non-system installations of `ocamlfind`

    (i.e. those installed by OPAM) will work correctly when running the

    OCaml toplevel. It does this by adding $OCAML_TOPLEVEL_PATH to the list

    of include directories.

 

If you choose to not configure your system now, you can either configure

OPAM manually (instructions will be displayed) or launch the automatic setup

later by running:

 

   `opam config setup -a`.

 

 

Do you want OPAM to modify ~/.bashrc and ~/.ocamlinit?

(default is 'no', use 'f' to name a file other than ~/.bashrc)

    [N/y/f] y

 

User configuration:

  Generating ~/.ocamlinit.

  Updating ~/.bashrc.

Global configuration:

  Updating ~/.opam/opam-init/init.sh

    auto-completion : [true]

    opam-switch-eval: [true]

  Updating ~/.opam/opam-init/init.zsh

    auto-completion : [true]

    opam-switch-eval: [true]

  Updating ~/.opam/opam-init/init.csh

    auto-completion : [true]

    opam-switch-eval: [true] 

 読む限りbashの補完がきくようになる設定と、.ocamlinitが作られるという話ですかね。

 OPAMの使い方はhttp://opam.ocaml.org/doc/Basic_Usage.html

などをみてください。基本的には、switch, install, list, removeくらい使えればいいと思います。

環境変数の設定の設定

次に、主にocamlspotを活用するために環境変数の設定をします。

これは意外に重要です。

export OCAMLPARAM="_,bin-annot=1"

 export OPAMKEEPBUILDDIR=1

上のオプションは4.01.0以上で有効です。

.profileなり.bashrcなりに書いておきましょう。

 詳細はocamlspotの配布サイト https://bitbucket.org/camlspotter/ocamlspot

に書いてあるとおりなのですが一応説明します。

OCAMLPARAMはocamlcやocamloptにデフォルトでオプションを付与するための変数です。これを設定しておくといちいちocamlc -bin-annotと書かなくてもオプションがついている扱いになります。

なお-bin-annotオプションをつけているとソースファイルをコンパイルする際cmtファイルが生成されます。これには型付き構文木の情報が含まれており、ocamlspotはこれを見てその下のソースの式の型や呼び出している関数や定数の参照元をたどることができます。

OPAMKEEPBUILDDIRは空でなければ、OPAMでインストールしたファイルのソースコードを残すオプションです。

OPAM上でOCamlのインストール

 OPAMはOCamlの書くバージョンを独立してインストールし、それを切り替えることができます。

注意点としては、OPAMはソースベースのパッケージ管理システムなので問題が発生したら自分でログを読んで解決する必要があります。

例えばOPAMでインストールしたOCamlでgraphicsやlabltkが利用できないとか。

./configureのログを読んでみてください。tk.hやtcl.hがないと言われてないでしょうか。

(一回なんでだろーと僕もなりましてログ嫁と言われました。そうですよね…。)

nomaddo@debian-note:~$ opam switch 4.01.0

 

(中略)

 

# To complete the configuration of OPAM, you need to run:

eval `opam config env`

 

real5m41.465s

user4m32.937s

sys0m22.649s

nomaddo@debian-note:~$ eval `opam config env` 

最後のevalは必ずしてください。evalするまでがインストールです。

 

ocamlspotのインストール

@camloebaさん開発の非常に便利なソースリーデイングの補助ツールであるocamlspotをインストールします。

これのインストールは経験上難しいことはないはずです。

nomaddo@debian-note:~$ time opam install ocamlspot

The following actions will be performed:

 - install ocamlspot.4.01.0.2.2.0

1 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

 

=-=-= Installing ocamlspot.4.01.0.2.2.0 =-=-=

default    Downloading https://opam.ocaml.org/archives/ocamlspot.4.01.0.2.2.0+opam.tar.gz

Downloading https://opam.ocaml.org/archives/ocamlspot.4.01.0.2.2.0+opam.tar.gz

Building ocamlspot.4.01.0.2.2.0:

  make all opt install BINDIR=/home/ryohei/.opam/4.01.0/bin PREFIX=/home/ryohei/.opam/4.01.0

Installing ocamlspot.4.01.0.2.2.0.

 

real0m12.153s

user0m8.545s

sys0m1.092s 

これが終わったらついでにEmacsの設定も書き足しておきましょう。

基本的にはhttps://bitbucket.org/camlspotter/ocamlspot

に書いてあるとおり移せばいいと思います。

僕は色々な環境でEmacsを使うので自分のDropboxのファイルに

~/.opam/4.01.0/lib/ocamlspot/ocamlspot.el 

をコピーして、上の設定文を書き足しましょう。

また、

(setq ocamlspot-command "WHERE-YOU-HAVE-INSTALLED-THE-BINARIES/ocamlspot")

の部分には自分がインストールしたディレクトリのocamlspt.optを書いておくと良いかと思います。

で、どんなことが出来るのか触れておきます。画像をのように、

f:id:no_maddojp:20131226225458j:plain

ソースコードを読んでいて、定義を確認したくなる時があると思いますが、

標準の設定では、C-c C-t('ocamlspot-type)でカーソルが指している先の型を表示させることが出来、C-c C-; で定義しているmlファイルを参照、C-c C-; でmliファイルを参照できます。

何度も言っていますがそのためには参照先にcmtファイルが存在して、同時にml,mliファイルが必要です。そのためにml,mliファイルを削除しない設定を前にしました。

spotinstallのインストール

ocamlspotの補助ツールであるspotinstallをインストールします。

上で述べたように、ml,mliファイルが有る場所にcmtファイルも存在する必要があるのですが、手でいちいちコピーするのは面倒なのでこのツールを使いましょう。

詳細はhttps://bitbucket.org/camlspotter/spotinstall にあります。

一応上で述べたOPAMのつまりどころであるソースベースのパッケージ管理システムであることを説明できる例である気がします。

これ多分まっさらのOSにインストールしようとするとエラーが出るんじゃないでしょかね。

nomaddo@debian-note:~$ opam install ocamlspot

The following actions will be performed:

 - install ocamlspot.4.01.0.2.2.0

1 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

 

=-=-= Installing ocamlspot.4.01.0.2.2.0 =-=-=

default    Downloading https://opam.ocaml.org/archives/ocamlspot.4.01.0.2.2.0+opam.tar.gz

Downloading https://opam.ocaml.org/archives/ocamlspot.4.01.0.2.2.0+opam.tar.gz

Building ocamlspot.4.01.0.2.2.0:

  make all opt install BINDIR=/home/nomaddo/.opam/4.01.0/bin PREFIX=/home/nomaddo/.opam/4.01.0

Installing ocamlspot.4.01.0.2.2.0.

nomaddo@debian-note:~$ opam install spotinstall

The following actions will be performed:

 - install ocamlfind.1.4.0 [required by spotinstall]

 - install conf-libpcre.1 [required by spotinstall]

 - install omake.0.9.8.6-0.rc1 [required by spotinstall]

 - install pcre-ocaml.7.0.4 [required by spotinstall]

 - install spotlib.2.1.2 [required by spotinstall]

 - install orakuda.1.1.0 [required by spotinstall]

 - install spotinstall.1.1.1

7 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

Do you want to continue ? [Y/n] y

 

=-=-= Installing conf-libpcre.1 =-=-=

Building conf-libpcre.1:

  pkg-config libpcre

[ERROR] The compilation of conf-libpcre.1 failed.

Removing conf-libpcre.1.

 

=-=-= Installing ocamlfind.1.4.0 =-=-=

default    Downloading https://opam.ocaml.org/archives/ocamlfind.1.4.0+opam.tar.gz

Downloading https://opam.ocaml.org/archives/ocamlfind.1.4.0+opam.tar.gz

Building ocamlfind.1.4.0:

  ./configure -bindir /home/nomaddo/.opam/4.01.0/bin -sitelib /home/nomaddo/.opam/4.01.0/lib -mandir /home/nomaddo/.opam/4.01.0/man -config /home/nomaddo/.opam/4.01.0/lib/findlib.conf

  make all

  make opt

  make install

Installing ocamlfind.1.4.0.

 

=-=-= Installing omake.0.9.8.6-0.rc1 =-=-=

default    Downloading https://opam.ocaml.org/archives/omake.0.9.8.6-0.rc1+opam.tar.gz

Downloading https://opam.ocaml.org/archives/omake.0.9.8.6-0.rc1+opam.tar.gz

Applying opam.patch.

Applying fam.patch.

Applying readline.patch.

Building omake.0.9.8.6-0.rc1:

  make bootstrap PREFIX=/home/nomaddo/.opam/4.01.0

  make all PREFIX=/home/nomaddo/.opam/4.01.0

  make install PREFIX=/home/nomaddo/.opam/4.01.0

Installing omake.0.9.8.6-0.rc1.

 

=-=-= Installing spotlib.2.1.2 =-=-=

default    Downloading https://opam.ocaml.org/archives/spotlib.2.1.2+opam.tar.gz

Downloading https://opam.ocaml.org/archives/spotlib.2.1.2+opam.tar.gz

Building spotlib.2.1.2:

  ocaml setup.ml -configure --prefix /home/nomaddo/.opam/4.01.0

  ocaml setup.ml -build

  ocaml setup.ml -install

[ERROR] The compilation of spotlib.2.1.2 failed.

Removing spotlib.2.1.2.

  ocaml setup.ml -uninstall

 

[ERROR] Due to some errors while processing { conf-libpcre.1, spotlib.2.1.2 }, the following actions will NOT proceed:

 - install pcre-ocaml.7.0.4

 - install orakuda.1.1.0

 - install spotinstall.1.1.1

 

===== ERROR while installing conf-libpcre.1 =====

# opam-version 1.1.0

# os           linux

# command      pkg-config libpcre

# path         /home/nomaddo/.opam/4.01.0/build/conf-libpcre.1

# compiler     4.01.0

# exit-code    1

# env-file     /home/nomaddo/.opam/4.01.0/build/conf-libpcre.1/conf-libpcre-22002-dd682e.env

# stdout-file  /home/nomaddo/.opam/4.01.0/build/conf-libpcre.1/conf-libpcre-22002-dd682e.out

# stderr-file  /home/nomaddo/.opam/4.01.0/build/conf-libpcre.1/conf-libpcre-22002-dd682e.err

 

 

===== ERROR while installing spotlib.2.1.2 =====

# opam-version 1.1.0

# os           linux

# command      ocaml setup.ml -build

# path         /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2

# compiler     4.01.0

# exit-code    1

# env-file     /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2/spotlib-25099-0a5907.env

# stdout-file  /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2/spotlib-25099-0a5907.out

# stderr-file  /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2/spotlib-25099-0a5907.err

### stdout ###

# ...[truncated]

# --- Checking for ocamlfind... (found /home/nomaddo/.opam/4.01.0/bin/ocamlfind)

# --- Checking for ocamlc.opt... (found /home/nomaddo/.opam/4.01.0/bin/ocamlc.opt)

# --- Checking for ocamlopt.opt... (found /home/nomaddo/.opam/4.01.0/bin/ocamlopt.opt)

# --- Checking whether ocamlc understands the "z" warnings... (yes)

# --- Checking if ocamldep understands -modules... (yes)

# *** omake: finished reading OMakefiles (0.11 sec)

# - build lib gen_phantom.cmi

# + ocamlfind ocamlc -for-pack Spotlib -package unix,str -w A-4-9 -warn-error A-4-9 -annot -w Ae -g -I . -c gen_phantom.ml

# *** omake: 52/246 targets are up to date

# *** omake: failed (0.89 sec, 10/10 scans, 14/18 rules, 41/177 digests)

### stderr ###

# ...[truncated]

# *** omake: targets were not rebuilt because of errors:

#    lib/gen_phantom.cmi

#       depends on: lib/gen_phantom.ml

#    lib/gen_phantom.cmo

#       depends on: lib/gen_phantom.ml

#    lib/gen_phantom.cmx

#       depends on: lib/gen_phantom.ml

#    lib/gen_phantom.o

#       depends on: lib/gen_phantom.ml

# E: Failure("Command 'yes no | omake --install; PREFIX=/home/nomaddo/.opam/4.01.0 omake' terminated with error code 2")

 

The former state can be restored with opam switch import -f "/home/nomaddo/.opam/4.01.0/backup/state-20131126081534.export"

'opam install spotinstall' failed. 

 OPAMでインストールできる範囲であれば依存関係を解決してくれるようですが、その外のことに関してはOPAMは触れません。なので自力で解決してみます。

=-=-= Installing conf-libpcre.1 =-=-=

Building conf-libpcre.1:

  pkg-config libpcre

[ERROR] The compilation of conf-libpcre.1 failed.

Removing conf-libpcre.1. 

 最初のエラーはこれですね。pkg-config libpcreが失敗するみたい。

これ単純にライブラリが入ってないだけですね。

rootになって、

apt-get install libpcre3-dev -y 

 で解決です。また実行してみます。

 nomaddo@debian-note:~$ opam install spotinstall

The following actions will be performed:

 - install spotlib.2.1.2 [required by spotinstall]

 - install conf-libpcre.1 [required by spotinstall]

 - install pcre-ocaml.7.0.4 [required by spotinstall]

 - install orakuda.1.1.0 [required by spotinstall]

 - install spotinstall.1.1.1

5 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

Do you want to continue ? [Y/n] y

 

=-=-= Installing conf-libpcre.1 =-=-=

Building conf-libpcre.1:

  pkg-config libpcre

Installing conf-libpcre.1.

 

=-=-= Installing spotlib.2.1.2 =-=-=

Building spotlib.2.1.2:

  ocaml setup.ml -configure --prefix /home/nomaddo/.opam/4.01.0

  ocaml setup.ml -build

  ocaml setup.ml -install

[ERROR] The compilation of spotlib.2.1.2 failed.

Removing spotlib.2.1.2.

  ocaml setup.ml -uninstall

 

=-=-= Installing pcre-ocaml.7.0.4 =-=-=

default    Downloading https://opam.ocaml.org/archives/pcre-ocaml.7.0.4+opam.tar.gz

Downloading https://opam.ocaml.org/archives/pcre-ocaml.7.0.4+opam.tar.gz

Building pcre-ocaml.7.0.4:

  make

  make install

Installing pcre-ocaml.7.0.4.

 

[ERROR] Due to some errors while processing spotlib.2.1.2, the following actions will NOT proceed:

 - install orakuda.1.1.0

 - install spotinstall.1.1.1

 

===== ERROR while installing spotlib.2.1.2 =====

# opam-version 1.1.0

# os           linux

# command      ocaml setup.ml -build

# path         /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2

# compiler     4.01.0

# exit-code    1

# env-file     /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2/spotlib-27644-58c514.env

# stdout-file  /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2/spotlib-27644-58c514.out

# stderr-file  /home/nomaddo/.opam/4.01.0/build/spotlib.2.1.2/spotlib-27644-58c514.err

### stdout ###

# ...[truncated]

# --- Checking for ocamlfind... (found /home/nomaddo/.opam/4.01.0/bin/ocamlfind)

# --- Checking for ocamlc.opt... (found /home/nomaddo/.opam/4.01.0/bin/ocamlc.opt)

# --- Checking for ocamlopt.opt... (found /home/nomaddo/.opam/4.01.0/bin/ocamlopt.opt)

# --- Checking whether ocamlc understands the "z" warnings... (yes)

# --- Checking if ocamldep understands -modules... (yes)

# *** omake: finished reading OMakefiles (0.08 sec)

# - build lib gen_phantom.cmi

# + ocamlfind ocamlc -for-pack Spotlib -package unix,str -w A-4-9 -warn-error A-4-9 -annot -w Ae -g -I . -c gen_phantom.ml

# *** omake: 52/246 targets are up to date

# *** omake: failed (0.79 sec, 10/10 scans, 14/18 rules, 41/175 digests)

### stderr ###

# ...[truncated]

# *** omake: targets were not rebuilt because of errors:

#    lib/gen_phantom.cmi

#       depends on: lib/gen_phantom.ml

#    lib/gen_phantom.cmo

#       depends on: lib/gen_phantom.ml

#    lib/gen_phantom.cmx

#       depends on: lib/gen_phantom.ml

#    lib/gen_phantom.o

#       depends on: lib/gen_phantom.ml

# E: Failure("Command 'yes no | omake --install; PREFIX=/home/nomaddo/.opam/4.01.0 omake' terminated with error code 2")

 

The former state can be restored with opam switch import -f "/home/nomaddo/.opam/4.01.0/backup/state-20131126082347.export"

'opam install spotinstall' failed.

 次はspotlibのエラーですね。

spotlib単体でインストールしてみましょうか。

nomaddo@debian-note:~$ opam install spotlib

The following actions will be performed:

 - install type_conv.109.53.02 [required by spotlib]

 - install ounit.2.0.0 [required by spotlib]

 - install pa_ounit.109.53.02 [required by spotlib]

 - install spotlib.2.3.0

4 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

Do you want to continue ? [Y/n] y

 

=-=-= Installing ounit.2.0.0 =-=-=

default    Downloading https://opam.ocaml.org/archives/ounit.2.0.0+opam.tar.gz

Downloading https://opam.ocaml.org/archives/ounit.2.0.0+opam.tar.gz

Building ounit.2.0.0:

  make build

  make install

Installing ounit.2.0.0.

 

=-=-= Installing type_conv.109.53.02 =-=-=

default    Downloading https://opam.ocaml.org/archives/type_conv.109.53.02+opam.tar.gz

Downloading https://opam.ocaml.org/archives/type_conv.109.53.02+opam.tar.gz

Building type_conv.109.53.02:

  make

  make install

Installing type_conv.109.53.02.

 

=-=-= Installing pa_ounit.109.53.02 =-=-=

default    Downloading https://opam.ocaml.org/archives/pa_ounit.109.53.02+opam.tar.gz

Downloading https://opam.ocaml.org/archives/pa_ounit.109.53.02+opam.tar.gz

Building pa_ounit.109.53.02:

  make

  make install

Installing pa_ounit.109.53.02.

 

=-=-= Installing spotlib.2.3.0 =-=-=

default    Downloading https://opam.ocaml.org/archives/spotlib.2.3.0+opam.tar.gz

Downloading https://opam.ocaml.org/archives/spotlib.2.3.0+opam.tar.gz

Building spotlib.2.3.0:

  ocaml setup.ml -configure --prefix /home/nomaddo/.opam/4.01.0

  ocaml setup.ml -build

  ocaml setup.ml -install

Installing spotlib.2.3.0. 

 なんかインストールできました。インストールしようとしている対象の依存関係は解決しようとしてくれるけど、その対象の依存先の依存先はチェックしてくれないみたいですね。

またopam install spotinstallします。

nomaddo@debian-note:~$ opam install spotinstall

The following actions will be performed:

 - install orakuda.1.1.0 [required by spotinstall]

 - install spotinstall.1.1.1

2 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

Do you want to continue ? [Y/n] y

 

=-=-= Installing orakuda.1.1.0 =-=-=

default    Downloading https://opam.ocaml.org/archives/orakuda.1.1.0+opam.tar.gz

Downloading https://opam.ocaml.org/archives/orakuda.1.1.0+opam.tar.gz

Building orakuda.1.1.0:

  ocaml setup.ml -configure --prefix /home/nomaddo/.opam/4.01.0

  ocaml setup.ml -build

  ocaml setup.ml -install

Installing orakuda.1.1.0.

 

=-=-= Installing spotinstall.1.1.1 =-=-=

default    Downloading https://opam.ocaml.org/archives/spotinstall.1.1.1+opam.tar.gz

Downloading https://opam.ocaml.org/archives/spotinstall.1.1.1+opam.tar.gz

Building spotinstall.1.1.1:

  ocaml setup.ml -configure --prefix /home/nomaddo/.opam/4.01.0

  ocaml setup.ml -build

  ocaml setup.ml -install

Installing spotinstall.1.1.1. 

 というわけでインストールできました。意外と大変ですね。

spotinstallはOPAMを通してインストールしたライブラリの、オブジェクトファイルがある場所に上で述べたcmtファイルなど必要なファイルをコピーするためのツールです。

(オブジェクトファイルの場所にcmtファイルがないとspotが探せないのです)

使い方は簡単で、~/.opam/xxx/build/ にいるときにspotinstallを実行するだけです。

自動的にこのツールがcmtファイルの場所やら措くべき場所やらを探してくれます。

Core のインストール

Janestreeが開発した拡張標準ライブラリであるcoreをインストールします。

これはコマンドを叩くだけです。ちょっと時間かかりますが。

nomaddo@debian-note:~/.opam/4.01.0/build$ time opam install core

The following actions will be performed:

 - install bin_prot.109.53.02 [required by core]

 - install sexplib.109.55.02 [required by core]

 - install pa_bench.109.55.02 [required by core]

 - install comparelib.109.27.02 [required by core]

 - install fieldslib.109.20.02 [required by core]

 - install variantslib.109.15.02 [required by core]

 - install herelib.109.35.02 [required by core]

 - install pipebang.109.28.02 [required by core]

 - install res.4.0.4 [required by core]

 - install typerep.109.55.02 [required by core]

 - install custom_printf.109.27.02 [required by core]

 - install core_kernel.109.55.02 [required by core]

 - install pa_test.109.53.02 [required by core]

 - install core.109.55.02

14 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

Do you want to continue ? [Y/n] y

 

(中略)

 

 

real 8m13.326s

user 6m9.695s

sys 1m9.048s 

 ひと通り使うライブラリも揃ったので、~/.opam/4.01.0/build/

でspotinstallを実行してみましょう。長いので省略しますが、基本的には何やってるかはログを読めばわかるはずです。多分。

cmtファイルがコピーされた旨表示されるはずです。

また、同時に標準ライブラリにジャンプできるようにOCaml4.01.0をソースからビルドして、cmtファイルを/.opam/4.01.0/lib/ocamlのファイルにコピーしておくことをおすすめしますー。

utopのインストール

より便利なOCamlの対話環境であるutopをインストールしましょう。

これもラクラクなはずです。

nomaddo@debian-note:~/.opam/4.01.0/build$ time opam install utop

The following actions will be performed:

 - install camomile.0.8.5 [required by utop]

 - install react.0.9.4 [required by utop]

 - install zed.1.2 [required by utop]

 - install lwt.2.4.4 [required by utop]

 - install lambda-term.1.5 [required by utop]

 - install utop.1.10

6 to install | 0 to reinstall | 0 to upgrade | 0 to downgrade | 0 to remove

Do you want to continue ? [Y/n] y

 

(中略)

 

real2m16.779s

user1m32.462s

sys0m16.433s 

 で、これをEmacsから利用するために

./build/utop.1.10/src/top/utop.el をEmacsからautoloadする必要があります。

(無ければfindか何かで探してみてください)

 

僕はもう面倒なので自分のelispファイルにコピーして、

(autoload `utop "utop" "Toplevel for OCaml" t) 

 これで終わりです。EmacsからM-x utopで呼び出せるようになります。

一応言及しておくと、utopは通常のM-x shellからは使えません。

どんな風になるか画像を貼っておきます。

f:id:no_maddojp:20131226224101p:plain

 

素晴らしいことに、関数や定数の補完がきくんですね。

それもOPAMからダウンロードした追加ライブラリに対してもです。

utopを使えば新しいライブラリを試しててみるのも楽になるのかなぁと思います。

やや呼び出しが遅いのが難点ですけどね。

あ、utopは端末エミュレータから呼び出すとよりグラフィカルに表示されて楽しいです。

.ocamlinitの設定

別のマシーンを使ってる時は勝手に設定されたのですが、便利だろう設定を.ocamlinitに書いておくことが出来ます。これはREPLを呼び出すときに最初に読み込まれるファイルです。オススメは

#use "topfind" 

と書いておくことです。これにより最初にtopfindが呼び出され 、ライブラリをロードするのが楽になります。

f:id:no_maddojp:20131226224712p:plain

 

最初にこんな風に表示されます。

これにより、#require packageで簡単にライブラリのロードが出来ます。

#load "file_dir&name" と直接名前をしてしなくていいわけですね。またいっぺんに色々なファイルを呼び出してくれるようになります。

Coreを常用する人は上の設定に、#require "core"などと書いておくと便利かもしれません。

パッケージの名前を調べる時は#list と打ち込んでください。

端末でopam listでも確認できます。

 

おわり

これで終わりです。一応何もわからない人にセットアップ方法を説明するために書いたので馬鹿丁寧に説明文を書きました。

使い方を教えて頂いた@camloebaさん有難う御座いましたー。

いっぱい質問させていただきました。

TyperexやOMakeも便利そうなのですが、使えてないので紹介は控えました。

 

参考:

OSXへOCamlの開発環境をOPAMで構築し直した - tmaeda 日記(2012-10-28)

camlspotter / ocamlspot — Bitbucket