LoginSignup
25
25

More than 5 years have passed since last update.

Mountain Lionで rbenvインストール

Last updated at Posted at 2012-08-20

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を指定してもよい。
25
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
25