DeveloperWiki:クリーンな chroot でビルドする

提供: ArchWiki
ナビゲーションに移動 検索に移動


理由

クリーンな chroot でビルドすると、不要なリンクや PKGBUILD の depend 配列にパッケージが欠落していることが原因で、パッケージ内の依存関係が欠落することがなくなります。また、ユーザーは core-testing または extra-testing のパッケージをインストールしたまま、安定したリポジトリ (coreextra) のパッケージをビルドすることもできます。

便利な方法

それ以上いじることなく、クリーンな chroot でパッケージをすばやくビルドするには、devtools パッケージのヘルパースクリプトを使用できます。

これらのヘルパースクリプトは、makepkg と同様に、PKGBUILD と同じディレクトリで呼び出す必要があります。たとえば、extra-x86_64-build は、/var/lib/archbuild 内のクリーンな chroot マトリックスから chroot を自動的にセットアップして、更新し、追加のリポジトリ用のパッケージをビルドします。multilib ビルドの場合は、アーキテクチャのない multilib-build だけが存在します。特定のリポジトリおよびアーキテクチャ向けに構築するときにどのスクリプトを使用するかについては、以下の表を参照してください。

-c パラメータは chroot マトリックスをリセットします。これは破損した場合に役立ちます。クリーンな chroot でのビルドには必要ありません。

ノート:
  • これらのパッケージは core に入る前にまず core-testing を通過する必要があるため、core は省略されています。
  • core パッケージをビルドしてローカルで使用するのが目的であれば、テスト用リポジトリではなく安定版リポジトリを使用するのが望ましいでしょう。この場合、追加のビルドスクリプトを使うだけです。
ターゲットリポジトリ アーキテクチャ 使用するビルドスクリプト 使用される Pacman 設定ファイル
extra x86_64 extra-x86_64-build /usr/share/devtools/pacman.conf.d/extra.conf
core-testing / extra-testing x86_64 extra-testing-x86_64-build /usr/share/devtools/pacman.conf.d/extra-testing.conf
core-staging / extra-staging x86_64 extra-staging-x86_64-build /usr/share/devtools/pacman.conf.d/extra-staging.conf
multilib x86_64 multilib-build /usr/share/devtools/pacman.conf.d/multilib.conf
multilib-testing x86_64 multilib-testing-build /usr/share/devtools/pacman.conf.d/multilib-testing.conf
multilib-staging x86_64 multilib-staging-build /usr/share/devtools/pacman.conf.d/multilib-staging.conf
ヒント: pkgctl build は、クリーンな chroot でビルドするための適切なビルドスクリプトを自動的に選択します。

古典的な方法

chroot のセットアップ

devtools パッケージは、クリーンな chroot 内で作成および設定するためのツールを提供します。まだインストールしていない場合はインストールしてください。

クリーンな chroot を作成するには、chroot が存在するディレクトリを作成します。たとえば、$HOME/chroot などです。

$ mkdir ~/chroot

CHROOT 変数を定義します:

$ CHROOT=$HOME/chroot

次に、chroot を作成します ($CHROOT ディレクトリはクリーンな作業コピー用に他のサブディレクトリを取得するため、サブディレクトリ root が必要です):

$ mkarchroot $CHROOT/root base-devel
ノート:
  • 繰り返し使う場所であれば、$HOME/.bashrcCHROOT 変数を定義することもできます。
  • btrfs では、chroot はサブボリュームとして作成されるので、root 権限で btrfs subvolume delete $CHROOT/root を実行してサブボリュームを削除することで chroot を削除する必要があります。

~/.makepkg.conf を編集して、パッケージャー名と make フラグを設定します。また、$CHROOT/root/etc/pacman.d/mirrorlistmirrorlist を調整し、{{ic|$CHROOT/ の testing リポジトリを有効にします必要に応じて、root/etc/pacman.conf を選択します。

ノート: ~$HOME 変数は、makechrootpkg スクリプト (後述) によって /root/ に解決されます。

pacman.conf をカスタム

あるいは、次のようにカスタムの pacman.confmakepkg.conf を指定します。

$ mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel
警告: クリーンな chroot の最初の作成中にカスタムの pacman.conf または makepkg.conf を使用すると、chroot 環境に意図しないカスタム調整が行われる可能性があります。注意して使用してください

chroot でのビルド

まず、ベースの chroot ($CHROOT/root) が最新であることを確認します:

$ arch-nspawn $CHROOT/root pacman -Syu

次に、PKGBUILD を含むディレクトリで makechrootpkg を呼び出してパッケージをビルドします:

$ makechrootpkg -c -r $CHROOT
ノート: -c フラグを makechrootpkg に渡すと、作業中の chroot ($CHROOT/$USER) がビルド前に確実にクリーンアップされます。

必要なパッケージを事前にインストールする

$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 にプッシュします。次に、後続のすべてのパッケージを staging に対してリビルドし、そこにプッシュします。

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 を指定できます。

# mount --mkdir -t tmpfs -o defaults,size=20G tmpfs /mnt/chroots/arch
# extra-x86_64-build -c -r /mnt/chroots/arch