2010,08,14 munepi vbuilder で RPM パッケージングをはじめよう <description> vbuilder は公開してからかれこれ 1 年になりました。 vbuilder は RPM パッケージングツールとして、 もはや欠かせないツールの 1 つとなりつつあります。 <br /> これまで vbuilder をご利用下さった開発者の皆様から たくさんのフィードバックを得ました。 vbuilder への要望やコメントがあるごとに、 どんどん機能を追加したり、修正、改良をしているうちに、 vbuilder は公開当初から比べると、ずいぶんと多機能になりました。 <br /> これまで vbuilder を使ったことのない方でも、 vbuilder を使いこなして頂けるように、 基本的な使い方をまとめたいと思います。 <h2>vbuilder とは?</h2> <p> vbuilder は、(chroot という)子環境に Vine Linux の最小環境から構築し、 RPM パッケージの依存関係などの解決をしてからパッケージのビルドするツールです。 </p> <p> vbuilder に関する詳細は、以下の URL に記載されています。 <br /> <a href="http://trac.vinelinux.org/wiki/VineBootstrap">http://trac.vinelinux.org/wiki/VineBootstrap</a> </p> <p> vbuilder は vbootstrap パッケージに格納されています。 </p> <pre class="screen"> $ sudo apt -get install vbootstrap </pre> <h2>vbuilder の基本操作</h2> <p> 基本的な流れは以下の通りです。 </p> <pre class="screen"> $ sudo vbuilder clean (過去に構築した子環境を削除) $ sudo vbuilder build (子環境に最小環境を構築) $ sudo vbuilder build-rpm hoge-1.0-1vl5.src.rpm </pre> <p> vbuilder にこれらのアクションを一度に渡すこともできます。 以下のようにすれば、順次 clean → build → build-rpm のように実行します。 </p> <pre class="screen"> $ sudo vbuilder clean build build-rpm hoge-1.0-1vl5.src.rpm </pre> この場合、build を省略できます。 <pre class="screen"> $ sudo vbuilder clean build-rpm hoge-1.0-1vl5.src.rpm </pre> <p> 子環境で生成された hoge-1.0-1vl5.{i386,src}.rpm は、 vbuilder を実行したユーザの $HOME/rpm/vbuilder 以下の場所に、 hoge-1.0-1vl5.src.rpm と同じ所有者、同じグループとしてコピーされます。 </p> <pre class="screen"> /home/foo/rpm/vbuilder/5.1/ /home/foo/rpm/vbuilder/5.1/RPMS /home/foo/rpm/vbuilder/5.1/RPMS/i386/hoge-1.0-1vl5.i386.rpm /home/foo/rpm/vbuilder/5.1/RPMS/ppc /home/foo/rpm/vbuilder/5.1/RPMS/noarch /home/foo/rpm/vbuilder/5.1/RPMS/x86_64 /home/foo/rpm/vbuilder/5.1/SRPMS/hoge-1.0-1vl5.src.rpm </pre> <p> なお、$ sudo vbuilder --version 5.1 clean build を実行すると、 約 600MB 程度の容量を消費します。 vbuilder を実行する際には、ハードディスクの容量にご注意下さい。 </p> <h2>vbuilder の引数補完</h2> <p> vbuilder にはたくさんのオプションとアクションがあります。 入力する手間を軽減するために、シェル補完を利用します。 </p> <h3>bash</h3> <p> ${HOME}/.bashrc などに、以下の行を追加します。 </p> <pre class="screen"> . /etc/bash_completion.d/vbuilder </pre> <h3>zsh</h3> <p> zsh-completion-vine パッケージをインストールします。 </p> <h2>--unionfs オプションの利用</h2> <p> いくつもの RPM パッケージを vbuilder に投げてビルドするときに、 $ sudo vbuilder build により毎回ベース環境を構築するのが面倒になります。 unionfs と利用することで、一度構築した最小のベース環境に変更を加えずに、 その上に変更のみを被せることができます。 </p> <p> まず、最小のベース環境を構築します。 </p> <pre class="screen"> $ sudo vbuilder clean build </pre> <p> 以後、unionfs でベース環境をカバーし、hoge-1.0-1vl5.src.rpm のビルドを行います。 </p> <pre class="screen"> $ sudo vbuilder --unionfs build-rpm hoge-1.0-1vl5.src.rpm </pre> <p> --unionfs を保ったまま clean を実行すると、最小のベース環境は消えません。 </p> <pre class="screen"> $ sudo vbuilder --unionfs clean </pre> <p> 引き続き、foo-1.0-1vl5.src.rpm をすぐさまビルドできます。 $ sudo vbuilder --unionfs build-rpm foo-1.0-1vl5.src.rpm </p> <h2>--show-info オプションの活用</h2> <p> --show-info オプションは、 ターゲットにしている vbuilder で構築した環境に対して、 実行した詳細な手順、設定を出力します。 </p> <pre class="screen"> $ sudo vbuilder --show-info ====================================================================== VBUILDER REPORT DATE: Thu Aug 12 16:30:42 JST 2010 HOSTNAME: seed64.local OS: Vine Linux 6.0 (+VineSeed) (Haut Brion) %_arch: x86_64 --version: VineSeed --arch: x86_64 --category: main,plus,nonfree --bootstrap-dir: /dev/shm/vbootstrap --cache-dir: /var/local/vbootstrap/cache --built-rpms-dir: /home/munepi/rpm/vbuilder ====================================================================== [/etc/vbootstrap/vbuilder.conf] ## ## vbuilder configuration file ## ## This configuration is read at the begin of vbuilder. ## Default version for chroot ## default: DEFAULT_VERSION=VineSeed DEFAULT_VERSION=VineSeed ## Default categories for chroot ## default: CATEGORIES=main,plus,nonfree CATEGORIES=main,plus,nonfree ## The top dirctory for vbootstrap ## default: VBOOTSTRAP_DIR=/var/local/vbootstrap VBOOTSTRAP_DIR=/dev/shm/vbootstrap ## Default directory to cache rpms of /var/cache/apt/archives in chroot ## default: CACHE_DIR=/var/local/vbootstrap/cache CACHE_DIR=/var/local/vbootstrap/cache ## Default directory to store built rpms ## default: BUILT_RPMS_DIR=${HOME}/rpm/vbuilder BUILT_RPMS_DIR=${HOME}/rpm/vbuilder ## end of file [History] build build-rpm /home/munepi/rpm/SRPM/hoge-1.0-1vl5.src.rpm </pre> <h2>その他のオプション</h2> <p> vbuilder のその他のオプションをいくつか紹介します。 </p> <dl> <dt>--version</dt> <dd> 子環境の Vine Linux のバージョンを指定します。 デフォルトは親環境と同じバージョンです。 例えば、VineSeed 上で、5.1 子環境を構築したいときに、 --version 5.1 と指定します。 </dd> <dt>--arch</dt> <dd> 子環境のアーキテクチャを指定します。 デフォルトは親環境と同一アーキテクチャです。 例えば、x86_64 上で子環境のアーキテクチャを i386 にしたいときに、 --arch i386 と指定します。 </dd> <dt>--category</dt> <dd> ベース環境内の apt リポジトリのカテゴリを指定します。 デフォルトは、main,plus,nonfree です。 例えば、main カテゴリのみのビルド依存であるかどうかをチェックしたいときに、 --category main と指定します。 </dd> <dt>--target</dt> 子環境内でビルドする rpmbuild --target のターゲットを指定します。 <dd> </dd> <dt>--rpmbuild-with</dt> <dd> 子環境内でビルドするときの rpmbuild --with を指定します。 例えば、spec ファイルに記述した %bcond_with などを vbuilder から扱えます。 </dd> <dt>--sign</dt> <dd> $ sudo vbuilder build-rpm ... でビルドした rpm を SUDO_USER により鍵署名をします。 </dd> <dt>--no-install</dt> <dd> build-rpm によりビルドした rpm は、通常 chroot 内に install もします。 このオプションを指定すると、ビルドされた rpm を chroot 内に install しません。 例えば、あるパッケージをマイナーバージョンアップさせたときに、 以前のバージョンとの ldd などの差分を取るときに便利なオプションです。 </dd> </dl>