オレオレrpmパッケージの作り方(ビルド編)

こんにちわ。arashoです。今回は前回のエントリに引き続きrpmパッケージのビルドのコツや効率よくパッケージングを行う小ネタなどを書いてみたいと思います。

パッケージのビルドオプションについて

RPMのパッケージングには意外と時間がかかります。rpmbuildコマンドでソースコードの展開からパッチの適用、コンパイル、テンポラリディレクトリへのインストール、パッケージングをやっているので巨大なソフトウェアではコンパイルに時間を取られたりします。

そこで、rpmbuildにはいくつかビルドに便利なオプションが備えられています。-bp -bc -bi -bl –short-circuitです。それぞれのオプションはmanから引用すると

-bp
<specfile> の %prep (ソース展開と patchの適用) まで実行
-bc
<specfile> の %build (%prepとコンパイル) まで実行
-bi
<specfile> の %install (%prep, %build,インストール) まで実行
-bl
<specfile> の %files セクションを検証
–short-circuit
指定した過程までスキップします(c, i でのみ有効)
となっています。ビルドに失敗したところだけをspecファイルを修正して行ったり、どこまで正しく実行できるかを確認できるわけです(tar.gzから作成する場合も対応して-tp、-tc、-ti、-tlがあります)。
rpmbuild -ba(or -bb)してみて、パッケージングに失敗するようであればrpmbuild -blを使うことで、既に前回のビルドで使用されたコンパイル済みのファイルに対してファイルの過不足をチェックするので、前段階の(時間のかかる)コンパイルが省略されるわけです。
自分の場合、よく使うパターンはディストリビューションに存在するパッケージにパッチを当ててビルドしたりする場合によく使います。RedhatやCentOSなどでは配布されているオリジナルのソフトウェアに対してパッチを少なからず当てているので自分の使いたい機能の為にパッチを行ってもビルドに失敗する場合があります。
修正してビルドを行いたいのに、ソースの展開からパッチの当て込みまで行うのは時間の無駄なので、BUILDディレクトリに展開されているソースコードに対して修正を行い(もちろんビルドできるようになったらパッチは作成してspecファイルに反映させます)、rpmbuild -bc –short-circuit を行います。
linuxのカーネルなどはtar.bz2で40MB程度あるので展開から行っていると時間がかかってしょうがないですね。

srpmの中身の確認

srpmの中身を確認するにはrpm2cpioを使用してからcpio –listなどで確認するのが定番かと思いますが、面倒ですね。

$ rpm2cpio php-5.1.6-15.el5.src.rpm |cpio --list -v
-rw-r--r--   1 root     root          413 Sep  9  2004 php-4.3.1-odbc.patch
-rw-r--r--   1 root     root          650 Apr 12  2005 php-4.3.11-shutdown.patch
-rw-r--r--   1 root     root          724 Nov 30  2005 php-4.3.2-libtool15.patch
-rw-r--r--   1 root     root          393 Sep  9  2004 php-4.3.3-install.patch
~ 以下略 ~

もっと簡単に見る方法があるので紹介します。

$ less php-5.1.6-15.el5.src.rpm
Name        : php                          Relocations: (not relocatable)
Version     : 5.1.6                             Vendor: CentOS
Release     : 15.el5                        Build Date: 2007年09月20日 22時53分06秒
Install Date: (not installed)               Build Host: builder7.centos.org
Group       : Development/Languages         Source RPM: (none)
Size        : 8333623                          License: The PHP License v3.01
Signature   : DSA/SHA1, 2007年09月21日 09時04分51秒, Key ID a8a447dce8562897
URL         : http://www.php.net/
Summary     : PHP HTML 埋め込みのスクリプト言語 (PHP: Hypertext Preprocessor)
Description :
PHP is an HTML-embedded scripting language. PHP attempts to make it
easy for developers to write dynamically generated webpages. PHP also
offers built-in database integration for several commercial and
non-commercial database management systems, so writing a
database-enabled webpage with PHP is fairly simple. The most common
use of PHP coding is probably as a replacement for CGI scripts.

The php package contains the module which adds support for the PHP
language to Apache HTTP Server.
* 木  9月 13 2007 Joe Orton  5.1.6-15.el5
- improve fix for CVE-2007-3997 (#278411)

~ 中略 ~

-rw-r--r--    1 mockbuilmockbuil          413  9月  9  2004 php-4.3.1-odbc.patch
-rw-r--r--    1 mockbuilmockbuil          650  4月 12  2005 php-4.3.11-shutdown.patch
-rw-r--r--    1 mockbuilmockbuil          724 11月 30  2005 php-4.3.2-libtool15.patch
-rw-r--r--    1 mockbuilmockbuil          393  9月  9  2004 php-4.3.3-install.patch
-rw-r--r--    1 mockbuilmockbuil          588 11月 29  2006 php-4.3.9-CVE-2006-5465.patch
-rw-r--r--    1 mockbuilmockbuil          407  4月  4  2007 php-4.3.9-CVE-2007-0906-strreplace.patch
-r

~ 以下略 ~

このようにlessで見ることもできます。

emacsのrpm-spec-mode

emacs使いの人はspecファイルの記述にrpm-spec-modeを使っていたりすると思いますが、このモードではコマンドがあるので、コマンドのショートカットを覚えるとコーディングやデバッグが楽になると思います。一部記載します。ちなみにrpm-spec-modeが入っているemacsでは”emacs hoge.spec”など存在しないファイル名を指定して起動するとspecファイルのスケルトンをコピーして表示してくれます。

ビルド関係

rpm-build-all
rpmbuild -baを行う(\C-c\C-ba)
rpm-build-binary
rpmbuild -bbを行う(C-c\C-bb)
rpm-list-check
rpmbuild -blを行う(C-c\C-bb)
rpm-build-prepare
rpmbuild -bpを行う(\C-c\C-bp)
rpm-build-compile
rpmbuild -bcを行う(\C-c\C-bc)
rpm-build-install
rpmbuild -biを行う(\C-c\C-bi)
rpm-build-source
rpmbuild -bsを行う(\C-c\C-bs)
rpm-change-target-option
ビルドターゲットの変更(rpmbuild時に–targetオプションを付ける,\C-c\C-xp)
rpm-toggle-short-circuit
ビルド時に–short-circuitオプションをつけるかどうか設定する(\C-c\C-xs)

specファイル編集関係

rpm-backward-section
前のセクションに移動(\C-c\C-p)
rpm-forward-section
次のセクションに移動(\C-c\C-n)
rpm-beginning-of-section
changelogエントリの追加(\C-c\C-e)
rpm-increase-release-tag
リリースタグを1増加する(\C-c\C-r)
rpm-insert-config
%configを追加(\C-c\C-fc)
rpm-insert-dir
%dirを追加(\C-c\C-dd)
rpm-insert-doc
%docを追加(\C-c\C-fd)
rpm-insert-docdir
%docdirを追加(\C-c\C-d0)

しかし、異様にコマンドが充実してますね。どれだけの人がrpm-spec-mode使っているんでしょう?

というわけで今回のエントリはマニアックで内容薄めorzな感じですがこれにて終了です。
rpmもバージョン5がリリースされ、linuxだけではなく様々なプラットフォームで動くように
なるというのですが、プラットフォームの違いを吸収してくれるような仕様だと嬉しいですね。

コメント / トラックバックはありません

コメントする