ユカシカド エンジニアブログ

体の栄養状態を把握する検査サービス VitaNoteを開発するエンジニアのブログ

FreeBSD9.1-R で gem install websocket-rails がエラーになる件

(また)FreeBSD固有の問題か?

macでは問題なかったが、

$ uname -a
FreeBSD www.yukashikado.co.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec  4 09:23:10 UTC 2012     root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

運用中のFreeBSDでは

$ gem install websocket-rails

で以下のエラー。

Building native extensions.  This could take a while...
ERROR:  Error installing websocket-rails:
        ERROR: Failed to build gem native extension.

    /home/*username*/.rbenv/versions/2.0.0-p0/bin/ruby extconf.rb
"Makefile", line 32: Missing dependency operator
"Makefile", line 36: Need an operator
"Makefile", line 37: Missing dependency operator
"Makefile", line 42: Need an operator
"Makefile", line 70: Need an operator
"Makefile", line 74: Need an operator
"Makefile", line 76: warning: duplicate script for target "hiredis-example-ae" ignored
"Makefile", line 77: Need an operator
"Makefile", line 113: Missing dependency operator
"Makefile", line 115: Need an operator
make: fatal errors encountered -- cannot continue
creating Makefile

make
compiling connection.c
connection.c: In function '__wait_readable':
connection.c:88: warning: 'rb_thread_select' is deprecated (declared at /home/*username*/.rbenv/versions/2.0.0-p0/include/ruby-2.0.0/ruby/intern.h:407)
connection.c: In function '__wait_writable':
connection.c:112: warning: 'rb_thread_select' is deprecated (declared at /home/*username*/.rbenv/versions/2.0.0-p0/include/ruby-2.0.0/ruby/intern.h:407)
connection.c: In function 'connection_generic_connect':
connection.c:161: warning: ISO C90 forbids mixed declarations and code
connection.c:172: warning: ISO C90 forbids mixed declarations and code
connection.c: In function 'connection_read':
connection.c:411: warning: 'reply' may be used uninitialized in this function
compiling hiredis_ext.c
compiling reader.c
reader.c: In function 'reader_gets':
reader.c:91: warning: dereferencing type-punned pointer will break strict-aliasing rules
linking shared-object hiredis/ext/hiredis_ext.so
gcc: /usr/home/*username*/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/hiredis-0.4.5/vendor/hiredis/libhiredis.a: No such file or directory
*** [hiredis_ext.so] Error code 1

Stop in /usr/home/*username*/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/hiredis-0.4.5/ext/hiredis_ext.


Gem files will remain installed in /home/*username*/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/hiredis-0.4.5 for inspection.
Results logged to /home/*username*/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/hiredis-0.4.5/ext/hiredis_ext/gem_make.out

RedisクライアントであるhiredisRubyラッパー?hiredis-rbのgemのインストールで失敗している模様。 一見、gmakeじゃなくて、makeだからじゃないのかと思って、 make=/usr/local/bin/gmake を指定してもエラー内容が微妙に変わっただけだった。

原因?

Issuesを眺めていたら、違う内容だが近い環境でエラーが発生していて、それの解決になるフォームされたリポジトリがあった。

kiela / hiredis-rb

これが原因かも!

Determine different make utility for FreeBSD/Solaris

なぜか本体にマージされていないままだが、このリポジトリから手動ビルドしてみる。

解決!

$ git clone git://github.com/kiela/hiredis-rb.git
$ cd hiredis-rb
$ bundle install
$ gem build hiredis.gemspec
$ gem install hiredis-0.4.5.gem --local
Building native extensions.  This could take a while...
Successfully installed hiredis-0.4.5
Parsing documentation for hiredis-0.4.5
Installing ri documentation for hiredis-0.4.5
Done installing documentation for hiredis after 0 seconds

できた!念の為、

$ gem search hiredis --local
*** LOCAL GEMS ***
hiredis (0.4.5)

ということは、

$ gem install websocket-rails
  Welcome to WebsocketRails v0.4.3!

  There have been a few significant changes in the public
  API, so if you are upgrading please be sure to read the
  CHANGELOG located at:

  http://github.com/DanKnox/websocket-rails/CHANGELOG.md
Successfully installed websocket-rails-0.4.3
Parsing documentation for websocket-rails-0.4.3
Done installing documentation for websocket-rails after 1 seconds
1 gem installed

まとめ

もっとスマートな解決方法あるかもしれません。 FreeBSDに関する情報はLinuxに比べると少ないので、こういうことがあると根気を求められますが、今回はIssuesに挙げられていて本当によかった。
とはいえ、正直半日くらいハマってしまいました。