OSをEI Captainにアップデートした後、久々にrubyを使おうと思ってパッケージインストールしようとしたらNative extensionのエラーが大量に出て、bundle installがコケました。

bash
1
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)を見に行くようですが…

bash
1
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の場所は

bash
1
2
$ which gcc
/usr/local/bin/gcc

またgcc 4.9系の場所は

bash
1
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をインストールしてからそのシンボリックリンクを貼り直しておきました。

bash
1
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系)をインストールしたものをシンボリックリンクとして貼り換えました。

bash
1
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でハマった