P-Builder, ou comment bien construire des paquets

Ce document décrit les étapes nécessaires pour mettre en place un environnement de construction sain pour construire des paquets Ubuntu. Cet outil est recommandé pour les mainteneurs Ubuntu comme pour toute personne utilisant Ubuntu et intéressée par la construction des paquets.

Il est possible de construire les paquets sans utiliser P-Builder, mais cela nécessite d'avoir installé au préalable sur votre système toutes les dépendances pour le compiler.

Installez le paquet pbuilder puis générez l'environnement pbuilder avec la commande :

sudo pbuilder --create
Cette commande aura pour effet de créer un environnement isolé de votre système, appelé « chroot ». Cet environnement est en fait l'image du système tout frais après installation. En utilisant pbuilder pour construire vos paquets, vous serez alors sûr que le paquet s'installe bien sur tous les systèmes, même une Ubuntu venant d'être installée et sur laquelle l'utilisateur n'a installé aucun paquet supplémentaire.

Construire le paquet « mon-paquet » se fait avec la commande suivante :

sudo pbuilder --build mon-paquet_1.0.dsc
Le fichier .dsc est une partie du paquet source - que pbuilder va utiliser pour construire le paquet binaire - est généré avec la commande debuild. Ceci est expliqué en détails dans la page de tutoriel traitant de la création de paquets

Le ou les paquets seront disponibles dans le dossier /var/cache/pbuilder/result/

Si vous obtenez l'erreur "debootstrap does not exist", installez debootstrap ou exécutez pbuilder avec l'option –debootstrap cdebootstrap (vous avez probablement cdebootstrap installé).

Il est recommandé de mettre à jour votre chroot avant chaque construction. Pour ce faire, utilisez la commande :

sudo pbuilder update

éditez le fichier /etc/pbuilderrc et décommentez la ligne

COMPONENTS="main restricted universe multiverse"

À chaque modification de votre pbuilder, il faut le mettre à jour en prenant en compte la nouvelle configuration :

sudo pbuilder update --override-config

Si vous êtes désireux de participer au cycle actuel de développement, vous allez vouloir un chroot gutsy. Quelquefois, il se peut que la version en développement ne soit pas installable directement. Dans ce cas, il vous faut d'abord installer la dernière version stable, puis mettre à niveau vers la version en développement.

C'est le cas (actuellement pour Gutsy Gibbon). Voici donc la procédure :

  • Créez un pbuilder Feisty : sudo pbuilder create
  • Changez toutes les occurrences de feisty en gutsy dans /etc/pbuilderrc
  • Mettez à jour le chroot : sudo pbuilder update –override-config
  • Utilisez l'option –override-config à chaque mise à jour (tant que la version n'est pas prise en compte par pbuilder)

Quand on travaille sur des paquets, il est souvent nécessaire de disposer de plusieurs pbuilders sur sa machine. Par exemple pour rétro-porter vers Dapper et Edgy alors que l'on développe sous Feisty, ou encore pour tester les paquets sur Debian Sid à la recherche de bogues.

Pour ce faire, le fichier /usr/share/doc/pbuilder/examples/pbuilder-distribution.sh va vous aider. Il contient par défaut :

#!/bin/sh
# script from Jamin W. Collins  BTS: #255165
# name this script 'pbuilder-woody', 'pbuilder-sid', 'pbuilder-sarge', 'pbuilder-experimental' etc.

OPERATION=$1
DISTRIBUTION=`basename $0 | cut -f2 -d '-'`
PROCEED=false
BASE_DIR="$HOME/pbuilder"
case $OPERATION in
   create|update|build|clean|login|execute )
      PROCEED=true
      ;;
esac
if ( $PROCEED == true ) then
   shift 
   sudo pbuilder $OPERATION \
      --basetgz $BASE_DIR/$DISTRIBUTION-base.tgz \
      --distribution $DISTRIBUTION \
      --buildresult $BASE_DIR/result $@
