DeveloperWiki:Building in a Clean Chroot
This article is part of the DeveloperWiki.
Building in a clean chroot prevents missing dependencies in packages, whether due to unwanted linking or packages missing in the depends array in the PKGBUILD. It also allows users to build a package for the stable repositories (core, extra, community) while having packages from [testing] installed.
To quickly build a package in a chroot without any further tinkering, one can use the helper scripts from the devtools package.
These helper scripts should be called in the same directory where the PKGBUILD is, just like with makepkg. For instance,
extra-i686-build automatically sets up chroot in
/var/lib/archbuild, updates it, and builds a package for the extra repository. For multilib builds there is just
multilib-build without an architecture.
|Target repository||Architecture||Build script to use|
|extra / community||i686||extra-i686-build|
|extra / community||x86_64||extra-x86_64-build|
|testing / community-testing||i686||testing-i686-build|
|testing / community-testing||x86_64||testing-x86_64-build|
|staging / community-staging||i686||staging-i686-build|
|staging / community-staging||x86_64||staging-x86_64-build|
Setting Up A Chroot
The devtools package provides tools for creating and building within clean chroots. Install it if not done already:
pacman -S devtools
To make a clean chroot, create a directory in which the chroot will reside. For example,
Now create the chroot:
CHROOT=$HOME/chroot mkdir $CHROOT sudo mkarchroot $CHROOT/root base-devel
~/.makepkg.conf to set the packager name and any makeflags. Also adjust the mirror list in
$CHROOT/root/etc/pacman.d/mirrorlist and enable [testing] in
$CHROOT/root/etc/pacman.conf if desired.
Alternatively, provide a custom
makepkg.conf with the following:
sudo mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel
It is recommended however users do not use custom
makepkg.conf during the initial creation of clean chroot to ensure no user-specific adjustments are made. Use with caution.
Building in the Chroot
Firstly, make sure the chroot is up to date with:
sudo arch-nspawn $CHROOT/root pacman -Syu
Then, to build a package in the chroot, run the following from the dir containing the PKGBUILD:
sudo makechrootpkg -c -r $CHROOT
Passing the -c flag to makechrootpkg ensures that the working chroot (named
$CHROOT/$USERNAME) is cleaned before building starts.
Manual package installation
Packages can be installed manually to the working chroot by using:
sudo makechrootpkg -r $CHROOT -I package-1.0-1-i686.pkg.tar.xz
If done from a directory that contains a PKGBUILD, the package will then be built. Avoid being in such a directory if you want to just install the package.
Installation after building
Tell makechrootpkg to simply install a package to the rw layer of the chroot after building by passing the -i arg. Unrecognized args get passed to makepkg, so this calls `makepkg` with the -i arg.
sudo makechrootpkg -r $CHROOT -- -i
Handling Major Rebuilds
The cleanest way to handle a major rebuild is to use the [staging] repositories. Build the first package against [extra] and push it to [staging]. Then rebuild all following packages against [staging] and push them there.
If you can't use [staging], you can build against custom packages using a command like this:
sudo extra-x86_64-build -- -I ~/packages/foobar/foobar-2-1-any.pkg.tar.xz
You can specify more than one package to be installed using multiple -I arguments.
A simpler, but dirtier way to handle a major rebuild is to install all built packages in the chroot, never cleaning it. Build the first package using:
And build all following packages using:
sudo makechrootpkg -n -r /var/lib/archbuild/extra-x86_64
Running namcap (the -n argument) implies installing the package in the chroot. *-build also does this by default.