OSX 10.10 に kerl で Erlang 17.5 をインストールし, crypto:start/0 を成功させる


## 概要
Mac を新調し kerl で Erlang をインストールしたところ, R16B03-1 では crtpto:start/0 の評価に成功するが, 17.5 では評価に失敗する.

crypto:start/0 の評価に失敗すると, Elixir のインストールどころか rebar の実行にも支障が出る. そこで, 正しいインストール方法を備忘録として残す.

## 環境
- OSX 10.10.3
- Xcode 6.3
- OpenSSL 1.0.2a
- Erlang 17.5

## Command Line Tools for Xcode をインストール
gcc などの開発用コマンドを有効にするため, Command Line Tools for Xcode をインストールする.

1. Xcode を App Store からインストールし, 起動
2. Xcode メニューから Open Developer Tool, More Developer Tools を選択
3. ブラウザに Apple Developer のログイン画面が表示された後, ログイン
4. Downloads for Apple Developers の画面が表示された後, Command Line Tools(OS X 10.10) for Xcode 6.3 を選択し, ダウンロード
5. ダウンロード後, インストール

gcc のバージョンを確認しておく.

```zsh:
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
```

## OpenSSL をインストール
OSX 10.10.3 に標準で含まれている OpenSSL は 0.9.8zd であるため, Homebrew や MacPorts で 1.0.2a をインストールする.

MacPorts でインストールする例は次の通り.

```zsh:
$ sudo port install openssl
```

Homebrew でインストールする例は次の通り.

```zsh:
$ sudo brew install openssl
```

OpenSSL のバージョンを確認しておく.

```zsh:
$ openssl version
OpenSSL 1.0.2a 19 Mar 2015
```

## kerl をインストール
Erlang の複数の異なるコンパイルオプションやバージョンを試すため, kerl をインストールする.

```zsh:
$ cd /path/to/bin
$ curl -O https://raw.githubusercontent.com/spawngrid/kerl/master/kerl
$ chmod a+x ./kerl
```

リリースされている Erlang の一覧を確認しておく.

```
$ kerl list releases
17.0-rc1 17.0-rc2 17.0 17.1 17.3 17.4 17.5 R10B-0 R10B-10 R10B-1a 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 R14B_erts-5.8.1.1 R15B R15B01 R15B02 R15B02_with_MSVCR100_installer_fix R15B03-1 R15B03 R16A_RELEASE_CANDIDATE R16B R16B01 R16B02 R16B03-1 R16B03
Run "/Users/masahito.ikuta/bin/kerl update releases" to update this list from erlang.org
```

出力されている通り, ```kerl update releases``` で一覧を更新可能.

Erlang コンパイル時の configure のオプションを指定する.

```zsh:~/.kerlrc
KERL_CONFIGURE_OPTIONS="--enable-kernel-poll --enable-threads --enable-dynamic-ssl-lib --enable-smp-support --enable-darwin-64bit --disable-hipe --disable-native-libs --disable-sctp --without-javac --without-odbc --without-wx --with-ssl=/opt/local"
```

### 指定オプションの意図

#### OSX 10.10 関連

- --enable-kernel-poll
- --enable-threads
- --enable-smp-support
- --enable-darwin-64bit
- --disable-hipe

#### OpenSSL 関連
ここを誤ると, crypto:start/0 が失敗する.

- --enable-dynamic-ssl-lib
- --with-ssl=/opt/local

Homebrew で OpenSSL をインストールした場合, ```--with-ssl=/usr/local/opt/openssl``` とする.

#### 不要な機能
ここは, 好みや用途に合わせる.

- --disable-native-libs
- --disable-sctp
- --without-javac
- --without-odbc
- --without-wx

## Erlang をインストール
ここまでの手順で, 全ての準備が整ったため, Erlang 17.5 をインストールする.

```kerl list releases``` に含まれる 17.5 をビルドする.

```zsh:
$ kerl build 17.5 17.5
```

```kerl list builds``` に含まれる 17.5 をインストールする.

```zsh:
$ mkdir -p /path/to/erlang
$ kerl kerl install 17.5 /path/to/erlang/17.5
```

インストールされたか確認する.

```zsh:
$ kerl list installations
17.5 /path/to/erlang/17.5
```

crypto.so がリンクしているライブラリを確認する.

```zsh:
$ otool -L /path/to/erlang/17.5/lib/crypto-3.5/priv/lib/crypto.so
/path/to/erlang/17.5/lib/crypto-3.5/priv/lib/crypto.so:
        /opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
```

ここで, OSX 10.10 に標準で含まれている ```/usr/lib/libcrypto.0.9.8.dylib``` がリンクされていると crypto:start/0 は失敗する.

最後に, application:start/1 経由で crypto:start/0 を確認する.

```zsh:
$ . /path/to/erlang/17.5/activate
$ erl +Ktrue
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:true]

Eshell V6.4  (abort with ^G)
1> application:start(crypto).
ok
2> q().
```