Ubuntu logo

Packaging Guide

6. Setting up sbuild

sbuild simplifies building Debian/Ubuntu binary package from source in clean environment. It allows to try debugging packages in environment similar (as opposed to pbuild) to builders used by Launchpad.

It works on different architectures and allows to build packages for other releases. It needs kernel supporting overlayfs.

6.1. Installing sbuild

To use sbuild, you need to install sbuild and other required packages and add yourself to the sbuild group:

$ sudo apt install debhelper sbuild schroot ubuntu-dev-tools
$ sudo adduser $USER sbuild

Create .sbuildrc in your home directory with following content:

# Name to use as override in .changes files for the Maintainer: field
# (mandatory, no default!).
$maintainer_name='Your Name <user@example.org>';

# Default distribution to build.
$distribution = "bionic";
# Build arch-all by default.
$build_arch_all = 1;

# When to purge the build directory afterwards; possible values are "never",
# "successful", and "always".  "always" is the default. It can be helpful
# to preserve failing builds for debugging purposes.  Switch these comments
# if you want to preserve even successful builds, and then use
# "schroot -e --all-sessions" to clean them up manually.
$purge_build_directory = 'successful';
$purge_session = 'successful';
$purge_build_deps = 'successful';
# $purge_build_directory = 'never';
# $purge_session = 'never';
# $purge_build_deps = 'never';

# Directory for writing build logs to
$log_dir=$ENV{HOME}."/ubuntu/logs";

# don't remove this, Perl needs it:
1;

Replace “Your Name <user@example.org>” with your name and e-mail address. Change default distribution if you want, but remember that you can specify target distribution when executing command.

If you haven’t restarted your session after adding yourself to the sbuild group, enter:

$ sg sbuild

Generate GPG keypair for sbuild and create chroot for specified release:

$ sbuild-update --keygen
$ mk-sbuild bionic

This will create chroot for your current architecture. You might want to specify another architecture. For this, you can use --arch option. Example:

$ mk-sbuild xenial --arch=i386

6.2. Using schroot

6.2.1. Entering schroot

You can use schroot -c <release>-<architecture> [-u <USER>] to enter newly created chroot, but that’s not exactly the reason why you are using sbuild:

$ schroot -c bionic-amd64 -u root

6.2.2. Using schroot for package building

To build package using sbuild chroot, we use (surprisingly) the sbuild command. For example, to build hello package from x86_64 chroot, after applying some changes:

apt source hello
cd hello-*
sed -i -- 's/Hello/Goodbye/g' src/hello.c   # some
sed -i -- 's/Hello/Goodbye/g' tests/hello-1 #
dpkg-source --commit
dch -i                                      #
update-maintainer                           # changes
sbuild -d bionic-amd64

To build package from source package (.dsc), use location of the source package as second parameter:

sbuild -d bionic-amd64 ~/packages/goodbye_*.dsc

To make use of all power of your CPU, you can specify number of threads used for building using standard -j<threads>:

sbuild -d bionic-amd64 -j8

6.3. Maintaining schroots

6.3.1. Listing chroots

To get list of all your sbuild chroots, use schroot -l. The source: chroots are used as base of new schroots. Changes here aren’t recommended, but if you have specific reason, you can open it using something like:

$ schroot -c source:bionic-amd64

6.3.2. Updating schroots

To upgrade the whole schroot:

$ sbuild-update -ubc bionic-amd64

6.3.3. Expiring active schroots

If because of any reason, you haven’t stopped your schroot, you can expire all active schroots using:

$ schroot -e --all-sessions

6.4. Further reading

There is Debian wiki page covering sbuild usage.

Ubuntu Wiki also has article about basics of sbuild.

sbuild manpages are covering details about sbuild usage and available features.