MacOSMojaveにアップデートしてbundle installしてもmysqlだけ入らなかったエラーの解決法(Rails5.2.1・Ruby2.5.1)

先日MacOSをMojave&Railsを5.2.1&Rubyを2.5.1にアップデートしました。

そしたらmysqlがbundle installできないエラーに見舞われました。

結構苦戦したので同じエラーが出た人のためになればと思い記事にしました。

 

エラー内容

rails new をして、bundle installしようとしてもmysql2のところだけ弾かれました。
ディレクトリの権限をユーザーに変更したり、xcodeのインストールもしていて、brew listにもmysqlはある状態です。

以下はbundle installした後に出たエラー文です。

 

エラー文:

Fetching gem metadata from https://rubygems.org/.........

Fetching gem metadata from https://rubygems.org/.

Resolving dependencies....

Using rake 12.3.1

Using concurrent-ruby 1.1.2

Using i18n 1.1.1

Using minitest 5.11.3

Using thread_safe 0.3.6

Using tzinfo 1.2.5

Using activesupport 5.2.1

Using builder 3.2.3

Using erubi 1.7.1

Using mini_portile2 2.3.0

Using nokogiri 1.8.5

Using rails-dom-testing 2.0.3

Using crass 1.0.4

Using loofah 2.2.3

Using rails-html-sanitizer 1.0.4

Using actionview 5.2.1

Using rack 2.0.6

Using rack-test 1.1.0

Using actionpack 5.2.1

Using nio4r 2.3.1

Using websocket-extensions 0.1.3

Using websocket-driver 0.7.0

Using actioncable 5.2.1

Using globalid 0.4.1

Using activejob 5.2.1

Using mini_mime 1.0.1

Using mail 2.7.1

Using actionmailer 5.2.1

Using activemodel 5.2.1

Using arel 9.0.0

Using activerecord 5.2.1

Using mimemagic 0.3.2

Using marcel 0.3.3

Using activestorage 5.2.1

Using public_suffix 3.0.3

Using addressable 2.5.2

Using io-like 0.3.0

Using archive-zip 0.11.0

Fetching bcrypt 3.1.12

Installing bcrypt 3.1.12 with native extensions

Using bindex 0.5.0

Using msgpack 1.2.4

Using bootsnap 1.3.2

Using bundler 1.17.1

Using byebug 10.0.2

Using regexp_parser 1.2.0

Using xpath 3.2.0

Using capybara 3.10.1

Using ffi 1.9.25

Using childprocess 0.9.0

Using chromedriver-helper 2.1.0

Using coffee-script-source 1.12.2

Using execjs 2.7.0

Using coffee-script 2.4.1

Using method_source 0.9.1

Using thor 0.20.0

Using railties 5.2.1

Using coffee-rails 4.2.2

Fetching orm_adapter 0.5.0

Installing orm_adapter 0.5.0

Fetching responders 2.4.0

Installing responders 2.4.0

Fetching warden 1.2.7

Installing warden 1.2.7

Fetching devise 4.5.0

Installing devise 4.5.0

Using multi_json 1.13.1

Using jbuilder 2.8.0

Using rb-fsevent 0.10.3

Using rb-inotify 0.9.10

Using ruby_dep 1.5.0

Using listen 3.1.5

Fetching mini_magick 4.9.2

Installing mini_magick 4.9.2

Fetching mysql2 0.5.2

Installing mysql2 0.5.2 with native extensions

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

 

current directory:

/Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/ext/mysql2

/Users/hayashiyoshino/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20181106-52115-1qne296.rb

extconf.rb

checking for rb_absint_size()... yes

checking for rb_absint_singlebit_p()... yes

checking for rb_wait_for_single_fd()... yes

-----

Using mysql_config at /usr/local/bin/mysql_config

-----

checking for mysql.h... yes

checking for errmsg.h... yes

checking for SSL_MODE_DISABLED in mysql.h... yes

checking for SSL_MODE_PREFERRED in mysql.h... yes

checking for SSL_MODE_REQUIRED in mysql.h... yes

checking for SSL_MODE_VERIFY_CA in mysql.h... yes

checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes

checking for MYSQL.net.vio in mysql.h... yes

checking for MYSQL.net.pvio in mysql.h... no

checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes

checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes

checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes

checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes

checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes

checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes

checking for my_bool in mysql.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.21/lib

-----

creating Makefile

 

current directory:

/Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/ext/mysql2

make "DESTDIR=" clean

 

current directory:

/Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/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/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2 for inspection.

Results logged to

/Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/mysql2-0.5.2/gem_make.out

 

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.

Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before

bundling.

 

In Gemfile:

  mysql2

 

 

 

上のエラー文で言われた通り、

gem install mysql2 -v '0.5.2'

 を試しても、

Building native extensions. This could take a while...

ERROR:  Error installing mysql2:

ERROR: Failed to build gem native extension.

 

    current directory: /Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/ext/mysql2

/Users/hayashiyoshino/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20181106-52547-figklx.rb extconf.rb

checking for rb_absint_size()... yes

checking for rb_absint_singlebit_p()... yes

checking for rb_wait_for_single_fd()... yes

-----

Using mysql_config at /usr/local/bin/mysql_config

-----

checking for mysql.h... yes

checking for errmsg.h... yes

checking for SSL_MODE_DISABLED in mysql.h... yes

checking for SSL_MODE_PREFERRED in mysql.h... yes

checking for SSL_MODE_REQUIRED in mysql.h... yes

checking for SSL_MODE_VERIFY_CA in mysql.h... yes

checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes

checking for MYSQL.net.vio in mysql.h... yes

checking for MYSQL.net.pvio in mysql.h... no

checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes

checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes

checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes

checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes

checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes

checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes

checking for my_bool in mysql.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.21/lib

-----

creating Makefile

 

current directory: /Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/ext/mysql2

make "DESTDIR=" clean

 

current directory: /Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/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/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2 for inspection.

Results logged to /Users/hayashiyoshino/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/mysql2-0.5.2/gem_make.out

というエラーになりました。

 

 

 

助けてくれた人のアドバイス


mysql2のgemが入らなかった件、以下ログに従ってMakefileを消してあげた上で、

https://qiita.com/akito19/items/e1dc54f907987e688cc0

この記事の内容を実行したら治ります。

 

実際のコマンドは以下の通りです。

$ cd ~/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/mysql2-0.3.18/ext/mysql2
$ make clean
$ cd ~/(アプリのディレクトリ)
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install

参考記事

 

 

まとめと反省

■現象
- mysql2のgemのコンパイルに失敗する


■原因
- Mojaveのautoconfのバージョンが上がりすぎて(?)、LDFLAGSとCPPFLAGSの値が取れない(?)
- その結果、mysql2のgemのMakefileにLDFLAGSとCPPFLAGSの値が反映されないので、make(≒コンパイル等)に失敗してgem作成中にエラー終了する。


■対応方法
- 以下コマンド(5つ)を実行する

$ cd ~/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/mysql2-0.3.18/ext/mysql2
$ make clean
$ cd ~/(アプリのディレクトリ)
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install

 

 

 

 

通常はMakefileは生成されないのになぜ生成されてしまったのか、Makefileの中のどの記述がどう悪さをしていたのか、よく理解できていないので、勉強していこうと思います。。。!!