Mountain Lionで rbenvインストール


 [OS X で rbenv を使って ruby 1.9.3 の環境を作る](http://qiita.com/items/9dd797f42e7bea674705)に、「rvm捨てろ」と書かれてあったのでおそるおそる捨ててみた。

ただ、変なところでつまづいてしまったので、記録を残しておく。

## 解決までの道のり

### rbenvでビルド（失敗）

先の投稿を参考にrbenvをインストールして、rbenv installを実行してみた。すると、以下の様なエラーが発生した。

```
$ rbenv install 1.9.3-p194
…
make: *** [build-ext] Error 2 
``` 

ruby-buildのログをざっと見ても何のエラーかわからなかった。opensslの直後で発生しているので、opensslのエラーかもと思ったがこのメッセージだけではそれもわからなかった（実はログの末尾だけでなくもう少し上の方をみると、以下のようなreadlineのエラーが見えたはずだが、この時点では気が付かなかった）。

```
../../../ext/readline/readline.c: In function ‘username_completion_proc_call’:
../../../ext/readline/readline.c:1499: error: ‘username_completion_function’ undeclared (first use in this function)
../../../ext/readline/readline.c:1499: error: (Each undeclared identifier is reported only once
../../../ext/readline/readline.c:1499: error: for each function it appears in.)
make[2]: *** [readline.o] Error 1
make[1]: *** [ext/readline/all] Error 2
make[1]: *** Waiting for unfinished jobs....
```

### ソースからビルド1（失敗）

うまくいかないので、先の投稿に一緒に紹介されていたソースからのビルド方法を試してみた。

しかし結果は同じに。その後いろいろ試した。

* [ここ](https://github.com/sstephenson/ruby-build/issues/82) を参考に、configureに --with-gcc=clang というオプションを指定するが結果変わらず。
* Mountain Lionなのに、XCodeを3.x系のまま放置していたのが原因かもと、4.4にupgradeした。もちろんCommand Line Toolsも入れた。でも結果変わらず。

ちなみにgccのバージョンは以下のとおり。

```
$ gcc -v
Using built-in specs.
Target: i686-apple-darwin11
(中略)
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

```

### ソースからビルド2（失敗）
 
opensslの箇所で止まっているので、opensslが悪いのかなと思いつつ、調べると[ここ](https://gist.github.com/1223731)や[ここ](http://d.hatena.ne.jp/milk1000cc/20111002/1317545875)のようにreadlineの問題ばかり見つかった。自分のケースに当てはまるのか疑問に思いながらも、--with-readline-dir を指定してみた。
結果として、以下の警告が出たので、configureが上手くいってないと思い込んだ。実際、make cleanしてやり直しても結果変わらなかったので。

```
$ ../configure --prefix=$HOME/.rbenv/versions/1.9.3-p194 --with-readline-dir=$(brew --prefix readline)
configure: WARNING: unrecognized options: --with-readline-dir
```

configureのソースを見たところ、--with-EXT-dir的なオプションはないみたいだったので、1.9.3から何か変更になってしまったのかと思った。ソース中に記述のあった、--with-opt-dirとかも試したが同じだった。

### ヒントの発見

そうこうしているうちに以下のヒントを発見した。

* 先述のreadlineのエラーを発見し、原因がreadlineにあることを特定できた。
* ext/readline/Makefile をみると、LIBPATHが /usr/local/lib/lib になっていた。

make cleanしてから、--with-readline-dirを指定してconfigureしなおしても、LIBPATHは変わらなかった。つまり、一度全て削除して再ビルドしないと、いくらオプションを指定しても無駄そうだということが分かった。

### ソースからビルド（成功）

buildディレクトリを削除し、再度configureしてから、makeするとビルドが成功した。

```
$ cd ..
$ rm -rf build
$ mkdir build
$ cd build
$ ../configure --prefix=$HOME/.rbenv/versions/1.9.3-p194 --with-readline-dir=$(brew --prefix readline)
$ make -j5
```

### rbenvでのビルドに再挑戦（成功）

オプションを適切に指定すればビルドできることが分かったので、rbenvのビルドも試してみる。
折角brewでopensslも入れたので、readlineとともに指定してみる。

```
$ CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install -v 1.9.3-p194

```

ようやくビルド成功！

ここでは、Cellerを直に指定するようにしたが、brew linkして、--with-readline-dir=/usr/localを指定するのもありみたい。

## まとめ

[元投稿](http://qiita.com/items/9dd797f42e7bea674705)を読み返してみたら、--with-opt-dirを指定しているケースも記述されているじゃないか…。/brew に homebrew を入れた場合…という条件に当てはまらないと思ったので、完全無視していた。

つまり、brew link readline しておいて、--with-opt-dir=/usr/localを指定すれば、それで上手くいったような気も。/usr/local/lib はビルド時に、デフォルトでサーチされるんだと勝手に思い込んでたなあ。

* --with-readline-dirなどのオプションはconfigureの時点ではWARNINGとなるが、実際にmakeしてextの各ライブラリのconfigureが行われ始めるとちゃんと適用される
* ruby-buildに対して、brewで入れたライブラリを参照させたい時は、CONFIGURE_OPTSに、例えば **--with-readline-dir=$(brew --prefix readline)** などを指定する。もしくはbrew linkしておいて、--with-opt-dir=/usr/localを指定してもよい。