空の RPM パッケージで依存関係の問題を解決する (1)

CentOS を使っていてちょっと困るのは、パッケージの少なさと古さだ。安定性が売りなのだから仕方がないが、欲しいパッケージやバージョンが Fedora にあると、「安定性」とやらを多少犠牲にしても手を出さずにはいられない*1
もちろん、取ってくるのは SRPM で、rpmbuild --rebuild してインストールする。別のディストロのバイナリ RPM をブチ込むなんていう恐ろしいことはゴメンだ*2。大概、rpmbuild --rebuild は問題なく完了する。別に何をしたわけでもないのにターミナルに流れる大量のメッセージが“ビルドしたぜ!!”という意味不明な満足感と達成感を与えてくれる一種の魔境で、疲れたときの気分転換などによい。
だがしかし、ここに1つの罠がある。BuildRequires されているパッケージが CentOS には存在しないことがあるのだ。
パッケージがない、というのにも2つのパターンがある。1つは、当該のパッケージが“本当に”ない場合だ。これは大した問題ではない。そのパッケージの SRPMFedora から取ってきて rpmbuild --rebuild すればいいだけの話だ。そこでもまた BuildRequires が見つからないかもしれないが、再帰すればいい。
困るのは、「ちょっとパッケージ構成見直しちゃったよ」系の“見つからない”だ。ありがちなのは、ライブラリの -devel を別パッケージに分けたよ、というやつ。たとえば、CentOS 5 では popt という1つのパッケージなのが Fedora 9 では poptpopt-devel に分けられている。この場合、「Fedora 9 の SRPMpopt-develBuildRequires するが、そんなパッケージは CentOS 5 には存在しない」という事態に陥る。
このパターンだと、Fedora 9 から popt-devel を持ってくるわけにはいかない。この popt-devel は、CentOS 5 の popt とは競合する。popt の方も Fedora 9 のものに置き換えるという手もあるが、別に popt の最新版が使いたいわけではないのだから、“安定性”が期待できる CentOS のパッケージを使い続けたい。
「ビルドしようとしている SRPM の SPEC ファイルを書き直す」というのは、正攻法ではあるが面倒くさい。特に、popt-devel のように多くのパッケージから BuildRequires されているパッケージの場合、大量の依存元に個別対処していくのは精神衛生上よろしくない。
では、どうすればいいのか。答えは簡単で、popt-devel という名前の空の RPM を作ってインストールすればいい。必要なファイルは全部インストール済みで、足りないのは popt-devel という名前だけなのだから。「うちの poptpopt-develProvides してるんですよ、実は。」という表明だと捉えることもできる((「じゃあ、CentOS 5 の poptSRPM を取ってきて、SPEC に Provides popt-devel って書いて rpmbuild -bb すればいいじゃん」と思われるかもしれない。確かにそうですね。今これを書いていて気付きました……。))。

というわけで、漸く本題で「空の RPM パッケージの作り方」なわけですが、今日はもう疲れたので明日にします。ごめんなさい。

*1:後で悔しい思いをしないよう、EPEL と RPMforge はチェックしておく。

*2:どうせ、ライブラリバージョンへの依存関係とかで入れられないと思うが。