«前の日記(2010-12-04) 最新 次の日記(2010-12-20)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2010-12-10 ruby19-iconv

lang/ruby19 と converters/ruby-iconv の関係

FreeBSDでTwiProwlなどのruby1.9を必要とするソフトウェアを実行しようとすると、以下のようなエラーが出る場合があります。

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
iconv (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from /usr/local/lib/ruby/1.9/json/common.rb:2:in `<top (required)>'
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from /usr/local/lib/ruby/1.9/json.rb:1:in `<top (required)>'
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from twiprowl:16:in `<main>'

見ての通りiconvのロードに失敗しているだけなので、本来はportsからconverters/ruby-iconvをインストールすればOKなはずです。しかし、単に

cd /usr/ports/converters/ruby-iconv && make install

としたのでは下記のようにruby1.8用のものがインストールされてしまいます。

$ sudo make install
===>  License check disabled, port has not defined LICENSE
===>  Extracting for ruby18-iconv-1.8.7.302,1
===>   ruby18-iconv-1.8.7.302,1 depends on file: /usr/local/bin/ruby18 - found
/bin/mkdir -p /usr/ports/converters/ruby-iconv/work
/bin/ln -sf /usr/ports/lang/ruby18/work/iconv /usr/ports/converters/ruby-iconv/work/
===>  Patching for ruby18-iconv-1.8.7.302,1

直接extconfなどを実行してruby1.9用のiconvをインストールしている記事もありますが、これは正攻法ではありません。RUBY_DEFAULT_VER環境変数をセットして以下のようにビルドするのが正解です。

cd /usr/ports/converters/ruby-iconv && make RUBY_DEFAULT_VER=1.9 install

とするとruby1.8用のiconvとruby1.9用のiconvを別々のパッケージとして共存させてインストールすることが可能です。

$ pkg_info| grep iconv | grep ruby
ruby18-iconv-1.8.7.302,1 An iconv wrapper class for Ruby
ruby19-iconv-1.9.2.0,1 An iconv wrapper class for Ruby

どうしてこうなるのかの秘密は、ruby-iconvのMakefileと8-12行目あたりと、/usr/ports/Mk/bsd.ruby.mkの139-142行目にあります。

これは他の多くの ruby-* というportに対しても有効です。