El Capitan から openssl のヘッダファイルが削除されました。ヽ(`Д´)ノプンプン
Homebrew をお使いの方は、eventmachine や puma をインストールしよう
とすると、こんなエラーが発生すると思います。(発生しない方は、すで
に後述のコマンドを実行しているのだと思います。)
make "DESTDIR=" clean
make "DESTDIR="
compiling binder.cpp
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
^
1 error generated.
make: *** [binder.o] Error 1
make failed, exit code 2
対策方法
このコマンドを実行するだけです。
$ brew link openssl --force
/usr/local/include や /usr/local/lib に openssl へのシンボリックリ
ンクが作られ、gem install 可能になります。
Homebrew の openssl がリンクされていますね!
$ otool -L ~/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/eventmachine-1.0.8/ext/rubyeventmachine.bundle
/Users/masutaka/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/eventmachine-1.0.8/ext/rubyeventmachine.bundle:
/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
openssl の Formula は keg_only なので
、インストールしただけではシ
ンボリックリンクが作られないようです。
keg_only の説明は公式のマニュアルにありました。
How to build software outside Homebrew with Homebrew keg-only dependencies. - Homebrew/homebrew
That’s because Homebrew keeps it locked away in its prefix,
accessible only via its opt directory. keg_only = Not symlinked
into the $PATH by default.
ネット上には他のやり方もありましたが、面倒だったり間違っていたりし
たので、ここにまとめておきます。
–with-opt-dir を指定する方法
Need to specify --with-opt-dir
on OSX 10.11 El Capitan. · Issue #718 · puma/puma
間違ってはいませんが、gem install のたびに指定する必要があり面倒だと思います。
$ gem install eventmachine -- --with-opt-dir=$(brew --prefix openssl)
rbenv-default-gems plugin [2014-10-28-1]
にはこのオプションを渡せ
ないので、手動で gem install することになります。
bundle install の時は ~/.bundle/config に以下を追加します。これも
gem ごとに追加する必要があります。
BUNDLE_BUILD__EVENTMACHINE: "--with-opt-dir=/usr/local/opt/openssl"
–with-cppflags を指定する方法
ruby - gem eventmachine fatal error: ‘openssl/ssl.h’ file not found - Stack Overflow
このオプションだけだと、
・ヘッダファイルは Homebrew の openssl を参照し、
・ライブラリはシステムの openssl とリンクしてしまいます。
–with-ldflags=-L$(brew –prefix openssl)/lib も指定しないと、
おかしなことになると思います。
追記(2017-01-26):
現在の Homebrew は brew link 出来なくなっていました。
$ brew link openssl --force
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
仕方がないので、bundle config で回避します。
$ bundle config build.puma --with-opt-dir=/usr/local/opt/openssl