OSXアップデート後にbundle installが失敗する時の対処方法
OSをEI Captainにアップデートした後、久々にrubyを使おうと思ってパッケージインストールしようとしたらNative extensionのエラーが大量に出て、bundle install
がコケました。
1 | Installing eventmachine 1.0.8 with native extensions |
eventmachineだけでなく、native extensionsを使うパッケージは全て失敗するみたいです。stdio.h
が無いとかどうのこうと言ってきます(^ ^;)今回はその件についての対策方法を、備忘録としてメモしたいと思います。
目次
photo by Mr. Alex Garcia - Double Cliche on flickr
原因:gccが不明か、バージョンが古い
結論から先に説明すると、Native extensionのコンパイルを行う際に使うgccが不明か、古いバージョンに差し変わった事が原因でした(どっちだったかは対処した後で確認そびれたw)。とりあえずgccのバージョンがOSXのアップデートの時に古い物へ差し変わってしまうケースも踏まえて、対処法を説明をしていきたいと思います。まずはgccのバージョンを確認していきます。bundle installでは現時点でgcc 4.9系(gcc-4.9)を見に行くようですが…
1 | $ gcc --version |
gccのバージョンは4.2.1。xcodeのコマンドラインツール内のgccを見にいってることが分かります。xcodeのコマンドラインツールを最新にしても、使用されるgccのバージョンは少し古い4.2系のようです。gccの場所は
1 | $ which gcc |
またgcc 4.9系の場所は
1 | $ which 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をインストールしてからそのシンボリックリンクを貼り直しておきました。
1 | $ brew install gcc49 |
gcc 4.9系は/usr/local/Cellar/gcc49/4.9.3/bin/
にインストールされたので、シンボリックシンクを貼り直します。またgcc(/usr/local/bin/gcc
)は最新のgcc(現時点で5.3系)をインストールしたものをシンボリックリンクとして貼り換えました。
1 | $ ln -s /usr/local/Cellar/gcc49/4.9.3/bin/gcc-4.9 /usr/local/bin/gcc-4.9 |
これでbundle installが上手くいきました!それにしてもOSXをアップデートするたびに、この辺りを手直しするのって面倒ですよね。OSアップデート恐怖症だぁ。なんとかなりませんかね…これ。
参考にさせていただいた記事
xcodeコマンドラインツールのインストール方法について。これだけでbundle installが上手くいく場合もあるようです。
Easy ramble
El Capitanでgemのnative extensionビルド失敗に対応
OSX Yosemiteへのアップデートでbundle installできなくなった際、gccのシムリンクを貼り直して上手くいったケース。
アラのアラアラしい日記
gccとかlibv8とかtherubyracerとかのinstallでハマった