Arch のパッケージのリポジトリを作る
Arch には公式のリポジトリとして core, extra, community, testing 等があるが、それ以外に非公式なものもいくつかある。 その中でも特に archlinuxfr は有名だと思う。linux-pae, linux-pf, repo-ck といったパッチをあてたカーネルのパッケージを提供しているリポジトリを利用している人もいるかもしれない。 そういった非公式リポジトリは wiki にまとまっている: Unofficial User Repositories - ArchWiki 。
自分も自分用に独自のリポジトリを作ってみたので、その手順を紹介する。 パッケージを作るための PKGBUILD は既に書いてあるとする。
ビルド環境の準備
まずビルド用のユーザ archbuild を作った。 ビルド用のツールは devtools というパッケージにまとまっているので、pacman -S devtools
でインストールしておく。 archbuild は一部 root になる必要があるので、visudo で /usr/sbin/makechrootpkg を NOPASSWD で許可しておく。 必要に応じて /usr/bin/rsync も許可しておく。
パッケージを作るとき、パッケージを作っているマシンの環境に依存することは避けたい。 そのために、devtools の中に適当なディレクトリをルートとして Arch の環境を作ってそこに chroot してビルドするツールがある。 手順も wiki に書いてある: DeveloperWiki:Building in a Clean Chroot - ArchWiki。
また、x86_64 な1台のマシンで i686 のパッケージも一緒に作りたい。 なので、自分は ~/chroot-x68_64 と ~/chroot-i686 の2つのディレクトリを用意し、それぞれに対して wiki の解説にあるように
sudo mkarchroot ~archbuild/chroot-x86_64/root base base-devel sudo sudo setarch i686 mkarchroot ~archbuild/chroot-i686/root base base-devel sudo
とした。 そうしてから、それぞれの pacman.conf と makepkg.conf を編集した。 少なくとも makepkg.conf の PACKAGER は書いておくといいと思う。
ビルド
chroot してビルドするには makechrootpkg を使う。 ビルドの前に、chroot 環境のパッケージの状態を最新にするために
sudo arch-nspawn ~archbuild/chroot-x86_64/root pacman -Syu sudo arch-nspawn ~archbuild/chroot-i686/root pacman -Syu
としておく。 そして PKGBUILD のあるディレクトリにいって
sudo makechrootpkg -c -u -r ~/chroot-x86_64/root sudo setarch i686 makechrootpkg -c -u -r ~/chroot-i686/root
とすれば、カレントディレクトリに各アーキテクチャ用のパッケージができあがる。
公開
自分は HTTP サーバとして nginx を利用し、ディレクトリ構成は jaist のを真似た。 まず作ったパッケージはすべて ~/pool というディレクトリに置く。 そして、~/public/myrepo/os/{i686,x86_64} というディレクトリに、~/pool にあるパッケージへの symlink を置く。 nginx では root として ~/public を指定しておく。 最後に、repo-add を使ってパッケージをデータベースに登録する。 そうすると、利用者側は /etc/pacman.conf に
[myrepo] Server = http://example.com/$repo/os/$arch
みたいに書けば利用できるようになる。
以上の公開手順をまとめて、以下のようなスクリプトを使っている。
PKG=$1 REPO=myrepo POOL=$HOME/pool PUBLIC_I686=$HOME/public/$REPO/os/i686 PUBLIC_X86_64=$HOME/public/$REPO/os/x86_64 i686() { ln -s $POOL/$1 $PUBLIC_I686 repo-add $PUBLIC_I686/$REPO.db.tar.gz $POOL/$1 } x86_64() { ln -s $POOL/$1 $PUBLIC_X86_64 repo-add $PUBLIC_X86_64/$REPO.db.tar.gz $POOL/$1 } cp $PKG $POOL case $PKG in *-any.pkg.tar.xz) i686 $PKG x86_64 $PKG ;; *-i686.pkg.tar.xz) i686 $PKG ;; *-x86_64.pkg.tar.xz) x86_64 $PKG ;; esac
補足
自分用にビルドするパッケージの中には、別の自分用にビルドしたパッケージに依存しているものもある。 なので、chroot 環境からもローカルリポジトリとして myrepo を参照したい。 HTTP で公開しているなら利用者側と同じように /etc/pacman.conf に追加してもいいし、 あるいはビルド前に
sudo rsync -avL ~/public/ ~/chroot-i686/root/extra/ sudo rsync -avL ~/public/ ~/chroot-x86_64/root/extra/
とかするようにして、~/chroot-{i686,x86_64}/root/etc/pacman.conf には
[myrepo] Server = file:///extra/$repo/os/$arch
みたい書くようにしてもいいと思う。