DeveloperWiki:クリーンな chroot 内でビルドする
目次
導入
このページは en:DeveloperWiki の一部です。
理由
クリーンな chroot 内でビルドすることは、望んでいないリンクか PKGBUILD の depends 配列からパッケージが欠けているかに関わらず、パッケージの依存の不足を防ぎます。これを使うことで、[testing] からパッケージをインストールしているときに、安定したリポジトリ (core, extra, community) のパッケージをビルドすることができるようになります。
便利な方法
余計な操作なしに簡単にクリーンな chroot 内でパッケージをビルドするには、devtools パッケージのヘルパースクリプトを使うことができます。
ヘルパースクリプトは、makepkg と同じように PKGBUILD があるディレクトリで呼ばれる必要があります。具体的には、extra-x86_64-build
は自動的に chroot を /var/lib/archbuild
のクリーンな chroot マトリックスからセットアップし、それをアップデートして、extra リポジトリのパッケージをビルドします。multilib のビルドには、アーキテクチャなしの multilib-build
があります。特定のリポジトリとアーキテクチャにビルドするときにどのスクリプトを使うべきかの情報は下の表を参照してください。
-c
引数は chroot マトリックスをリセットするため、破損したときに便利です。これはクリーンな chroot 内でビルドするときには必要ありません。
ターゲットのリポジトリ | アーキテクチャ | 使うビルドスクリプト | 使われる pacman 設定ファイル |
---|---|---|---|
extra / community | x86_64 | extra-x86_64-build | /usr/share/devtools/pacman-extra.conf |
testing / community-testing | x86_64 | testing-x86_64-build | /usr/share/devtools/pacman-testing.conf |
staging / community-staging | x86_64 | staging-x86_64-build | /usr/share/devtools/pacman-staging.conf |
multilib | x86_64 | multilib-build | /usr/share/devtools/pacman-multilib.conf |
multilib-testing | x86_64 | multilib-testing-build | /usr/share/devtools/pacman-multilib-testing.conf |
multilib-staging | x86_64 | multilib-staging-build | /usr/share/devtools/pacman-multilib-staging.conf |
従来の方法
chroot のセットアップ
devtools パッケージはクリーンな chroot 内で作成・ビルドするためのツールを提供します。インストールしていなければインストールしてください。
クリーンな chroot を作るには、chroot が入るディレクトリを作成してください。例えば、$HOME/chroot
です。
$ mkdir ~/chroot
CHROOT
変数を定義してください。
$ CHROOT=$HOME/chroot
chroot を作成します ($CHROOT
ディレクトリにはクリーンなワーキングコピーが入る他のサブディレクトリが作成されるため、サブディレクトリ root
は必須です)。
$ mkarchroot $CHROOT/root base-devel
~/.makepkg.conf
を編集して、パッケージャ名と makeflags をセットします。必要であれば、$CHROOT/root/etc/pacman.d/mirrorlist
の ミラーリスト を調整して、$CHROOT/root/etc/pacman.conf
で testing リポジトリを有効化してください。
pacman.conf のカスタマイズ
代わりに、以下のコマンドでカスタマイズした pacman.conf
と makepkg.conf
を与えることができます。
$ mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel
chroot の中でビルドする
始めに、ベースとなる chroot ($CHROOT/root
) が最新の状態であることを確認してください。
$ arch-nspawn $CHROOT/root pacman -Syu
次に、PKGBUILD があるディレクトリで makechrootpkg
を呼んでパッケージをビルドします。
$ makechrootpkg -c -r $CHROOT
必要なパッケージを事前にインストールする
$CHROOT/root/pacman.conf
で有効化しているリポジトリから利用できない依存のあるパッケージをビルドするには、-I <package>
を使って作業中の chroot に事前にインストールしておきます。
$ makechrootpkg -c -r $CHROOT -I build-dependency-1.0-1-x86_64.pkg.tar.xz -I required-package-2.0-2-x86_64.pkg.tar.xz
makepkg に引数を渡す
makepkg に引数を渡すには、オプションの終了マーカー の後に並べます。例えば、check() を強制するには以下のようにします。
$ makechrootpkg -c -r $CHROOT -- --check
一般的なリビルドを扱う
一般的なリビルドを扱う一番クリーンな方法は、[staging] リポジトリを使うことです。始めのパッケージを [extra] に対してビルドして、[staging] に push します。その後、続く全てのパッケージを [staging] に対してリビルドして push します。
[staging] を使うことができない場合、以下のようなコマンドを使用してカスタマイズしたパッケージに対してビルドすることができます。
# extra-x86_64-build -- -I ~/packages/foobar/foobar-2-1-any.pkg.tar.xz
複数の -I 引数を使うことで、インストールしておくパッケージを複数指定することもできます。
よりシンプルできれいではない方法として、全てのビルドしたパッケージを chroot にインストールして、クリーンアップしないこともできます。始めのパッケージを以下のコマンドを使ってビルドします。
# extra-x86_64-build
そして続く全てのパッケージを以下のコマンドを使ってビルドします。
# makechrootpkg -n -r /var/lib/archbuild/extra-x86_64
namcap の実行 (-n 引数) は chroot へのパッケージのインストールを暗示します。*-build はデフォルトでこれを実行します。
ヒントとテクニック
tmpfs 内でビルドする
システムに十分な RAM がある場合、devtools ビルドスクリプトに tmpfs を指定することもできます。
# mkdir -p /mnt/chroots/arch # mount -t tmpfs -o defaults,size=20G /mnt/chroots/arch # extra-x86_64-build -c -r /mnt/chroots/arch