Table of Contents

Compilation de paquets Debian

Après avoir créé un paquet source Debian, il peut être intéressant de le tester une première fois en le compilant soit même. On peut compiler un paquet de deux manières différentes.

La première est de simplement utiliser l'utilitaire debuild sans argument. Le paquet Debian sera alors compilé pour la machine donnée en se servant de ce qui est déjà installé. Cela demande donc d'avoir un environnement capable de compiler le paquet souhaité. Par exemple, les dépendances du paquet doivent être toutes installées.

La seconde méthode est d'utiliser un environnement spécifique pour compiler. Debian dispose d'outils permettant de mettre en place plusieurs debootstraps comme pbuilder et cowbuilder. Je préfère personnellement utiliser le second outil car le debootstrap met moins de temps à s'initialiser. L'utilisation de cowbuilder permet aussi de gérer la compilation de paquets pour plusieurs versions d'une distribution. En effet, il est très simple de mettre en place plusieurs environnements afin de compiler les paquets pour Debian Stable, Testing et Unstable (avec ou sans Experimental). Il est également possible de compiler les paquets pour différentes versions d'Ubuntu.

Installation de cowbuilder

En réalité, cowbuilder est un simple outil utilisant pbuilder. On peut voir ça comme une surcouche un peu comme aptitude par rapport à apt. L'installation est très simple puisque tout est dans les dépôts.

apt-get install dh-make quilt cowbuilder

Configuration

La configuration de cowbuilder/pbuilder se fait via le fichier .pbuilderrc situé dans le répertoire personnel de l'utilisateur lançant la compilation. Mettre le contenu suivant permettra à cowbuilder de compiler des paquets pour Debian et Ubuntu et pour les différentes versions des distributions.

# Codenames for Debian suites according to their alias. Update these when
# needed.
UNSTABLE_CODENAME="sid"
TESTING_CODENAME="strech"
STABLE_CODENAME="jessie"
STABLE_BACKPORTS_SUITE="$STABLE_CODENAME-backports"
 
# List of Debian suites.
DEBIAN_SUITES=($UNSTABLE_CODENAME $TESTING_CODENAME $STABLE_CODENAME
    "unstable" "testing" "stable")
 
# List of Ubuntu suites. Update these when needed.
UBUNTU_SUITES=("precise" "trusty", "utopic", "vivid")
 
# Mirrors to use. Update these to your preferred mirror.
DEBIAN_MIRROR="ftp.fr.debian.org"
UBUNTU_MIRROR="ftp.ubuntu.com"
 
# Optionally use the changelog of a package to determine the suite to use if
# none set.
if [ -z "${DIST}" ] && [ -r "debian/changelog" ]; then
    DIST=$(dpkg-parsechangelog | awk '/^Distribution: / {print $2}')
    DIST="${DIST%%-*}"
    # Use the unstable suite for certain suite values.
    if $(echo "experimental UNRELEASED" | grep -q $DIST); then
        DIST="$UNSTABLE_CODENAME"
    fi
fi
 
# Optionally set a default distribution if none is used. Note that you can set
# your own default (i.e. ${DIST:="unstable"}).
: ${DIST:="$(lsb_release --short --codename)"}
 
# Optionally change Debian release states in $DIST to their names.
case "$DIST" in
    unstable)
        DIST="$UNSTABLE_CODENAME"
        ;;
    testing)
        DIST="$TESTING_CODENAME"
        ;;
    stable)
        DIST="$STABLE_CODENAME"
        ;;
esac
 
# Optionally set the architecture to the host architecture if none set. Note
# that you can set your own default (i.e. ${ARCH:="i386"}).
: ${ARCH:="$(dpkg --print-architecture)"}
 
NAME="$DIST"
if [ -n "${ARCH}" ]; then
    NAME="$NAME-$ARCH"
    DEBOOTSTRAPOPTS=("--arch" "$ARCH" "${DEBOOTSTRAPOPTS[@]}")
fi
# BASETGZ="/var/cache/pbuilder/$NAME-base.tgz"
# Optionally, set BASEPATH (and not BASETGZ) if using cowbuilder
BASEPATH="/var/cache/pbuilder/$NAME/base.cow/"
DISTRIBUTION="$DIST"
BUILDRESULT="/var/cache/pbuilder/$NAME/result/"
APTCACHE="/var/cache/pbuilder/$NAME/aptcache/"
BUILDPLACE="/var/cache/pbuilder/build/"
 
