Ruby
IRuby

rbczmq の幾つかのインストール方法

More than 1 year has passed since last update.

IRuby を使おうとすると rbczmq の中で SEGV が発生してしまう場合は、zeromq と czmq の組み合わせが悪い可能性がある。rbczmq が正しく動くインストールのパターンを以下に紹介するので、一番好ましいものを試してみると良い。

rbczmq は gem パッケージの中に zeromq と czmq を同梱しているが、後述する事情により同梱ライブラリを使わない方法を先に紹介する。

(1) homebrew や apt-get でインストールしたシステムの zeromq, czmq を使う

この方法は、ディストリビューションで用意されている zeromq や czmq を確実に使うので、最もオススメしたい方法である。やり方は、まずシステムに zeromq と czmq を 両方とも インストールする。次に、以下のコマンドで rbczmq をインストールする。

$ gem install rbczmq -- --with-system-libs

このオプションを指定することで、rbczmq に付属している zeromq と czmq をビルドせず、参照もしなくなる。

正しくインストールできた場合、otool -L でライブラリの依存関係を確認すると、きちんとシステムの zeromq, czmq を見ていることがわかる。

$ otool -L ~/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rbczmq-1.7.9/lib/rbczmq_ext.bundle | grep zmq
/Users/mrkn/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rbczmq-1.7.9/lib/rbczmq_ext.bundle:
    /opt/brew/opt/czmq/lib/libczmq.3.dylib (compatibility version 4.0.0, current version 4.0.0)
    /opt/brew/opt/zeromq/lib/libzmq.5.dylib (compatibility version 6.0.0, current version 6.1.0)

注意していただきたい点は、zeromq だけシステムにインストールする と、rbczmq 内で SEGV が発生する可能性があることだ。

私は、次のようなトラブルを経験した。あるとき zeromq だけを brew install した状態で rbczmq がきちんと動いていた。その後、brew update で zeromq のバージョンが上がった際に rbczmq がリンクしていた libzmq が消えたため、gem pristine したところ rbczmq 内で SEGV が発生するようになった。この原因は、システムにインストールされている zeromq と、rbcmzq に付属している czmq の間に互換性がなかったことではないかと推測している。

このようなトラブルを経験したが、この方法は、どんな事情の人でも zeromq と czmq の正しい組み合わせをシステムにインストールしておけば rbczmq が確実に動く方法である。

ただし、私は Windows を所持していないので、Windows 環境でこの方法で上手くいくかどうかは確認できていない。

(2) rbczmq に付属の zeromq と czmq を確実に使う

IRuby 自体を開発している人でない限り、zeromq のバージョンなんてどうでも良いはず。だから、IRuby を安定して使いたいだけなら、rbczmq に付属の zeromq, czmq を使うのが最もトラブルを避けられるはずである。

以下のコマンドで rbczmq をインストールすると、付属の zeromq と czmq をビルドし、それらを参照するためのオプションをコンパイラとリンカに指定してくれる。

$ gem install rbczmq

しかし、私の環境では rbczmq に付属の zeromq と czmq は使われなかった。この原因は、私が ruby をインストールする際に --with-opt-dir=$(brew --prefix) を指定しているからだと推測している。extconf.rb で生成される Makefile を確認すると、rbczmq に付属の zeromq と czmq よりも先に homebrew の中を探しに行くオプションがコンパイラとリンカに指定されていたからだ (issue にしておいた)。

Windows の場合は、このような問題が起きるらしい (Windows を所有していないので私は確認していない)。

よって、この方法は現在のところ、システムに zeromq と czmq をインストールしない人に限ってお勧めできる方法である。

jupyter が使う pyzmq は、pip install で配布されるビルド済みパッケージの中に zeromq のビルド済みライブラリを同梱していて、システムにインストールされているものは参照しない。そのため、zeromq を jupyter でしか使わない人は、思い切ってシステムに zeromq と czmq をインストールしない、という選択もありだと思う。