else
   echo "Invalid command..."
   echo "Valid commands are:"
   echo "   create"
   echo "   update"
   echo "   build"
   echo "   clean"
   echo "   login"
   echo "   execute"
   exit 1
fi

version améliorer avec config priver en personnalisant la config fonctionne sur Ubuntu Debian et Fedora l'exemple est donner pour la version LTS Ubuntu Jammy 22.04

mkdir -p $HOME/pbuilder
nano $HOME/pbuilder/pbuilder-config.conf
# pbuilder defaults; edit /etc/pbuilderrc to override these and see
# pbuilderrc.5 for documentation
#si sa marche pas changer $HOME en /home/votreutilisateur
BASE_DIR="$HOME/pbuilder"
#si la variable BASE_DIR ne marche pas remplacer la directement par /home/votreutilisateur
DISTRIBUTION=jammy
BASETGZ=$BASE_DIR/base-jammy.tgz
ARCHITECTURE=amd64
EXTRAPACKAGES="wget nano curl"
#export DEBIAN_BUILDARCH=athlon
BUILDPLACE=$BASE_DIR/jammy/build/
BUILDDIR=$BASE_DIR/jammy/build/
BUILDRESULT=$BASE_DIR/jammy/result/
APTCACHE="$BASE_DIR/jammy/aptcache/"
HOOKDIR="$BASE_DIR/jammy/hooks"
BUILD_HOME=$BASE_DIR/jammy/nonexistent
#export http_proxy=http://your-proxy:8080/
USESHM=yes
USEPROC=yes
USEDEVFS=no
USEDEVPTS=yes
USESYSFS=yes
USENETWORK=no
USECGROUP=yes
APTCACHEHARDLINK="yes"
REMOVEPACKAGES=""
EATMYDATA=no
export DEBIAN_FRONTEND="noninteractive"
BUILDSOURCEROOTCMD="fakeroot"
PBUILDERROOTCMD="sudo -E"
#PDEBUILD_PBUILDER="cowbuilder"
PBUILDERSATISFYDEPENDSCMD="/usr/lib/pbuilder/pbuilder-satisfydepends-apt"
ALLOWUNTRUSTED=no
export APTGETOPT=()
export APTITUDEOPT=()
DEBDELTA=no
#DEBBUILDOPTS="-IXXX -iXXX"
DEBBUILDOPTS="${DEBBUILDOPTS}"
APTCONFDIR=""
BUILDUSERNAME=pbuilder
BUILDUSERID=$(grep $BUILDUSERNAME /etc/passwd | cut -d: -f3)
BINDMOUNTS=""
DEBOOTSTRAPOPTS=(
    '--variant=buildd'
    '--force-check-gpg'
    )
# or unset it to make it not a buildd type.
# unset DEBOOTSTRAPOPTS
# Keyrings to use for package verification with apt, not used for debootstrap
# (use DEBOOTSTRAPOPTS). By default the debian-archive-keyring package inside
# the chroot is used.
APTKEYRINGS=()
# Set the PATH I am going to use inside pbuilder: default is "/usr/sbin:/usr/bin:/sbin:/bin"
export PATH="/usr/sbin:/usr/bin:/sbin:/bin"
# SHELL variable is used inside pbuilder by commands like 'su'; and they need sane values
export SHELL=/bin/bash
# The name of debootstrap command, you might want "cdebootstrap".
DEBOOTSTRAP="debootstrap"
PKGNAME_LOGFILE_EXTENSION="_$(dpkg --print-architecture).build"
PKGNAME_LOGFILE=""
AUTOCLEANAPTCACHE=""
COMPRESSPROG="gzip"
# pbuilder copies some configuration files (like /etc/hosts or /etc/hostname)
# from the host system into the chroot.  If the directory specified here
# exists and contains one of the copied files (without the leading /etc) that
# file will be copied from here instead of the system one
CONFDIR="/etc/pbuilder/conf_files"
# ccache (make sure ccache is installed before uncommenting)
CCACHEDIR=""
# Note: CCACHEDIR is private to pbuilder, ccache uses "CCACHE_DIR"
#CCACHEDIR="/var/cache/pbuilder/ccache"
#export CCACHE_DIR="${CCACHEDIR}"
#export PATH="/usr/lib/ccache:${PATH}"
#EXTRAPACKAGES=ccache
#BINDMOUNTS="${BINDMOUNTS} ${CCACHE_DIR}"
LOGLEVEL=I
USECOLORS=auto

