Mac OS X 10.9 Mavericks 以降だと、libv8 と therubyracer の gem がインストールできないじゃないですか。毎回遭遇するけど、毎回苦しんでいます。

キモは、libv8、therubyracer、OS のバージョンの整合性。あとは定番のオプションを付けること。

http://inoao.hatenablog.com/entry/2014/03/27/183523 に、超便利な表がありました。が、Yosemite が載っていないので、最新版はこうなります。Yosemite = darwin-14 の値は、自分で試してうまくいった組み合わせです。

CPU OS OS Version libv8 therubyracer
amd64 freebsd 8 3.3.10.4 0.10.2
9
x86 darwin 10
11
linux
freebsd 9 3.11.8.3 0.11.0
x86_64 darwin 10
11 3.3.10.4 0.10.2
12 3.11.8.3 0.11.0
13 3.16.14.3 0.12.1
14 3.16.14.7
linux 3.11.8.3 0.11.0

手順としては、まず、自分の OS のバージョンを調べます。

$ ruby -rubygems -e 'puts Gem::Platform.new(RUBY_PLATFORM)' x86_64-darwin-14

OS X 10.10 Yosemite の場合、darwin-14 になりました。普通に bundle install すると、以下のように失敗します。

$ bundle install --path vendor/bundle

…(略)…

Installing kaminari 0.16.1

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

/Users/takah/.rbenv/versions/2.0.0-p353/bin/ruby extconf.rb --without-system-v8

…(略)…

An error occurred while installing libv8 (3.16.14.3), and Bundler cannot continue. Make sure that `gem install libv8 -v '3.16.14.3'` succeeds before bundling. </code>

なので、上記の表を見て、Gemfile と Gemfile.lock のバージョンが合うように修正します。

さらに、ビルドオプションも付けてやります。gem コマンドでインストールするだけなら、以下のように – で区切ってオプションを渡すことができます。

$ gem install libv8 -v '3.16.14.7' -- --with-system-v8

bundle install でインストールする場合、コマンドラインで直接オプションを指定できないので bundle config コマンドを使います。

$ bundle config build.libv8 --with-system-v8 $ bundle config build.therubyracer --with-v8-dir

このコンフィグオプションは build_info に保存されます。

$ cat vendor/bundle/ruby/2.0.0/build_info/libv8-3.16.14.3.info --with-system-v8

さて、これで bundle install してみましょう。

$ bundle install

一旦 bundle install –path vendor/bundle すると、オプションが .bundle/config に保存されて、次回以降は –path オプション無しでも同じ動作をしてくれます。

うまく行きました! I’m so happy!