OS X で rbenv を使って ruby 1.9.3 の環境を作るに、「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(失敗)
うまくいかないので、先の投稿に一緒に紹介されていたソースからのビルド方法を試してみた。
しかし結果は同じに。その後いろいろ試した。
- ここ を参考に、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が悪いのかなと思いつつ、調べるとここやここのように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を指定するのもありみたい。
まとめ
元投稿を読み返してみたら、--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を指定してもよい。