SVX日記
2005-09-24(Sat) ソース風味のRPMを食してみる
Redhat(Fedora)の提供するRPMファイルには、一発バイナリインストールの「通常RPMファイル」と、RPM形式ながら、中にバイナリでなくソースファイルが含まれている「ソースRPMファイル」がある。ソースRPMファイルにはRPMファイルを生成するための全ての情報が含まれており、コマンド一発で通常RPMファイルを生成することができるようになっている。ウルサ方には軟弱だとノノシられるかもしれないが、大変便利であるコトに違いはない。
で、このソースRPMファイルであるが、実は中身はちょっと凝った構造になっている。まずは展開してみよう。カレントに中身をブチまけるには「rpm2cpio xxxx.src.rpm | cpio -idv」である。展開されたファイル群を見渡すと、なんだかpatchファイルが目立つ。肝心のメインのソースはどこかといえば、これはxxxx.tar.bz2の中に固められている。コイツをtarで展開しないとソースは出てこない。なんでこんな面倒なコトになっているのか?
実は、このxxxx.tar.bz2アーカイブ、ファーストリリース時から一切変化しないファイルなのである。セキュリティパッチなどで修正が施され、リビジョンの末番が変わっても、それはpatchファイルの追加によって行われるのである。だから、正確に「あるリビジョン」のソースが欲しい場合には、xxxx.tar.bz2を展開しただけではダメで、それに修正パッチを当てる必要があるのである。
ちなみにこのpatchファイル。通常は複数存在するので、当てる順番にも正解がある。で、そういった情報はすべてSPECファイルに書かれている。SPECファイルはRedhatの考案した独自形式であるが、ソース展開、パッチ当て、コンパイル(configure, make)、インストールまでの全ての手順についての情報が含まれている。
このようなRedhatの考案したSPECファイルであるから、やはりRedhatの用意したrpmコマンドおよび、rpmbuildコマンドから扱うのが吉である。先ほどは「rpm2cpio」で中身をブチまけたが、本来は「rpm -ivh xxx.src.rpm」で中身を「/usr/src/redhat/SOURCES」の配下にインストールし「rpmbuild -bp /usr/src/redhat/SPECS/xxxx.spec」で「/usr/src/redhat/BUILD/xxxx-n.n.n」にソースを展開&パッチ当てを行い「rpmbuild -bc --short-circuit /usr/src/redhat/SPECS/xxxx.spec」でコンパイルして「rpmbuild -bi --short-circuit /usr/src/redhat/SPECS/xxxx.spec」でインストールすべきなのである。
この作業を行うと、ソースは「/usr/src/redhat/BUILD/xxxx-n.n.n」ディレクトリ、コンパイルするとバイナリは「/usr/src/redhat/BUILD/xxxx.n.n.n」の下の「どこか」に生成される。
ちなみに「ソースPRMファイル」から「通用RPMファイル」を作るだけなら「rpm --rebuild xxxx.src.rpm」で一発である。んが、こーするとユーザの介在する余地はまったくなくなってしまうので、こんなコトするくらいなら、最初からバイナリRPMをダウンロードしたほうがよい。ワザワザ3回にわけてrpmbuildコマンドを実行する意味は、パッチ当てのあと、ソースをイジったり、コンパイルオプションを変更したりできるトコロにあるからだ。