CentOSにRubyをcheckinstallでRPMにしてインストールする。
checkinstallでrubyをRPM化する方法はネットに結構情報があるので、それを参考にすればできるのですが、作ったRPMをいざインストールしようとしたときに
# rpm -ivh ruby-1.8.7-p357.i386.rpm エラー: 依存性の欠如: /usr/bin/ruby は ruby-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/ruby は ruby-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