msfukuiの日記

おおまさのみみはそらのみみ。

mac ports を使っている人が rbenv で ruby をインストールすると bundler で digest 関連の LoadError が発生する。

結論

mac ports を使っていて、openssl と readline が mac ports 経由でインストールされていて、 rbenv で CRuby をインストールする際には、以下とするとよさそうです。
(以下は port のディレクトリが /opt/local で CRuby の 2.2.2 をインストールする場合です。)

$ RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/local --with-readline-dir=/opt/local" rbenv install 2.2.2

困っていたこと

自宅のPC環境はかなり以前から iMac なのですが、ruby 2.1 の頃からインストール後の bundle install で以下のようなエラーが発生していて、とても困っていました。

$ bundle install --path=vendor/bundle
/Users/fukui/.rbenv/versions/2.2.2/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Users/fukui/.rbenv/versions/2.2.2/lib/ruby/2.2.0/x86_64-darwin14/digest/sha1.bundle, 9): Symbol not found: _rb_Digest_SHA1_Finish (LoadError)
  Referenced from: /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/2.2.0/x86_64-darwin14/digest/sha1.bundle
  Expected in: flat namespace
 in /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/2.2.0/x86_64-darwin14/digest/sha1.bundle - /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/2.2.0/x86_64-darwin14/digest/sha1.bundle
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/definition.rb:1:in `<top (required)>'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler.rb:155:in `definition'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/cli/install.rb:78:in `run'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/cli.rb:157:in `install'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/vendor/thor/lib/thor.rb:359:in `dispatch'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/vendor/thor/lib/thor/base.rb:440:in `start'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/cli.rb:10:in `start'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/bin/bundle:20:in `block in <top (required)>'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/lib/bundler/friendly_errors.rb:7:in `with_friendly_errors'
	from /Users/fukui/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.9.6/bin/bundle:18:in `<top (required)>'
	from /Users/fukui/.rbenv/versions/2.2.2/bin/bundle:23:in `load'
	from /Users/fukui/.rbenv/versions/2.2.2/bin/bundle:23:in `<main>'

OpenSSL に関連したライブラリがきちんとロードできていないのが原因の様で、 システム本体の OpenSSL と mac ports で入っている OpenSSL と rbenv が入れる OpenSSL が絡み合って何かを引き起こしているのかなって思ってはいました。
とりあえず動いていた前バージョンの digest/ 配下のファイルをごっそり新しい環境の同ディレクトリ配下に上書きすると使えていたので、ここ2年ほどはそのまま何となく使い続けていました。

今回 2.2.2 を入れようとした際、最初同じ様に解決しようとしたのですが、うまくいかなかったので。
結局調べ方は極めてずさんなんですが、 mac ports の OpenSSL のバージョンは 1.0.2 系に上がっていて、後方互換が一部なくなっている辺りが怪しそう。
インストール時にどれを使うかを明示してあげればよいかなって思い、マニュアルとか rbenv(ruby-build) のコードを眺めて、最終的に最初の結論にたどり着きました。

参考リンク

c.f.:
Home · rbenv/ruby-build Wiki · GitHub
rbenvでMacにRuby 2.2.1 インストール(オプション指定最新版

ちゃんと本家にも書いてあるやん、という..。ごめんなさい。ごめんなさい。
そして homebrew を使っていれば ruby-build 内できちんとケアされていて、何も困ることはなかったのでした。

追伸(9/7)

実行前には C_INCUDE_PATH, C_PLUS_INCLUDE_PATH の設定もあわせて削除しておきましょう。
先日入れっぱなしになっていて、自分はさらにはまりました..。