SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|

2005-09-24(Sat) ソース風味のRPMを食してみる

  ソフトウェアなネタながら、カタいネタが続くが、今日はソース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コマンドを実行する意味は、パッチ当てのあと、ソースをイジったり、コンパイルオプションを変更したりできるトコロにあるからだ。

  で、以上の情報を踏まえて、ひとつコマンド<公開予定>を作ってみた。このコマンドにrpmファイルのURLを与えると、ソースRPMファイルのダウンロード、ソースの展開、パッチ当てを行った後、カレントディレクトリにソースファイル一式を持ってくるまでの作業を、一発でこなしてくれる。職業柄ソースを見るコトが多いもので作ってみた。なかなかに便利なコマンドである。

  まぁ、そーゆーワケで、今日はかなりコアな、その筋の人間にしか役に立たない情報であったが、まー、そーゆー日もあるのであった。ではまた。