Ceci est une ancienne révision du document !
Créer un paquet Debian
Paquets nécessaires:
build-essentialdevscriptsdh-make
- Mainteneur Debian : ne peut uploader que ses paquets sans RFS
- Développeur Debian : peut uploader n'importe quel paquet
Documentations
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 |
Récupérer un paquet
debcheckout <paquet>clone le dépôt du paquet (champ Vcs-* du paquet source)dget <paquet>récupère le.debdu paquet (on peut l'extraire avecdpkg-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)
Reconstruction de paquet
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…
- Obtenir les paquets nécessaires à la construction:
apt build-dep <paquet>
- Récupérer le paquet source:
apt source <paquet>
- 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
Environnements vierges
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
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 unstable /media/linux/chroots/unstable-sbuild http://127.0.0.1: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
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
git-buildpackage
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
dch
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
uscan
Tester:
uscan --verbose --report
Gestion des patchs
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.
Upload & sponsor
Construire le paquet en le signant :
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 de symboles
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
Fichier copyright
Savoir si un ITP ou RFP existe
wnpp-check $paquet # provient du paquet devscripts
Reproduciblité
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
Liaison avec des bibliothèques statiques
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.