OSをEI Captainにアップデートした後、久々にrubyを使おうと思ってパッケージインストールしようとしたらNative extensionのエラーが大量に出て、bundle install
がコケました。
bash1 2 3 4
| Installing eventmachine 1.0.8 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. ...
|
eventmachineだけでなく、native extensionsを使うパッケージは全て失敗するみたいです。stdio.h
が無いとかどうのこうと言ってきます(^ ^;)今回はその件についての対策方法を、備忘録としてメモしたいと思います。
目次
原因:gccが不明か、バージョンが古い
結論から先に説明すると、Native extensionのコンパイルを行う際に使うgccが不明か、古いバージョンに差し変わった事が原因でした(どっちだったかは対処した後で確認そびれたw)。とりあえずgccのバージョンがOSXのアップデートの時に古い物へ差し変わってしまうケースも踏まえて、対処法を説明をしていきたいと思います。まずはgccのバージョンを確認していきます。bundle installでは現時点でgcc 4.9系(gcc-4.9)を見に行くようですが…
bash1 2 3 4 5
| $ gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 7.0.2 (clang-700.1.81) Target: x86_64-apple-darwin15.2.0 Thread model: posix
|
gccのバージョンは4.2.1。xcodeのコマンドラインツール内のgccを見にいってることが分かります。xcodeのコマンドラインツールを最新にしても、使用されるgccのバージョンは少し古い4.2系のようです。gccの場所は
bash1 2
| $ which gcc /usr/local/bin/gcc
|
またgcc 4.9系の場所は
bash1 2
| $ which gcc-4.9 /usr/local/bin/gcc-4.9
|
ということが分かりました。finderで確認したところ、/usr/local/bin/gcc
の実体は4.2系を参照しているxcode内を示すシンボリックリンクでした。また、rubygemsが使うnative extentionが見にくはずの4.9系はリンク先不明でした(えw)。
対処:gccを入れ直す
ということで、gcc 4.9系をHomebrewでインストールした後、/usr/local/bin/gcc-4.9
のシンボリックシンクを貼り直します。またついでに/usr/local/bin/gcc
は最新のgccをインストールしてからそのシンボリックリンクを貼り直しておきました。
bash1 2
| $ brew install gcc49 $ brew install gcc
|
gcc 4.9系は/usr/local/Cellar/gcc49/4.9.3/bin/
にインストールされたので、シンボリックシンクを貼り直します。またgcc(/usr/local/bin/gcc
)は最新のgcc(現時点で5.3系)をインストールしたものをシンボリックリンクとして貼り換えました。
bash1 2 3 4
| $ ln -s /usr/local/Cellar/gcc49/4.9.3/bin/gcc-4.9 /usr/local/bin/gcc-4.9 $ ln -s /usr/local/Cellar/gcc49/4.9.3/bin/g++-4.9 /usr/local/bin/g++-4.9 $ ln -s /usr/local/Cellar/gcc/5.3.0/bin/gcc-5 /usr/local/bin/gcc $ ln -s /usr/local/Cellar/gcc/5.3.0/bin/g++-5 /usr/local/bin/g++
|
これでbundle installが上手くいきました!それにしてもOSXをアップデートするたびに、この辺りを手直しするのって面倒ですよね。OSアップデート恐怖症だぁ。なんとかなりませんかね…これ。
参考にさせていただいた記事
xcodeコマンドラインツールのインストール方法について。これだけでbundle installが上手くいく場合もあるようです。
Easy ramble
El Capitanでgemのnative extensionビルド失敗に対応
OSX Yosemiteへのアップデートでbundle installできなくなった際、gccのシムリンクを貼り直して上手くいったケース。
アラのアラアラしい日記
gccとかlibv8とかtherubyracerとかのinstallでハマった