if $(echo ${DEBIAN_SUITES[@]} | grep -q $DIST); then
    # Debian configuration
    MIRRORSITE="http://$DEBIAN_MIRROR/debian/"
    COMPONENTS="main contrib non-free"
    DEBOOTSTRAPOPTS=("${DEBOOTSTRAPOPTS[@]}" "--keyring=/usr/share/keyrings/debian-archive-keyring.gpg")
 
elif $(echo ${UBUNTU_SUITES[@]} | grep -q $DIST); then
    # Ubuntu configuration
    MIRRORSITE="http://$UBUNTU_MIRROR/ubuntu/"
    COMPONENTS="main restricted universe multiverse"
    DEBOOTSTRAPOPTS=("${DEBOOTSTRAPOPTS[@]}" "--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg")
    OTHERMIRROR="deb http://ppa.launchpad.net/gnome-split-team/ppa/ubuntu raring main"
else
    echo "Unknown distribution: $DIST"
    exit 1
fi

Utilisation

Pour utiliser cowbuilder il faut posséder les droits d'administration. En effet, toutes les actions effectuées par cowbuilder sont faites dans le répertoire système /var/cache. Voici un exemple d'utilisation. On veut construire le paquet binaire fournissant GNOME Split pour Debian Testing et Ubuntu Oneiric Ocelot 11.10. On commence par préparer le paquet (ici il s'agit de sources préparés et d'un répertoire debian/ existant mais dans le cas d'un nouveau paquet, il faudra faire ce travail manuellement).

# User for Debian SVN repo
USER="testuser"
 
wget http://gnome-split.org/releases/gnome-split-1.1.tar.bz2
svn checkout svn+ssh://${USER}-guest@svn.debian.org/svn/pkg-java/trunk/gnome-split
 
mv gnome-split-1.1.tar.bz2 gnome-split_1.1.orig.tar.bz2
tar jxvf gnome-split_1.1.orig.tar.bz2
cp -r gnome-split/debian gnome-split-1.1

Le répertoire du paquet est prêt et le tarball des sources a été correctement renommé. On peut donc maintenant construire le paquet source.

cd gnome-split-1.1
debuild -S -us -uc

Ici on ne signe pas le paquet avec GPG mais avant un upload dans Debian ou tout autre dépôt il faut le faire. Cela permet de s'assurer que le paquet est bien le bon lorsque l'utilisateur le récupérera via APT.

Nous avons le paquet source de GNOME Split, nous allons donc maintenant construire le paquet binaire mais avant il faut mettre en place nos deux debootstraps : un pour Debian Testing et l'autre pour Ubuntu 11.10. Les actions suivantes sont à effectuer en root.

DIST="testing" cowbuilder --create
DIST="oneiric" cowbuilder --create

Cela va créer les deux environnements de compilation. La mise en place de ces environnements peut prendre un peu de temps (téléchargements des paquets, installation et configuration). Après une construction de paquet, ces environnements sont remis à leur état initial afin d'entamer une nouvelle compilation comme sur une machine vierge de toutes modifications.

Les environnements prêts, nous pouvons lancer la compilation du paquet binaire.

cd .. # Retour au répertoire contenant le fichier *.dsc
DIST="testing" cowbuilder --build *.dsc
DIST="oneiric" cowbuilder --build *.dsc

Le lancement de la compilation va provoquer l'utilisation du debootstrap approprié, télécharger les dépendances et lancer les règles définies pour construire le paquet Debian. Une fois l'opération terminée, on obtient les résultats dans un répertoire de la forme “/var/cache/pbuilder/${DIST}-${ARCH}/result/”.

Utilisation avec le dépôt Experimental

Pour utiliser le dépôt Experimental de Debian dans un environnement cowbuilder, on crée d'abord un debootstrap basé sur la version Unstable.

DIST="unstable" cowbuilder --create

Puis il faut se logger dans le debootstrap pour modifier le fichier sources.list de APT afin d'y ajouter le dépôt Experimental.

DIST="unstable" cowbuilder --login --save-after-login
echo "deb http://ftp.fr.debian.org/debian experimental main" >> /etc/apt/sources.list
exit

Puis il ne reste qu'à mettre à jour le cowbuilder pour qu'il prenne en compte la modification de la liste des dépôts.

DIST="unstable" cowbuilder --update

Si la prochaine compilation de paquet nécessite des dépendances qui ne se trouvent que dans Experimental, seules ces dépendances seront récupérés depuis ce dépôt, tout le reste continuera de provenir des dépôts de Unstable.