bundle install
でmysql2をインストールしようとしたらエラーになったので解決策のメモ。
後にこの問題に関する記事はたくさん見つけられたのだが、自分なりに色々と調べたのでメモしておく。
各種バージョン
macOS Mojave 10.14.6
Ruby 2.6.2
bundler 1.17.2
はじめに結論
下記のいずれかを実行を実行した後にbundle install
で解決。
macOSが新しい場合(macOS Mojave 10.14.6
で確認)は下記実行。
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
macOSのバージョンが古い場合はこっちでいけるらしい。
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
違いは、--with-cppflags
の有無。
下記Stack Overflowのコメントに、OSのバージョンが新しいと--with-cppflags
が適用できないと指摘している。
--with-cppflags appears to break on latest OSX. I believe it can be omitted.bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
実際、手元のmacで--with-cppflags
を指定すると、エラー出力先であるmkmf.logにサポートされないオプションである旨が表示される。
clang: error: unsupported option '--with-cppflags=-I/usr/local/opt/openssl/include'
プロジェクト毎にオプションを指定するのが面倒な時
上記解決方法は両方とも--local
オプションを指定している。これは現在のプロジェクトの.bundle/config
の設定を更新するものだ。
--local
オプションを--global
に変更する、もしくは削除する(bundle install
のデフォルトは--global
)ことで~/.bundle/config
(ユーザ単位でのBundler設定)に設定を書くことができ、プロジェクト毎にオプションを設定しなくて済むようになる。
その他解決方法
ここに書いてある解決方法でも無事インストールすることができた。
bundle config --global build.mysql2 --with-opt-dir="$(brew --prefix openssl)"
なぜインストールに失敗したか
そもそもなぜオプションを指定しないとインストールできなかったのか?
エラーが出た時、「前はBundlerの設定をしなくてもインストールできてたけど?」というのが最初に思ったことだった。
まず、はじめにインストールに失敗した時にコンソールに下記エラーが表示された。
ld: library not found for -lssl
lsslはGCCのopensslにへのリンクオプションらしい。それが見つからないと言っている...
Homebrewでopensslのインストール既には完了していたので、brew info openssl
を実行してみると出力結果に下記記述が、
openssl is keg-only, which means it was not symlinked into /usr/local,
because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.
つまり、opensslが/usr/localにリンクされてないため、bundle install
実行時に--with-ldflags
でopensslのライブラリの場所を指定してあげなくてはいけなかったわけだ。
さらに調べてみると、High SierraからデフォルトのOpenSSLがOpenSSLからLibreSSLに変更されたようだ。
ターミナルで見てみると実際LibreSSLを使っていることがわかる。
$ openssl version
LibreSSL 2.6.5
つまり、Mojaveにアップデートする前は自分でリンクすることなく問題くOpenSSLを使用できていたのだが、アップデート後にbundle install
を実行したタイミングでLibreSSLがデフォルトになり、正しくOpenSSLにリンクできなくなっていたようだ。
(High Sierraは使ってなかったのでMojaveに上げた時に問題が起こった)