installer le binaire

sudo nano /usr/bin/pbuilder-config
#!/bin/sh
# script from Jamin W. Collins  BTS: #255165
# script updated by andykimpe
# name this script 'pbuilder-woody', 'pbuilder-sid', 'pbuilder-sarge', 'pbuilder-experimental' etc.

OPERATION=$1
DISTRIBUTION=`basename $0 | cut -f2 -d '-'`
PROCEED=false
BASE_DIR="$HOME/pbuilder"
case $OPERATION in
   create|update|build|clean|login|execute )
      PROCEED=true
      ;;
esac
if ( $PROCEED == true ) then
   shift 
   sudo pbuilder $OPERATION \
   --distribution $DISTRIBUTION \
   --basetgz /root/pbuilder/base-$DISTRIBUTION.tgz \
   --configfile $BASE_DIR/pbuilder-$DISTRIBUTION.conf  $@
else
   echo "Invalid command..."
   echo "Valid commands are:"
   echo "   create"
   echo "   update"
   echo "   build"
   echo "   clean"
   echo "   login"
   echo "   execute"
   exit 1
fi

fonction utile pour créer des multiple rapidement

#!/bin/bash
ubuntuori () {
   rm -f $HOME/pbuilder/pbuilder-$1.conf
   cp $HOME/pbuilder/pbuilder-config.conf $HOME/pbuilder/pbuilder-$1.conf
   sudo rm -f /usr/bin/pbuilder-$1
   sudo cp /usr/bin/pbuilder-config /usr/bin/pbuilder-$1
   sudo chmod +x /usr/bin/pbuilder-$1
   mkdir -p $HOME/pbuilder/$1
   mkdir -p $HOME/pbuilder/$1/aptcache/
   mkdir -p $HOME/pbuilder/$1/result/
   mkdir -p $HOME/pbuilder/$1/build/
   mkdir -p $HOME/pbuilder/$1/nonexistent/
   mkdir -p $HOME/pbuilder/$1/hooks/
   sed -i 's|bionic|'$1'|g' $HOME/pbuilder/pbuilder-$1.conf
   echo 'MIRRORSITE=http://archive.ubuntu.com/ubuntu' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'COMPONENTS="main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="deb-src http://archive.ubuntu.com/ubuntu/ '$1' main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb http://security.ubuntu.com/ubuntu '$1'-security main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://security.ubuntu.com/ubuntu '$1'-security main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://archive.ubuntu.com/ubuntu/ '$1'-updates main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb http://archive.ubuntu.com/ubuntu/ '$1'-updates main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://security.ubuntu.com/ubuntu '$1'-security main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb http://archive.canonical.com/ubuntu '$1' partner"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://archive.canonical.com/ubuntu '$1' partner"' >> $HOME/pbuilder/pbuilder-$1.conf
   sudo pbuilder-$1 create --override-config
}
ubuntuarc () {
   rm -f $HOME/pbuilder/pbuilder-$1.conf
   cp $HOME/pbuilder/pbuilder-config.conf $HOME/pbuilder/pbuilder-$1.conf
   sudo rm -f /usr/bin/pbuilder-$1
   sudo cp /usr/bin/pbuilder-config /usr/bin/pbuilder-$1
   sudo chmod +x /usr/bin/pbuilder-$1
   mkdir -p $HOME/pbuilder/$1
   mkdir -p $HOME/pbuilder/$1/aptcache/
   mkdir -p $HOME/pbuilder/$1/result/
   mkdir -p $HOME/pbuilder/$1/build/
   mkdir -p $HOME/pbuilder/$1/nonexistent/
   mkdir -p $HOME/pbuilder/$1/hooks/
   sed -i 's|bionic|'$1'|g' $HOME/pbuilder/pbuilder-$1.conf
   echo 'MIRRORSITE=https://old-releases.ubuntu.com/ubuntu' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'COMPONENTS="main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="deb-src https://old-releases.ubuntu.com/ubuntu/ '$1' main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb https://old-releases.ubuntu.com/ubuntu '$1'-security main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src https://old-releases.ubuntu.com/ubuntu '$1'-security main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src https://old-releases.ubuntu.com/ubuntu/ '$1'-updates main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb https://old-releases.ubuntu.com/ubuntu/ '$1'-updates main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src https://old-releases.ubuntu.com/ubuntu '$1'-security main restricted universe multiverse"' >> $HOME/pbuilder/pbuilder-$1.conf
   sudo pbuilder-$1 create --override-config
}
debianori () {
   rm -f $HOME/pbuilder/pbuilder-$1.conf
   cp $HOME/pbuilder/pbuilder-config.conf $HOME/pbuilder/pbuilder-$1.conf
   sudo rm -f /usr/bin/pbuilder-$1
   sudo cp /usr/bin/pbuilder-config /usr/bin/pbuilder-$1
   sudo chmod +x /usr/bin/pbuilder-$1
   mkdir -p $HOME/pbuilder/$1
   mkdir -p $HOME/pbuilder/$1/aptcache/
   mkdir -p $HOME/pbuilder/$1/result/
   mkdir -p $HOME/pbuilder/$1/build/
   mkdir -p $HOME/pbuilder/$1/nonexistent/
   mkdir -p $HOME/pbuilder/$1/hooks/
   sed -i 's|bionic|'$1'|g' $HOME/pbuilder/pbuilder-$1.conf
   echo 'MIRRORSITE=http://deb.debian.org/debian/' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'COMPONENTS="main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="deb http://deb.debian.org/debian '$1' main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://deb.debian.org/debian '$1' main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb http://deb.debian.org/debian-security/ '$1'-security main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://deb.debian.org/debian-security/ '$1'-security main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb http://deb.debian.org/debian '$1'-updates main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://deb.debian.org/debian '$1'-updates main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb http://deb.debian.org/debian '$1'--backports/ main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'OTHERMIRROR="$OTHERMIRROR|deb-src http://deb.debian.org/debian '$1'--backports/ main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   sudo pbuilder-$1 create --override-config
}
debianarc () {
   rm -f $HOME/pbuilder/pbuilder-$1.conf
   cp $HOME/pbuilder/pbuilder-config.conf $HOME/pbuilder/pbuilder-$1.conf
   sudo rm -f /usr/bin/pbuilder-$1
   sudo cp /usr/bin/pbuilder-config /usr/bin/pbuilder-$1
   sudo chmod +x /usr/bin/pbuilder-$1
   mkdir -p $HOME/pbuilder/$1
   mkdir -p $HOME/pbuilder/$1/aptcache/
   mkdir -p $HOME/pbuilder/$1/result/
   mkdir -p $HOME/pbuilder/$1/build/
   mkdir -p $HOME/pbuilder/$1/nonexistent/
   mkdir -p $HOME/pbuilder/$1/hooks/
   sed -i 's|bionic|'$1'|g' $HOME/pbuilder/pbuilder-$1.conf
   echo 'MIRRORSITE=http://archive.debian.org/debian/' >> $HOME/pbuilder/pbuilder-$1.conf
   echo 'COMPONENTS="main contrib non-free"' >> $HOME/pbuilder/pbuilder-$1.conf
   sudo pbuilder-$1 create --override-config
}
# Ubuntu 24.04 The Noble Numbat (le Noble numbat) support Avril 2029
sudo rm -f /usr/share/debootstrap/scripts/noble
sudo cp /usr/share/debootstrap/scripts/jammy /usr/share/debootstrap/scripts/noble
ubuntuori noble
#Ubuntu 23.10 The Mantic Minotaur (le Minotaure mantique) support Juillet 2024
sudo rm -f /usr/share/debootstrap/scripts/mantic
sudo cp /usr/share/debootstrap/scripts/jammy /usr/share/debootstrap/scripts/mantic
ubuntuori mantic
#Ubuntu 23.04 The Lunar Lobster (le Homard lunaire) support Janvier 2024
rm -f /usr/share/debootstrap/scripts/lunar
cp /usr/share/debootstrap/scripts/jammy /usr/share/debootstrap/scripts/lunar
ubuntuori lunar
#Ubuntu 22.10 The Kinetic Kudu (le Koudou cinétique) support 20 Juillet 2023 
rm -f /usr/share/debootstrap/scripts/kinetic
cp /usr/share/debootstrap/scripts/jammy /usr/share/debootstrap/scripts/kinetic
ubuntuarc kinetic
#Ubuntu 22.04 LTS The Jammy Jellyfish (la méduse chanceuse) support Avril 2027
ubuntuori jammy
#
ubuntuarc impish
#
ubuntuarc hirsute
#
ubuntuarc groovy
#
ubuntuori focal
#
ubuntuarc eoan
#
ubuntuarc disco
#
ubuntuarc cosmic
#
ubuntuori bionic
#
ubuntuarc artful
ubuntuarc zesty
ubuntuarc yakkety
ubuntuori xenial
ubuntuarc wily
ubuntuarc vivid
ubuntuarc utopic
ubuntuori trusty
ubuntuarc saucy
ubuntuarc raring
ubuntuarc quantal
ubuntuori precise
ubuntuarc oneiric
ubuntuarc natty
ubuntuarc maverick
ubuntuori lucid
ubuntuarc karmic
ubuntuarc jaunty
ubuntuarc intrepid
ubuntuori hardy
ubuntuarc gutsy
ubuntuarc feisty
ubuntuarc edgy
ubuntuori dapper
ubuntuarc breezy
debianori bookworm
debianori bullseye
debianori buster
debianarc stretch
debianarc jessie
debianarc wheezy
debianarc squeeze
debianarc lenny
debianarc etch
debianarc sarge
debianarc woody
debianarc potato
debianarc slink
debianarc hamm

Copiez ce fichier dans /usr/local/bin en remplaçant distribution par le nom de la version d'Ubuntu voulue.
Par exemple pour créer un pbuilder Dapper, vous le nommerez pbuilder-dapper :

sudo cp /usr/share/doc/pbuilder/examples/pbuilder-distribution.sh /usr/local/bin/pbuilder-dapper
Ce même script renommé en pbuilder-edgy par exemple, créerai un pbuilder edgy. En effet, le script récupère le nom de distribution que vous avez mis après le tiret dans le nom de fichier.

Répertoire de base des pbuilders

Le dossier utilisé par défaut pour les pbuilders est /var/cache/pbuilder/. Nous allons donc modifier le script et remplacer la ligne

BASE_DIR="$HOME/pbuilder"

par

BASE_DIR="/var/cache/pbuilder"

Enfin, n'oubliez pas de rendre votre script exécutable :

sudo chmod +x /usr/local/bin/pbuilder-dapper

Enfin créez le chroot du pbuilder :

sudo pbuilder-dapper create
  • pbuilder.txt
  • Dernière modification: Le 15/11/2023, 12:23
  • par andykimpe