読者です 読者をやめる 読者になる 読者になる

オープンソースこねこね

Webプログラミングなどについてあれこれ。

CentOSにRubyをcheckinstallでRPMにしてインストールする。

Ruby checkinstall

checkinstallrubyをRPM化する方法はネットに結構情報があるので、それを参考にすればできるのですが、作ったRPMをいざインストールしようとしたときに

# rpm -ivh ruby-1.8.7-p357.i386.rpm
エラー: 依存性の欠如:
/usr/bin/rubyruby-1.8.7-p357.i386 に必要とされています

のようなエラーがでて悩まされてました。これは

# rpm -ivh --nodeps ruby-1.8.7-p357.i386.rpm

とかで依存性を無視してインストールする方法はあるのですが、これだと依存性を解決できないのでローカルのyumリポジトリに置くこともできないですし、アンインストールしてもなぜか/usr/bin/rubyが残ってたりして、全然パッケージ管理されてなくね?ってな感じでもんもんとしてました。

でも、いろいろ調べたらなんとか解決できたっぽいのでその記録を残します。

まず前提としてcheckinstallをつかったrubyのRPM化の手順は

http://yktweb.sakura.ne.jp/blog/home-server/207.html
http://tejunsho.com/ruby/20110321000051.html
http://blog.flatlabs.net/20100415_202351/

などのサイトを参考にさせていただきました。

※(追記)checkinstallについて後日、別記事を書いたのでそちらも参照のこと

http://kohkimakimoto.hatenablog.com/entry/2012/04/15/140128

んでインストールでエラーに遭遇。

# rpm -ivh ruby-1.8.7-p357.i386.rpm
エラー: 依存性の欠如:
/usr/bin/rubyruby-1.8.7-p357.i386 に必要とされています

パッケージの情報を調べてみる。

# rpm2cpio ruby-1.8.7-p357.i386.rpm | cpio --list
./usr
./usr/bin
./usr/bin/erb
./usr/bin/irb
./usr/bin/rdoc
./usr/bin/ri
./usr/bin/testrb
./usr/doc
./usr/doc/ruby
./usr/doc/ruby/COPYING
./usr/doc/ruby/COPYING.ja
./usr/doc/ruby/ChangeLog
./usr/doc/ruby/GPL
./usr/doc/ruby/NEWS
./usr/doc/ruby/README
./usr/doc/ruby/README.EXT
./usr/doc/ruby/README.EXT.ja
./usr/doc/ruby/README.ja
./usr/doc/ruby/doc
./usr/doc/ruby/doc/ChangeLog-1.8.0
./usr/doc/ruby/doc/NEWS-1.8.0
./usr/doc/ruby/doc/forwardable.rd
./usr/doc/ruby/doc/forwardable.rd.ja
./usr/doc/ruby/doc/irb
./usr/doc/ruby/doc/irb/irb-tools.rd.ja
./usr/doc/ruby/doc/irb/irb.rd
./usr/doc/ruby/doc/irb/irb.rd.ja
./usr/doc/ruby/doc/shell.rd
./usr/doc/ruby/doc/shell.rd.ja
./usr/lib
./usr/lib/ruby
./usr/lib/ruby/1.8
./usr/lib/ruby/1.8/thread.rb
3486 blocks

お? /usr/bin/rubyがなくね?

でもcheckinstallを実行したときに/usr/bin/rubyもインストールはされているのだ。/usr/bin/rubyがインストールされていてもパッケージ管理されていないのがエラーの原因っぽいと推測。ちなみにyumでインストールしたruby1.8.5のrpmを調べると/usr/bin/rubyがちゃんとある。

RPMについて調べると、管理するファイルの情報は.specファイルに設定を書くとのこと。checkinstallで.specファイルをカスタマイズする方法はないものか調査する。checkinstallのREADMEファイルを読むとREVIEW_SPECというパラメータをtrueにすればパッケージ作成前に.specファイルを編集できるらしい。

checkinstallの起動コマンドはシェルスクリプトなのでこの中を読んでみたりもすると以下のように--review-specオプションつきでcheckinstallを起動すればよいことがわかった。

# checkinstall --fstrans=no --review-spec

このコマンドを実行すると実行途中で.specファイル編集画面に切り替わるので

Summary:   Package created with checkinstall 1.6.2
Name:      ruby
Version:   1.8.7
Release:   p357
License: GPL
Packager:  checkinstall-1.6.2
Group:     Applications/System
BuildRoot: /var/tmp/tmp.GWEdXG1817/package
Provides:  ruby-1.8.7
Requires:  ,/bin/sh

%description
Package created with checkinstall 1.6.2

%files
%dir "//usr/"
%dir "//usr/bin/"
"//usr/bin/ruby"   # ここを追加
"//usr/bin/irb"
"//usr/bin/erb"
....

のようにしてみる修正してみる。続行するが、エラー発生。

エラー: ファイルが見つかりません: /var/tmp/tmp.bqPnjt4646/package/usr/bin/ruby
伸張ファイルの検査中: /usr/lib/rpm/check-files /var/tmp/tmp.bqPnjt4646/package

RPM ビルドエラー:
  ファイルが見つかりません: /var/tmp/tmp.bqPnjt4646/package/usr/bin/ruby

./usr/bin/rubyがない? おお確かに。make済みのrubyソースディレクトリをみると、トップの階層にrubyのバイナリファイルがある。これをbinの階層にコピーしてしまおう。

# cd /var/tmp/ruby-1.8.7-p357
# cp -p ./ruby ./bin/

も一回トライ。

# checkinstall --fstrans=no --review-spec

エラーなく突破する! パッケージの内容を確認してみる。

# rpm2cpio /usr/src/redhat/RPMS/i386/ruby-1.8.7-p357.i386.rpm | cpio --list

./usr/bin/rubyがちゃんとありました。続けてインストール~。

# rpm -ivh /usr/src/redhat/RPMS/i386/ruby-1.8.7-p357.i386.rpm
準備中...                ########################################### [100%]
  1:ruby                   ########################################### [100%]

無事イケました。アンインストールもしてみる。

# rpm -e ruby
# which ruby
/usr/bin/which: no ruby in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

ちゃんとアンインストールされている。よかった~。

※追記。
--install=noをつければcheckinstall実行時にインストールしないので、yumやrpmコマンドで改めてインストールしたい場合はこれをつけたほうが良さげ。

# checkinstall --fstrans=no --review-spec --install=no