空の RPM パッケージで依存関係の問題を解決する (1)
CentOS を使っていてちょっと困るのは、パッケージの少なさと古さだ。安定性が売りなのだから仕方がないが、欲しいパッケージやバージョンが Fedora にあると、「安定性」とやらを多少犠牲にしても手を出さずにはいられない*1。
もちろん、取ってくるのは SRPM で、rpmbuild --rebuild
してインストールする。別のディストロのバイナリ RPM をブチ込むなんていう恐ろしいことはゴメンだ*2。大概、rpmbuild --rebuild
は問題なく完了する。別に何をしたわけでもないのにターミナルに流れる大量のメッセージが“ビルドしたぜ!!”という意味不明な満足感と達成感を与えてくれる一種の魔境で、疲れたときの気分転換などによい。
だがしかし、ここに1つの罠がある。BuildRequires
されているパッケージが CentOS には存在しないことがあるのだ。
パッケージがない、というのにも2つのパターンがある。1つは、当該のパッケージが“本当に”ない場合だ。これは大した問題ではない。そのパッケージの SRPM を Fedora から取ってきて rpmbuild --rebuild
すればいいだけの話だ。そこでもまた BuildRequires
が見つからないかもしれないが、再帰すればいい。
困るのは、「ちょっとパッケージ構成見直しちゃったよ」系の“見つからない”だ。ありがちなのは、ライブラリの -devel
を別パッケージに分けたよ、というやつ。たとえば、CentOS 5 では popt
という1つのパッケージなのが Fedora 9 では popt
と popt-devel
に分けられている。この場合、「Fedora 9 の SRPM は popt-devel
を BuildRequires
するが、そんなパッケージは 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
という名前だけなのだから。「うちの popt
は popt-devel
を Provides
してるんですよ、実は。」という表明だと捉えることもできる((「じゃあ、CentOS 5 の popt
の SRPM を取ってきて、SPEC に Provides popt-devel
って書いて rpmbuild -bb
すればいいじゃん」と思われるかもしれない。確かにそうですね。今これを書いていて気付きました……。))。
というわけで、漸く本題で「空の RPM パッケージの作り方」なわけですが、今日はもう疲れたので明日にします。ごめんなさい。