ハトネコエ Web がくしゅうちょう

プログラミングとかAndroid

macOS Sierra で mysql2 の bundle install に失敗する場合

Rails のプロジェクトを扱っていて、
gem を bundle install していたところ mysql2 の部分でこんなエラーが…

Installing mysql2 0.4.4 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.4/ext/mysql2
/Users/user_name/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20161031-6252-1pfzkzr.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.16/lib
-----
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/mkmf.log

current directory: /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.4 for inspection.
Results logged to /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/gem_make.out

An error occurred while installing mysql2 (0.4.4), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.4'` succeeds before bundling.

で、 gem install mysql2 -v '0.4.4' を試したらそれは正常に実行できるので困った。

エラーメッセージの途中に library not found for -lssl と書かれていることから
openssl のライブラリ周りで問題が起きているのはわかるのですが、openssl を再インストールしたところで状況は変わらず
なかなか困っていました。

解決法1

ここの記事が解決してくれました : RailsプロジェクトでMySQLがbundle installできなかった - Qiita

この記事に書かれているコマンドと少し異なるのですが、

bundle config build.mysql2 --with-opt-lib=/usr/local/opt/openssl/lib --with-opt-include=-I/usr/local/opt/openssl/include

で解消できました。

なお、bundler のグルーバル設定を変えたくない場合は --local のオプションを上記コマンドに付けるといいです。

解決法2(こっちのが良さそう)

違うやり方として、この記事 : Pry起動時にエラーが出る場合の対処法 - Qiita
を参考に、

CONFIGURE_OPTS="--with-readline-dir=/usr/local/opt --with-openssl-dir=/usr/local/opt" rbenv install 2.3.1

と、openssl のディレクトリを明示した上で Rubyコンパイルをおこなった上で…という方法でもいけました。

解決法3(追記:2017/1/25)

コメントでいただきました。
現在は xcode-select --install でも対応できるようです。

最新の Xcode Command Line Tools では、この問題に対応しているんでしょうね。
というわけで、App StoreXcode の最新版をインストールしたのち

xcode-select --install

を実行してみてください。
(追記ここまで)


ついでに nokogiri も gem install に失敗してたけど、そちらはこの記事で助かりました。 : OSX への nokogiri 1.6.8.rc3 の install でハマったメモ - Qiita

たしかに以前 brew doctor で指摘されてるから unlink した覚えがある。
ってことで、

brew link --force libxml2

したあとに gem install nokogiri -- --use-system-libraries でインストール可能。
bundle config の方は以下のように設定。

bundle config build.nokogiri --use-system-libraries

これで mysql2 や nokogiri が Gemfile に含まれていても bundle install に成功するようになりました。
めでたしめでたし