libv8とrubyracerについて

今日のyak shaving
とあるRailsプロジェクトを動かそうと bunlde install してみたところlivb8のinstall時にエラーとなりました。
OS はEl Capitanです。

エラー抜粋:

2 errors generated.
make[1]: *** [/Users/rochefort/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/libv8-3.16.14.13/vendor/v8/out/x64.release/obj.target/v8_base/src/accessors.o] Error 1
make: *** [x64.release] Error 2
/Users/rochefort/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/libv8-3.16.14.13/ext/libv8/location.rb:36:in `block in verify_installation!': libv8 did not install properly, expected binary v8 archive '/Users/rochefort/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/libv8-3.16.14.13/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_base.a'to exist, but it was not found (Libv8::Location::Vendor::ArchiveNotFound)
    from /Users/rochefort/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/libv8-3.16.14.13/ext/libv8/location.rb:35:in `each'
    from /Users/rochefort/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/libv8-3.16.14.13/ext/libv8/location.rb:35:in `verify_installation!'
    from /Users/rochefort/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/libv8-3.16.14.13/ext/libv8/location.rb:26:in `install!'
    from extconf.rb:7:in `<main>'

Yosemite以降、この手のやつに時々引っかかっては、小手先の対応(libv8を最新化など)で
なんとかうまくいっていましたが、今度はなかなかうまくいきません。
いろいろ調べてようやく理解した点がありましたので整理してみます。

問題点

libv8とtherubyracer入らない問題にわたしもハマったメモ - 青いの
とこちらを見ると便利な表とともに、OS, rubyracerとlibv8の依存関係が問題ということが言及されています。
しかし、こちらの表は既に古いです。

まずはgemを確認

therubyracer

$  gem list -ra '^therubyracer$'

*** REMOTE GEMS ***

therubyracer (0.12.2, 0.12.1, 0.12.0, 0.11.4, 0.11.3, 0.11.2, 0.11.1, 0.11.0, 0.10.2, 0.10.1, 0.10.0, 0.9.10, 0.9.9, 0.9.8, 0.9.7, 0.9.6, 0.9.5, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.2, 0.8.1, 0.8.0, 0.7.5, 0.7.4, 0.7.3, 0.7.2, 0.7.1, 0.7.0, 0.6.3, 0.6.2, 0.6.1, 0.6.0, 0.5.5, 0.5.4, 0.5.3, 0.5.2 ruby x86-darwin-10, 0.5.1 ruby x86-darwin-10 x86-darwin-9, 0.5.0 ruby x86-darwin-10 x86-darwin-9 x86-linux x86_64-linux, 0.4.9 ruby x86-darwin-10 x86-darwin-9 x86-linux x86_64-linux, 0.4.8 ruby x86-darwin-10 x86-darwin-9, 0.4.7 ruby x86-darwin-10 x86-darwin-9, 0.4.6, 0.4.5, 0.4.4, 0.4.3, 0.4.2, 0.4.1, 0.4.0)

かつては利用できるOSの指定があったようですが、最近のgemについては特に記載がありません。

libv8

$ gem list -ra '^libv8$'

*** REMOTE GEMS ***

libv8 (4.5.95.5 ruby amd64-freebsd-10 x86-linux x86_64-darwin-14 x86_64-linux, 4.5.95.4, 4.5.95.3, 4.5.95.2, 4.5.95.1 ruby x86_64-darwin-14, 4.5.95.0, 3.16.14.13 ruby x86-linux x86_64-darwin-14 x86_64-linux, 3.16.14.12, 3.16.14.11 ruby x86-linux x86_64-darwin-14 x86_64-darwin-15 x86_64-linux, 3.16.14.10, 3.16.14.8, 3.16.14.7 ruby amd64-freebsd-10 arm-linux x86_64-darwin-13 x86_64-darwin-14 x86_64-linux, 3.16.14.6, 3.16.14.5 ruby armv6l-linux x86_64-darwin-13, 3.16.14.4, 3.16.14.3 ruby amd64-freebsd-9 armv6l-linux x86_64-darwin-12 x86_64-darwin-13 x86_64-linux x86_64-solaris-2.11, 3.16.14.2, 3.16.14.1 ruby x86_64-darwin-10, 3.16.14.0, 3.11.8.17 ruby x86-linux x86_64-darwin-10 x86_64-darwin-12 x86_64-darwin-13 x86_64-linux, 3.11.8.16, 3.11.8.13 ruby amd64-freebsd-9 x86-linux x86_64-darwin-10 x86_64-darwin-11 x86_64-darwin-12 x86_64-linux, 3.11.8.12, 3.11.8.11 ruby x86_64-darwin-10, 3.11.8.10, 3.11.8.9 ruby x86_64-darwin-10, 3.11.8.8, 3.11.8.7, 3.11.8.4, 3.11.8.3 ruby x86-freebsd-9 x86_64-darwin-10 x86_64-darwin-12 x86_64-linux, 3.11.8.1, 3.11.8.0, 3.10.8.0 ruby x86_64-darwin-10, 3.3.10.4 ruby amd64-freebsd-8 amd64-freebsd-9 x86-darwin-10 x86-darwin-11 x86-linux x86_64-darwin-10 x86_64-darwin-11 x86_64-darwin-12 x86_64-linux, 3.3.10.2 ruby x86-darwin-10 x86-linux x86_64-darwin-10 x86_64-linux)

細かいversion指定がありそうです。

見やすくしてみます。

gem search -ra "^libv8$" | ruby -rpp -ne 'pp $_.match(/libv8 \((.+)\)/)[1].split(",")'
["4.5.95.5 ruby amd64-freebsd-10 x86-linux x86_64-darwin-14 x86_64-linux",
 " 4.5.95.4",
 " 4.5.95.3",
 " 4.5.95.2",
 " 4.5.95.1 ruby x86_64-darwin-14",
 " 4.5.95.0",
 " 3.16.14.13 ruby x86-linux x86_64-darwin-14 x86_64-linux",
 " 3.16.14.12",
 " 3.16.14.11 ruby x86-linux x86_64-darwin-14 x86_64-darwin-15 x86_64-linux",
 " 3.16.14.10",
 " 3.16.14.8",
 " 3.16.14.7 ruby amd64-freebsd-10 arm-linux x86_64-darwin-13 x86_64-darwin-14 x86_64-linux",
 " 3.16.14.6",
 " 3.16.14.5 ruby armv6l-linux x86_64-darwin-13",
 " 3.16.14.4",
 " 3.16.14.3 ruby amd64-freebsd-9 armv6l-linux x86_64-darwin-12 x86_64-darwin-13 x86_64-linux x86_64-solaris-2.11",
 " 3.16.14.2",
 " 3.16.14.1 ruby x86_64-darwin-10",
 " 3.16.14.0",
 " 3.11.8.17 ruby x86-linux x86_64-darwin-10 x86_64-darwin-12 x86_64-darwin-13 x86_64-linux",
 " 3.11.8.16",
 " 3.11.8.13 ruby amd64-freebsd-9 x86-linux x86_64-darwin-10 x86_64-darwin-11 x86_64-darwin-12 x86_64-linux",
 " 3.11.8.12",
 " 3.11.8.11 ruby x86_64-darwin-10",
 " 3.11.8.10",
 " 3.11.8.9 ruby x86_64-darwin-10",
 " 3.11.8.8",
 " 3.11.8.7",
 " 3.11.8.4",
 " 3.11.8.3 ruby x86-freebsd-9 x86_64-darwin-10 x86_64-darwin-12 x86_64-linux",
 " 3.11.8.1",
 " 3.11.8.0",
 " 3.10.8.0 ruby x86_64-darwin-10",
 " 3.3.10.4 ruby amd64-freebsd-8 amd64-freebsd-9 x86-darwin-10 x86-darwin-11 x86-linux x86_64-darwin-10 x86_64-darwin-11 x86_64-darwin-12 x86_64-linux",
 " 3.3.10.2 ruby x86-darwin-10 x86-linux x86_64-darwin-10 x86_64-linux"]

※追記: -d つければよかったことに気づいた。 と思ったけど、最新化はされていない?

$ gem list -rd '^therubyracer$'

*** REMOTE GEMS ***

therubyracer (0.12.2, 0.5.2, 0.5.1, 0.5.0)
    Platforms:
        0.5.0: x86-linux, x86_64-linux
        0.5.1: x86-darwin-9
        0.5.2: x86-darwin-10
        0.12.2: ruby
    Author: Charles Lowell
    Homepage: http://github.com/cowboyd/therubyracer

    Embed the V8 JavaScript interpreter into Ruby



$ gem list -rd '^libv8$'

*** REMOTE GEMS ***

libv8 (4.5.95.5, 3.16.14.11, 3.16.14.7, 3.16.14.5, 3.16.14.3, 3.16.14.1, 3.11.8.13, 3.11.8.3, 3.3.10.4)
    Platforms:
        3.3.10.4: amd64-freebsd-8, x86-darwin-10, x86-darwin-11
        3.11.8.3: x86-freebsd-9
        3.11.8.13: x86_64-darwin-11
        3.16.14.1: x86_64-darwin-10
        3.16.14.3: amd64-freebsd-9, x86_64-darwin-12, x86_64-solaris-2.11
        3.16.14.5: armv6l-linux
        3.16.14.7: arm-linux, x86_64-darwin-13
        3.16.14.11: x86_64-darwin-15
        4.5.95.5: amd64-freebsd-10, ruby, x86-linux, x86_64-darwin-14, x86_64-linux
    Author: Charles Lowell
    Homepage: http://github.com/cowboyd/libv8

    Distribution of the V8 JavaScript engine

まとめると

Mac OS Enalble Latest V8 Version 備考
Yosemite (darwin-14) 4.5.95.5 4系、3系ともに最新版に対応
El Capitan (darwin-15) 3.16.14.12 4系には未対応、3系最新版もそこそこ対応

ということになりそうです。

ではどうすれば良いか?

cowboyd/libv8: Ruby gem binary distribution of the V8 JavaScript engine
公式に記載がありました。

Using RubyGems:
    gem install libv8 -- --with-system-v8

Using Bundler (in your Gemfile):
    bundle config build.libv8 --with-system-v8

(bundle使用時にproject内の設定に留めたい場合は、--local をつけると良いです。)

まとめると

  1. 自分の環境にあったlibv8のversionを確認しInstallする。
  2. bundle configでsystemのlibv8 を利用するようにする。
    bundle config build.libv8 --with-system-v8

です。