Skip to content

Debian - Installing and using pbuilder

Though sbuild is the primary build agent for Debian, pbuilder is still very popular and has some features yet to be found in sbuild, the --twice switch for example.

This tutorial will detail the installation, configuration and use of pbuilder.

First we install pbuilder.

sudo apt install pbuilder


Now we will generate the pbuilder base system tarball for Debian unstable.

sudo pbuilder create --debootstrapopts --variant=buildd --distribution unstable


That simple... Let's build a package.

dget https://deb.debian.org/debian/pool/main/d/ddcutil/ddcutil_2.2.0-2.dsc


sudo pbuilder build ddcutil_2.2.0-2.dsc


The build should complete with success. Let's check below.

ls -1 /var/cache/pbuilder/result/


Output:

philwyett@debian:~$ ls -1 /var/cache/pbuilder/result/
ddcutil_2.2.0-2_amd64.buildinfo
ddcutil_2.2.0-2_amd64.changes
ddcutil_2.2.0-2_amd64.deb
ddcutil_2.2.0-2.debian.tar.xz
ddcutil_2.2.0-2.dsc
ddcutil_2.2.0-2_source.changes
ddcutil-dbgsym_2.2.0-2_amd64.deb
libddcutil5_2.2.0-2_amd64.deb
libddcutil5-dbgsym_2.2.0-2_amd64.deb
libddcutil-dev_2.2.0-2_amd64.deb


Updating your base system tarball

To update your the pbuilder base system tarball with the latest package versions, you can simply run the command below.

sudo pbuilder update


These are the basics.

Building the package for i386

First we clean up after our previous build.

sudo pbuilder clean all


sudo rm -f /var/cache/pbuilder/result/*


Now we remove our previously generated unstable base.

sudo rm -f /var/cache/pbuilder/base.tgz


Now we will generate our unstable i386 base system tarball.

sudo pbuilder create --debootstrapopts --variant=buildd --distribution unstable --architecture i386


Let's now do the i386 build of the package we previously built.

sudo pbuilder build ddcutil_2.2.0-2.dsc


The build should complete with success. Let's check below.

ls -1 /var/cache/pbuilder/result/


Output:

philwyett@debian:~$ ls -1 /var/cache/pbuilder/result/
ddcutil_2.2.0-2.debian.tar.xz
ddcutil_2.2.0-2.dsc
ddcutil_2.2.0-2_i386.buildinfo
ddcutil_2.2.0-2_i386.changes
ddcutil_2.2.0-2_i386.deb
ddcutil_2.2.0-2_source.changes
ddcutil-dbgsym_2.2.0-2_i386.deb
libddcutil5_2.2.0-2_i386.deb
libddcutil5-dbgsym_2.2.0-2_i386.deb
libddcutil-dev_2.2.0-2_i386.deb

As simple as that.

Build after successful build

As you explore Debian and look at more bug reports you will see bugs that are failures to build after successful build. With pbuilder we can use the --twice switch and attempt to do two builds back to back. We do this with the command below.

sudo pbuilder build --twice ddcutil_2.2.0-2.dsc


Try it for yourself.

Building using local packages

On occasion you may need to build a package that depends on one or more packages that is not yet in Debian. To do this we need to some additional configuration.

Add a file called .pbuilderrc to your HOME directory.

In the new .pbuilderrc add the text below and save the file.

#
# The hook dir may already be set/populated!
#
HOOKDIR="$HOME/.config/pbuilder/hooks/"
if [ -n "$DEPS" ] ; then
export DEPSBASE=/var/cache/pbuilder/local_packages
BINDMOUNTS=$DEPSBASE
fi

The folder /var/cache/pbuilder/local_packages is my personal base directory to use, but you may change it to whatever you wish. For now we will create this directory.

sudo mkdir -p /var/cache/pbuilder/local_packages


We next create a directory for the packages as below, you may name it as you wish.

sudo mkdir -p /var/cache/pbuilder/local_packages/kathenas


Next we create the necessary hook.

Create the following directory.

mkdir -p ~/.config/pbuilder/hooks


In the above directory create the file named D05deps.

In the file D05deps add the text below and save the file.

DEPSPATH="$DEPSBASE/$DEPS"
if [ -n "$DEPS" ] && [ -d "$DEPSPATH" ] ; then
apt install --assume-yes apt-utils
( cd "$DEPSPATH"; apt-ftparchive packages . > Packages )
echo "deb [trusted=yes] file://$DEPSPATH ./" >> /etc/apt/sources.list
apt update
fi

We must make this hook file executable. This can be done with the command below.

chmod +x ~/.config/pbuilder/hooks/D05deps


Now we are able to build packages with local dependencies:

1. Build the package you wish to use that is not in Debian.
2. Copy the .deb files from /var/cache/pbuilder/result to /var/cache/pbuilder/local_packages/kathenas
3.Build your package now using the dependencies in /var/cache/pbuilder/local_packages/kathenas using the reference command below.

sudo -E DEPS=kathenas pbuilder build PACKAGE_NAME_AND_VERSION.dsc


I hope you find this tutorial useful and have a good rest of your day.