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 you to build a package for the stable repositories (core, extra, community) while having packages from [testing] installed on your system.
If all you want is to quickly build a package in a chroot without any further tinkering, you can use the helper scripts from the devtools package: $REPO-$ARCH-build
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/tmp/archbuild, updates it, and builds a package for the extra repository. For multilib builds there is just multilib-build without an architecture.
Setting Up A Chroot
The devtools package provides tools for creating and building within clean chroots. To make a clean chroot, create a directory you want it to reside in (example: ~/chroot). For the purposes of this article this will be called <chrootdir>. Now create your chroot:
$ sudo mkarchroot <chrootdir>/root base base-devel sudo
Edit the <chrootdir>/root/etc/makepkg.conf file to set the packager name and any makeflags. Also adjust the mirror list in <chrootdir>/root/etc/pacman.d/mirrorlist and enable [testing] in <chrootdir>/root/etc/pacman.conf if desired.
Alternatively, you can provide your own pacman.conf and makepkg.conf files with the following:
$ sudo mkarchroot -C <pacman.conf> -M <makepkg.conf> <chrootdir>/root base base-devel sudo
It is recommended however that you do not use custom pacman.conf and makepkg.conf files 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 your chroot is up to date with:
$ sudo mkarchroot -u <chrootdir>/root
Then, to build a package in your chroot run the following from the dir containing the PKGBUILD:
$ sudo makechrootpkg -c -r <chrootdir>
A unionfs is used to maintain the clean chroot during building. All installed dependencies or makedepends and other changes made during building are done in <chrootdir>/rw. Passing the -c flag to makechrootpkg ensures that this directory is cleaned before building starts.
Handling Major Rebuilds
The cleanest way to handle a major rebuild is to create a new chroot and build your first package (typically the package you are doing the rebuild for). Then create a local repo in your new chroot. To do this:
$ sudo mkdir <chrootdir>/root/repo $ sudo chmod 777 <chrootdir>/root/repo
The chmod statement allows you to copy package files and create the local repo as your user rather than root.
$ cp <package> <chrootdir>/root/repo $ cd <chrootdir>/root/repo $ repo-add local.db.tar.gz <package>
Then add the local repo to <chrootdir>/root/etc/pacman.conf
[local] Server = file:///repo
and update your repo
$ sudo mkarchroot -u <chrootdir>/root
With every additional package rebuilt, copy the package to the local repo directory, add it to the repo database and update your chroot.
Alternate Rebuild Handling
The above directions will work fine, but they can dirty the "pristine" chroot that makechrootpkg tries to keep in check (that is the point of using unionfs - dirtying a separate 'rw' directory).
Using a custom repo
Follow the steps above to setup a local repo inside the chroot.
Build packages using:
$ sudo makechrootpkg -r <chrootdir> -u
The -u will update the chroot before building (-Syu) but updates will be installed to the rw layer, maintaining a clean chroot.
Manual package installation
Packages can be installed manually to the rw layer of the chroot by using:
$ sudo makechrootpkg -r <chrootdir> -I package-1.0-1-i686.pkg.tar.gz
Installation after building
You can 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 <chrootdir> -- -i