こんにちわ。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 でのみ有効)
- 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)
- 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)
-
となっています。ビルドに失敗したところだけを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 Orton5.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ファイルのスケルトンをコピーして表示してくれます。
ビルド関係
specファイル編集関係
しかし、異様にコマンドが充実してますね。どれだけの人がrpm-spec-mode使っているんでしょう?
というわけで今回のエントリはマニアックで内容薄めorzな感じですがこれにて終了です。
rpmもバージョン5がリリースされ、linuxだけではなく様々なプラットフォームで動くように
なるというのですが、プラットフォームの違いを吸収してくれるような仕様だと嬉しいですね。

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