linux:create_debian_package

Ceci est une ancienne révision du document !


Créer un paquet Debian

Une liste plutôt complète ici : https://www.debian.org/doc/devel-manuals

À partir de https://mentors.debian.net/intro-maintainers/ et https://www.debian.org/doc/manuals/developers-reference/tools.fr.html#documentation-and-information :

Titre Contenu URL Paquet URL locale
La Charte Debian Le manuel de la charte Debian contient l'ensemble des règles relatives aux paquets et des détails du mécanisme de l'empaquetage. Il couvre tout, des options requises de gcc à la manière dont les scripts du responsable (postinst, etc.) fonctionnent, aux sections et priorités des paquets, etc. https://www.debian.org/doc/debian-policy/ debian-policy file:///usr/share/doc/debian-policy/policy.html/index.html
Guide du nouveau responsable Debian Ce document tente de décrire aux utilisateurs ordinaires de Debian et aux développeurs en devenir, la construction d'un paquet Debian. Il utilise un langage peu technique et est complété par des exemples pratiques. https://www.debian.org/doc/manuals/maint-guide/ maint-guide-fr file:///usr/share/doc/maint-guide-fr/html/index.fr.html
Guide pour les responsables de paquet Debian Ce tutoriel décrit la construction de paquet Debian pour les utilisateurs Debian et les développeurs potentiels, en utilisant la commande debmake. Successeur du Guide du nouveau responsable Debian. https://www.debian.org/doc/manuals/debmake-doc/index.en.html debmake-doc file:///usr/share/doc/debmake-doc/html/index.en.html
Guide de référence pour Debian Le guide de référence du développeur pour Debian, un ensemble de règles et de bonnes pratiques qui ont été établies par et pour la communauté des développeurs Debian. https://www.debian.org/doc/manuals/developers-reference/ developers-reference-fr file:///usr/share/developers-reference/fr/index.html
  • debcheckout <paquet> clone le dépôt du paquet (champ Vcs-* du paquet source)
  • dget <paquet> récupère le .deb du paquet (on peut l'extraire avec dpkg-deb -x <paquet>.deb .)
  • apt source <paquet>: récupère les sources du paquet (dossier des sources, le fichier dsc, le orig.tar.xz et le debian.tar.xz)

La construction doit se faire sur un système de fichiers qui supporte les permissions: debuild n'aime pas que tous les fichiers aient un droit en exécution…

  1. Obtenir les paquets nécessaires à la construction:
    apt build-dep <paquet>
  2. Récupérer le paquet source:
    apt source <paquet>
  3. Construire le paquet:
    cd <paquet>*
    debuild -us -uc # ces deux options évitent de signer le paquet

Si on a :

  • le fichier .dsc
  • le fichier .debian.tar.xz
  • le fichier .orig.tar.gz

il est possible construire le dossier des sources du paquet Debian avec la commande suivante :

dpkg-source -x fichier.dsc

pbuilder est un outil pour automatiquement construire des chroots pour créer des paquets. cowbuilder est un wrapper par-dessus pbuilder pour faciliter son utilisation. sbuild est une alternative à ce couple, reposant sur schroot.

apt install sbuild piuparts

Créer le fichier de configuration ~/.sbuildrc:

##############################################################################
# PACKAGE BUILD RELATED (additionally produce _source.changes)
##############################################################################
# -d
$distribution = 'unstable';
# -A
$build_arch_all = 1;
# -s
$build_source = 1;
# --source-only-changes (applicable for dput. irrelevant for dgit push-source).
$source_only_changes = 1;
# -v
$verbose = 1;
# parallel build
$ENV{'DEB_BUILD_OPTIONS'} = 'parallel=5';
##############################################################################
# POST-BUILD RELATED (turn off functionality by setting variables to 0)
##############################################################################
$run_lintian = 1;
$lintian_opts = ['-i', '-I'];
$run_piuparts = 1;
$piuparts_opts = ['--schroot', '%r-%a-sbuild', '--no-eatmydata'];
$run_autopkgtest = 1;
$autopkgtest_root_args = '';
$autopkgtest_opts = [ '--', 'schroot', '%r-%a-sbuild' ];
 
##############################################################################
# PERL MAGIC
##############################################################################
1;

S'ajouter au groupe:

sudo sbuild-adduser $LOGNAME

Se reconnecter, ou appeler:

newgrp sbuild

Créer le premier chroot:

sudo sbuild-createchroot --include=eatmydata,ccache unstable /media/linux/chroots/unstable-amd64-sbuild http://192.168.1.55:3142/ftp.fr.debian.org/debian

Faire dans le dossier d'un paquet Debian:

sbuild

piuparts doit être lancé en root, il est donc normal que sbuild s'interrompt pour demander le mot de passe avec un prompt sudo.

Il est possible de préciser avec quelle suite lancer sbuild (le schroot correspond doit avoir été créé auparavant) :

sbuild -d testing

Créer un chroot pour backports :

sudo sbuild-createchroot --include=eatmydata,ccache --extra-repository="deb http://192.168.1.55:3142/ftp.fr.debian.org/debian bookworm-backports main" --chroot-prefix=bookworm-backports bookworm /media/linux/chroots/bookworm-backports-amd64-sbuild http://192.168.1.55:3142/ftp.fr.debian.org/debian

On peut ensuite l'utiliser avec :

sbuild -d bookworm-backports

Supprimer un chroot

sudo rm -r /srv/chroot/unstable-amd64-sbuild/
sudo rm /etc/schroot/chroot.d/unstable-amd64-sbuild-* /etc/sbuild/chroot/unstable-amd64-sbuild

Mettre à jour un chroot

sudo sbuild-update -udcar u

-udcar exécute apt-get update && apt-get dist-upgrade && apt-get clean && apt-get autoclean && apt-get autoremove; u est un raccourci pour unstable, qui est le nom du chroot à mettre à jour.

Changer le répertoire de travail

Par défaut, sbuild fait des lectures et écritures dans le dossier /var/lib/sbuild. Pour changer ça, changer le répertoire travail de schroot, puis changer dans /etc/schroot/sbuild/fstab :

# /var/lib/sbuild/build  /build   none    rw,bind         0       0
# changer la ligne précédente en la ligne suivante, par exemple :
/media/linux/sbuild/build  /build   none    rw,bind         0       0

Installer le paquet git-buildpackage.

Le plus simple pour démarrer est de construire le paquet hors de gbp, puis faire:

apt source <package>
gbp import-dsc <package>.dsc

Pour mettre en place gbp dans un paquet déjà existant, avec l'upstream qui utilise Git:

apt source dia
git clone -o upstream https://gitlab.gnome.org/GNOME/dia.git
cd dia
git config user.name "Philippe ..."
git checkout d38cd9a6c295c19a58d5348a0098df94df3e8639 # se place sur la version upstream qui est actuellement packagée dans Debian
git checkout -b upstream/latest
git checkout -b debian/master
gbp import-orig --pristine-tar ../dia_0.97.3+git20160930.orig.tar.xz --upstream-vcs-tag=d38cd9a6c295c19a58d5348a0098df94df3e8639 --upstream-branch=upstream/latest --debian-branch=debian/master

Si la version packagée est identifiable par un tag Git dans l'upstream, il suffit de faire:

git clone -o upstream https://gitlab.gnome.org/GNOME/dia.git -b DIA_0_97_2
# ...
# pas de git checkout commit (le git clone l'a déjà fait avec l'option -b)
# ...
gbp import-orig --pristine-tar ../dia_0.97.3+git20160930.orig.tar.xz --upstream-vcs-tag=DIA_0_97_2 --upstream-branch=upstream/latest --debian-branch=debian/master

Cas où :

  • un paquet Debian existe, mais n'utilise pas gbp,
  • upstream utilise Git, mais ne fait de releases et/ou n'utilise pas de tag pour identifier les releases,
  • le paquet Debian existant utilise un commit particulier de upstream
git clone -o upstream https://gitlab.gnome.org/GNOME/dia.git
apt source dia  # pour récupérer le dossier debian/ actuellement en place dans le paquet
cd dia
git branch -m upstream/latest  # on renomme la branche master, contiendra les sources telles que fournies par upstream
git checkout -b debian/master d38cd9a6c295c19a58d5348a0098df94df3e8639  # on crée la branche pour le contenu spécifique à Debian en partant du commit utilisé pour le paquet actuel
cp -r ../dia-0.97.3+git20160930/debian .
git add debian/*
git commit
git checkout -b pristine-tar
git checkout debian/master
git tag upstream/0.97.3+git20160930 d38cd9a6c295c19a58d5348a0098df94df3e8639  # gbp va se servir de la dernière version dans d/changelog pour trouver le tag correspondant. Puisqu'il n'existe pas dans upstream, il faut le créer nous-même.
rm ../dia_0.97.3+git20160930.orig.tar.*  # sinon dpkg-source se plaint qu'il y a plusieurs orig.tar présents
gbp buildpackage --git-pristine-tar --git-pristine-tar-commit --git-debian-branch=debian/master --git-upstream-branch=upstream/latest

On peut ensuite ajouter la configuration de gbp dans le paquet :

debian/gbp.conf
[DEFAULT]
pristine-tar = True
debian-branch = debian/master
upstream-branch = upstream/latest

Penser à ajouter une entrée au changelog :

dch -t --no-auto-nmu "Use gbp to manage the source package"

Utiliser une nouvelle version upstream :

git checkout upstream/latest
git pull upstream master
git tag upstream/version commit
git checkout debian/master
git merge upstream/version # le tag nouvellement créé
dch -e # Mettre à jour la version du paquet (doit terminer par -1, ajouter l'entrée "New upstream snapshot")
# commiter (ne serait-ce que temporairement)
gbp buildpackage --git-pristine-tar --git-pristine-tar-commit  # construit le *.orig.tar.gz dans le dossier parent, nécessaire pour exécuter sbuild ensuite

Créer le projet sur Salsa, ajouter le remote au dépôt. On peut utilise gbp pour pusher, mais il ne pushe pas tout :

gbp push
git push -u origin debian/master
git checkout upstream/latest
git push origin

Dans les paramètres Salsa, définir debian/master comme la branche par défaut. Dans les paramètres de la CI, utiliser recipes/debian.yml@salsa-ci-team/pipeline comme fichier de configuration à utiliser (voir la documentation).

Cas standard

Où :

  • le paquet existe déjà
  • un dépôt Git pour le paquet est déjà mis en place
  • les releases du logiciel sont packagées
gbp clone ${depot_salsa}

Pour mettre à jour vers une nouvelle release :

gbp import-orig --uscan

Permet de gérer les entrées de debian/changelog (aucune interaction avec le dépôt Git).

Options:

  • -t: ne modifie pas la ligne de fin des entrées du changelog (auteur et date)
  • --no-auto-nmu: ne fait pas une entrée NMU

Avec quilt

Installer le paquet quilt.

Mettre dans son .zshrc :

alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
complete -F _quilt_completion $_quilt_complete_opt dquilt

Dans le fichier ~/.quiltrc-dpkg :

d=.
while [ ! -d $d/debian -a `readlink -e $d` != / ];
    do d=$d/..; done
if [ -d $d/debian ] && [ -z $QUILT_PATCHES ]; then
    # if in Debian packaging tree with unset $QUILT_PATCHES
    QUILT_PATCHES="debian/patches"
    QUILT_PATCH_OPTS="--reject-format=unified"
    QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
    QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
    QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
    if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
fi

Avec gbp

Pour générer une branche dédiée aux patches, avec l'équivalence un commit = un patch, depuis debian/patches:

gbb pq import

Cela bascule sur une branche qui contient tous les patches appliqués aux sources. On manipule cette branche en rebasant. Une fois que le travail est terminé, on génère le contenu du dossier debian/patches:

gbp pq export

Qui nous ramène sur la branche précédente.

Construire le paquet en le signant (le paquet ne sera pas signé si la distribution ciblée est UNRELEASED) :

debuild

Après avoir configuré dput :

~/.config/dput/dput.cf
[mentors]
fqdn = mentors.debian.net
incoming = /upload
method = https
allow_unsigned_uploads = 0
progress_indicator = 2
# Allow uploads for UNRELEASED packages
allowed_distributions = .*
dput mentors paquet.changes

Il faut envoyer les changements correspondant au paquet source. Si besoin, ajouter l'option -S à debuild.

Attendre le mail de mentors.debian.net pour envoyer le RFS.

Pour savoir qui a uploadé un paquet :

who-uploads $paquet

Fichier qui contient la liste des symboles publiques exposés par une bibliothèque, avec la version dans laquelle le symbole a été introduit.

Pour générer les fichiers de symboles :

dpkg-deb -x libfoo_<version>-<rev>.deb libfoo
dpkg-gensymbols -v<version> -plibfoo -Plibfoo -Olibfoo.symbols
# ou (pour utiliser un fichier symbols existant) :
dpkg-gensymbols -v<version> -plibfoo -Plibfoo -Ofoo/debian/libfoo.symbols

Depuis la racine des sources d'un paquet, exécuter lrc (fourni par le paquet licenserecon).

wnpp-check $paquet  # provient du paquet devscripts

Tester la reproducibilité

Se placer dans le dossier des sources d'un paquet Debian (idéalement pas le dépôt Git, mais utiliser dpkg-source -x) :

reprotest . --min-cpus=8

Date dans les PDFs

Si le code LaTeX d'un PDF contient \today, ajouter au fichier debian/rules :

export FORCE_SOURCE_DATE = 1

Si le paquet distribue un binaire qui inclut une bibliothèque statique provenant d'un autre paquet, il faut ajout un champ Built-Using au fichier debian/control :

Built-Using: ${built-using}

Dans le fichier debian/rules, on peut utiliser les commandes suivantes pour attribuer une valeur à la variable :

BUILT_USING := $(shell dpkg-query -f '$${source:Package} (= $${source:Version}), ' -W spirv-tools glslang-dev)
 
override_dh_gencontrol:
        dh_gencontrol -- -V"built-using=$(BUILT_USING)"

Voir par exemple les paquets sash ou espeakup qui utilisent cet attribut.

# dans le dossier des sources du paquet :
sudo AUTOPKGTEST_APT_PROXY=http://192.168.1.55:3142 autopkgtest ../paquet.changes -- null

Attention, ça semble installer le paquet sur le système.

build-rdeps liste les dépendances inverses d'un paquet binaire, on peut donc lister toutes les dépendances inverses d'un paquet source avec :

build-rdeps --distribution unstable --only-main $(grep Package debian/control | cut -d ' ' -f 2)

Ensuite pour reconstruire un paquet en incluant un paquet .deb construit localement :

sbuild --extra-package=/abolute/path/package_amd64.deb --extra-package=/absolute/path/package-dev_amd64.deb otherpackage
  • Mainteneur Debian : ne peut uploader que ses paquets sans RFS
  • Développeur Debian : peut uploader n'importe quel paquet
  • linux/create_debian_package.1761415380.txt.gz
  • Dernière modification : 2025/10/25 20:03
  • de phsw