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

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

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

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


# 準備

Erlangのビルドに必要なパッケージを導入する。

## Fedora、RHEL、CentOSの場合

```sh
$ sudo yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf
$ sudo yum install curl git
```

## Debian、Ubuntuの場合

```sh
$ sudo apt-get install build-essential libncurses5-dev openssl libssl-dev
$ sudo apt-get install curl git-core
```

## Arch Linuxの場合

```sh
$ sudo pacman -S gcc glibc make ncurses openssh autoconf
$ sudo pacman -S curl git
```

# kerlスクリプトの導入

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

```sh
$ curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
$ chmod a+x kerl
```

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

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

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


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

Erlangのビルドに使うデフォルトのconfigオプションを `~/.kerlrc` に書いておく。

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


# 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" 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/