15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

macでmysql2がbundle installできない時

Posted at

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に上げた時に問題が起こった)

15
14
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
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?