UbuntuにRuby 1.9.1を入れてみた

Ruby 1.8.6は消してRuby 1.9.1に移行することにした。「sudo apttitude remove ruby」とか、そんなコマンドを叩く日が来るとは。

Rubyを消そうとすると日本語インクリメンタルサーチmigemoRubyに依存しているので、一緒に消えてしまうことが分かった。まあ一旦Rubyパッケージを消してから自分でforce installみたいなことをやればいいんだろうと思ったけど、もっといいのはちゃんとDebian流儀にしたがうことかなと思って、自分でdebパッケージを作ってみようと思った。で、「10分で作れるDebianパッケージ」というのを読んでみた。まあ10分なんて嘘だということが10分ほどで分かった。

Ruby 1.9.1-p0自体は手元でmakeしていたけど、さすがにシステムにインストールするのってちょっとイヤだなと思ってそのままにしていた。でも考えてみれば、たとえRubyが動かなくなっても毎日ご飯を食べて寝るのには困らない。目をつぶってmake installしてみた。

こういうのって自分でやると本当にいろいろ勉強になるもので、Ubuntuというか、Unixのお守りの基本を少し理解した気がした。もう長らく「最新バージョンを自分でmakeして使いたい気持ち<<それに伴う苦労」ということでdebパッケージになっていないソフトウェアを使う気がしなかったけど、Ruby 1.9.1でついにそのバランスが変わった。

まずふつうに./configure; make; sudo make installした。うまく行ってるように見えたけど、gemがヘンというのにすぐ気づいた。

$ gem update
/usr/lib/ruby/1.9.1/rubygems/spec_fetcher.rb:1:in `require': no such file to load -- zlib (LoadError)
:
:

とかエラーが出る。zlibが入ってないなんてことないだろうと思ってググると、どうやら拡張ライブラリがちゃんとコンパイルできてないことが問題だということが分かった。ext/zlibをmakeするには、zlibのヘッダ関連のファイルが必要。

$ sudo apt-get install zlib1g-dev 
:
$ cd ext/zlib
$ ruby extconf.rb
checking for deflateReset() in -lz... yes
checking for zlib.h... yes
checking for kind of operating sys
$ make; sudo make install

同様に、readlineとかncurses、libssl(OpenSSL)あたりのヘッダファイルも必要らしい。単体のrubyコマンドは動いていたけど、実は拡張ライブラリはいろいろコンパイルできてなかったらしい。

sudo apt-get install libreadline5 libreadline5-dev 
sudo apt-get install libncurses5 libncurses5-dev  
sudo apt-get install libssl-dev

とかやる必要がある。readlineがないとirbがコケる。結局のところ、

$ ./configure --prefix=/usr --enable-pthread --with-readline-dir=/lib
:
:
$ make; make install

とした。インストール先を/usr/localではなく、/usrにしてしまったのは間違いだったと後で気づいた。

別にシステム上にRubyに依存しているものなんてmigemoぐらいしかないし、それは後から自分で何とかすればいいやと思ったので、/usr/localとか半端なトコに入れることもないと考えた。ところが、あれこれmakeをやり直しているうちにハマってしまった。

readline-devを入れてmakeしなおしても、なぜかirbで同じエラーが出つづける。ちゃんとreadline.soもできてるし、make install後は、しかるべきディレクトリにコピーされている。おかしいな、意味が分からんぞと思って環境変数のPATHを見てみたら、/usr/local/binって、/usr/binよりも先にあるじゃないか。ここで、ようやく、標準パッケージはそのまま残しておいて、/usr/local/以下に入れる意味を理解した。つまり、「--prefix=/usr/local」にしないといけなかったのだ。あるいは指定しなければ、たぶんそうなる。/usr/localって、そういう風に使うのか……。

ともあれ、以下のようにirbRubyも動いた。

$ ruby -v
ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-linux]
$ irb
irb(main):001:0> RUBY_VERSION
=> "1.9.1"
irb(main):002:0> RUBY_PLATFORM
=> "i686-linux"

ついにで、irb環境で補完やハイライト表示をしてくれるWirbleというライブラリをgemで入れてみた。それで驚いたのは、Wirbleが1.9対応してないこと。1.8から1.9になって「when :」が許されなくなって「when then」と書く必要がある。そんなことにすら対応していない。うーむ。

で、ググったりGitHubを見てみたら、当然のようにパッチもあるし、かすかに進化したバージョンもある。で、どうやらgemではGitHub上のレポジトリを指定してライブラリのインストールができるらしい。また時間のあるときにやってみよう。