Macでkerlを使用して複数バーションのErlang/OTPを導入する

Mac（OS X）でのErlang/OTPの導入手段はいくつかあるが、ここでは [kerl](https://github.com/kerl/kerl) を使う方法を採用する。以下のような利点がある。

1. **簡単に導入できる** （ `build` と `install` コマンドを実行するだけ）
2. **最新版のErlang/OTPが使える** （erlang.orgで配布されているソースコードからビルドするのでリリース直後から使える）
3. **複数バージョンのErlang/OTPを導入・管理できる**

特に３はErlangで複数のシステムを開発・保守する際に重宝する。Erlangの異なるバージョンだけでなく、同じバージョンでビルドオプションを変えたもの（HiPEのあり/なし、最小構成のアプリケーションのみなど）をいくつでも導入して、切り替えながら使える。


# 準備：Intelプロセッサ搭載Macの場合

OS X 10.8 Mountain Lionで検証済み。マシンはIntel Core i7搭載のMac mini Mid 2012を使用。

```sh
$ uname -a
Darwin mini2012.local 12.2.1 Darwin Kernel Version 12.2.1: Thu Oct 18 12:13:47 PDT 2012; root:xnu-2050.20.9~1/RELEASE_X86_64 x86_64
```

## gccのインストール

App Storeアプリで **Xcode 4.x** を検索し、インストールする。Xcodeを起動し、Xcodeメニューから **Preferences** を選択。 **Downloads** パネルに切り替え **Command Line Tools** のInstallボタンを押す。

## デフォルトのErlang configオプションの指定

Erlangのビルドに使うデフォルトのconfigオプションを `~/.kerlrc` に書いておく。 `--enable-darwin-64bit` は重要なので必ず指定する。

```sh
$ echo 'KERL_CONFIGURE_OPTIONS="--disable-hipe --enable-smp-support --enable-threads --enable-kernel-poll --enable-darwin-64bit" ' > ~/.kerlrc
```


# 準備：PowerPCプロセッサ搭載Macの場合

Mac OS X 10.5 Leopardで検証済み。マシンはPowerPC G4搭載のMac mini G4を使用。

```sh
$ uname -a
Darwin mini-two.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:57:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_PPC Power Macintosh
```

## gccのインストール

Appleの [Mac Dev Center] (https://developer.apple.com/devcenter/mac/) に登録し、ログインする。（登録は無料）　Downloadエリアから **Xcode 3.1.4** をダウンロードし、インストーラーを起動する。インストールの種類で **UNIX 開発サポート** のチェックマークがオンになっていることを確認し、インストールする。

## デフォルトのErlangビルドオプションの指定

Erlangのビルドに使うデフォルトのconfigオプションを  `~/.kerlrc` に書いておく。PowerPCでは `--enable-darwin-64bit` を指定してはいけない。

```sh
$ echo 'KERL_CONFIGURE_OPTIONS="--disable-hipe --enable-smp-support --enable-threads --enable-kernel-poll" ' > ~/.kerlrc
```


# kerlスクリプトの導入

kerlスクリプトをGitHubからダウンロードする。

```sh
$ curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
```

PowerPC Mac（Mac OS X 10.5.8）ではGitHubのSSL証明書の確認エラーになってしまった。発行元（CA）の情報が登録されていないらしい。

```sh
$ curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html
（以下略）
```

このような場合は curl コマンドに `--insecure` オプションを付けて証明書の確認を省くか、心配なら、Safariで開き、保存すればよい（Safariなら証明書の確認ができる）

スクリプトをダウンロードしたら、実行できるようにする。

```sh
$ chmod a+x kerl
```

スクリプトは `PATH` の通った場所に置く。

例： `~/bin` に置く場合

```sh
$ mkdir -p ~/bin
$ mv kerl ~/bin/
$ echo "export PATH=$PATH:~/bin" >> ~/.bashrc
$ source ~/.bashrc
```


# Erlang/OTPの導入

Erlangをソースコードからビルドして導入しよう。まず、導入可能なErlangバージョンの一覧を表示する。

```sh
$ kerl list releases
Getting the available releases from erlang.org...
R10B-0 R10B-10 R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8 R10B-9 R11B-0 R11B-1 R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3 R12B-4 R12B-5 R13A R13B R13B01 R13B02-1 R13B02 R13B03 R13B04 R14A R14B R14B01 R14B02 R14B03 R14B04 R15B R15B01 R15B02 R15B03-1 R15B03
Run "kerl update releases" to update this list from erlang.org
```

なお、この一覧は自動では更新されない。新しいバージョンのErlangがリリースされたら、以下のコマンドで更新する。

```sh
$ kerl update releases
```


## ソースコードからビルド

お好みのバージョンをビルドする。 `R15B03-1` が導入したいバージョン、 `r15b03-1` がビルドにつける任意の名前となる。

```sh
$ kerl build R15B03-1 r15b03-1
Downloading otp_src_R15B03-1.tar.gz to .kerl/archives
（中略）
Getting the checksum file from erlang.org...
（中略）
Verifying archive checksum...
Checksum verified (eccd1e6dda6132993555e088005019f2)
Extracting source code
Building Erlang/OTP R15B03-1 (r15b03-1), please wait...
Erlang/OTP R15B03-1 (r15b03-1) has been successfully built
```

ビルドオプションを変える時は、別の名前（例 `r15b03-1_hipe` ）を付ければ、他のビルドと共存できる。

```sh
$ KERL_CONFIGURE_OPTIONS="--enable-hipe --enable-darwin-64bit" kerl build R15B03-1 r15b03-1_hipe
```

ビルドの一覧を表示する。

```sh
$ kerl list builds
R15B03-1,r15b03-1
R15B03-1,r15b03-1_hipe
```

## インストール

ビルドできたらインストールする。 `~/erlang/r15b03-1` はインストール先のディレクトリ。

```sh
$ kerl install r15b03-1 ~/erlang/r15b03-1
Installing Erlang/OTP R15B03-1 (r15b03-1) in ~/erlang...
You can activate this installation running the following command:
. ~/erlang/r15b03-1/activate
Later on, you can leave the installation typing:
kerl_deactivate
```

インストール済みのビルドを一覧表示する。

```sh
$ kerl list installations
r15b03-1 ~/erlang/r15b03-1
```

## アクティベート（有効化）

インストール済みビルドの１つをアクティベート（有効化）する。アクティベートでは `$PATH` を変更することで指定したインストール済みビルドの `bin/` 配下にあるコマンドが使われるようにしているので、アクティベートを実行したシェルセッション内でのみ有効となる。シェルを終了したり `kerl_deactivate` を実行すると無効化される。

```sh
$ . ~/erlang/r15b03-1/activate

$ erl
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> 
```

試しに別のビルドに切り替えてみる。

```sh
$ kerl install r15b03-1_hipe ~/erlang/r15b03-1_hipe
$ . ~/erlang/r15b03-1_hipe/activate
$ erl
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> 
```

`[hipe]` と表示されたことから、HiPEが有効になっていることがわかる。


# その他の便利コマンド

いまアクティブになっているビルドを表示する。

```sh
$ kerl active
The current active installation is:
~/erlang/r15b03-1
```

コマンドでkerlの状態のオーバービューを表示する。

```sh
$ kerl status
Available builds:
R15B03-1,r15b03-1
R15B03-1,r15b03-1_hipe
----------
Available installations:
r15b03-1 ~/erlang/r15b03-1
----------
The current active installation is:
~/erlang/r15b03-1
```

もし使わなくなったビルドがあれば削除しておこう。

```sh
$ kerl delete build r15b03-1
$ kerl delete installation ~/erlang/r15b03-1
```

sshやrsyncでアクセス可能な他のマシンにインストールすることもできる。

```sh
$ kerl deploy anotherhost /path/to/install/dir
```


# 参考にしたページ

- kerl -- Easy building and installing of Erlang/OTP instances
  * https://github.com/kerl/kerl

- Basho Riak Docs -- Installing Erlang
  * http://docs.basho.com/riak/1.2.1/tutorials/installation/Installing-Erlang/