====== Créer un paquet Debian ====== * [[https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial]] * [[https://wiki.debian.org/DebianMentorsFaq#How_do_I_make_my_first_package.3F]] * https://mentors.debian.net/intro-maintainers * https://wiki.debian.org/Packaging/Intro * https://wiki.debian.org/Packaging * https://salsa.debian.org/ddp-team/dpb * [[https://wiki.debian.org/sbuild]] * [[https://wiki.debian.org/BuildingTutorial]] * [[https://wiki.debian.org/Teams/ReleaseTeam/Transitions|Transitions]] * [[https://anarc.at/software/debian-development/]] * [[https://blog.liw.fi/posts/2023/debian-reasons/|Why is Debian the way it is?]] * [[https://www.linuxembedded.fr/2024/04/introduction-au-paquetage-pour-debian|Introduction au 📦 paquetage pour Debian]] * [[https://optimizedbyotto.com/post/debian-maintainer-habits/|10 habits to help becoming a Debian maintainer]] * [[https://diziet.dreamwidth.org/10559.html|Debian’s approach to Rust - Dependency handling]] * [[https://samueloph.dev/personal_website_files/slides/samueloph_slides_2024_07_fixing_cves_on_debian.pdf|Fixing CVEs on Debian: Everything you probably know already]] * [[https://samueloph.dev/personal_website_files/slides/samueloph_slides_2024_08_the_secret_sauce_of_debian.pdf|The secret sauce of Debian]] * [[https://wiki.debian.org/BuildProfileSpec]] Paquets nécessaires: * ''build-essential'' * ''devscripts'' * ''dh-make'' ==== 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 '' clone le dépôt du paquet (champ Vcs-* du paquet source) * ''dget '' récupère le ''.deb'' du paquet (on peut l'extraire avec ''dpkg-deb -x .deb .'') * ''apt source '': 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 - Récupérer le paquet source: apt source - Construire le paquet: cd * 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''. * [[https://wiki.debian.org/sbuild]] * [[https://wiki.debian.org/Packaging/sbuild]] 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, [[linux:chroot#changer_le_repertoire_de_travail|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''. * [[https://wiki.debian.org/PackagingWithGit]] * [[https://wiki.debian.org/Gnome/Git]] * [[https://www.eyrie.org/~eagle/notes/debian/git.html]] * [[https://people.debian.org/~debalance/packaging-with-git.html]] * https://honk.sigxcpu.org/projects/git-buildpackage/manual-html/index.html * [[https://optimizedbyotto.com/post/debian-packaging-from-git/|Creating Debian packages from upstream Git]] * [[https://optimizedbyotto.com/post/debian-source-package-git/|Debian source packages in git explained]] Le plus simple pour démarrer est de construire le paquet hors de gbp, puis faire: apt source gbp import-dsc .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 : [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 [[https://salsa.debian.org/salsa-ci-team/pipeline#__do_not_save__|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 ==== * [[http://eriberto.pro.br/blog/2013/10/07/how-to-write-a-good-debianwatch-easily/]] * [[https://wiki.debian.org/debian/watch]] Tester: uscan --verbose --report ==== Gestion des patchs ==== * https://dep-team.pages.debian.net/deps/dep3/ === 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 === * https://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.patches.html 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 ==== * https://mentors.debian.net/sponsors/ * https://mentors.debian.net/intro-maintainers/ * https://wiki.debian.org/DebianDak 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'' : [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 ==== * https://wiki.debian.org/UsingSymbolsFiles 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_-.deb libfoo dpkg-gensymbols -v -plibfoo -Plibfoo -Olibfoo.symbols # ou (pour utiliser un fichier symbols existant) : dpkg-gensymbols -v -plibfoo -Plibfoo -Ofoo/debian/libfoo.symbols ==== Fichier copyright ==== * https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ * https://wiki.debian.org/CopyrightReviewTools Depuis la racine des sources d'un paquet, exécuter ''lrc'' (fourni par le paquet ''licenserecon''). ==== 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. ==== autopkgtest ==== * [[https://wiki.debian.org/ContinuousIntegration/autopkgtest|autopkgtest]] * [[https://lts-team.pages.debian.net/wiki/TestSuites/autopkgtest.html]] * [[https://asd.learnlearn.in/autopkgtest-tips/]] # 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. ==== Recontruire toutes les dépendances inverses ==== * [[https://github.com/Debian/ratt]] * [[https://lists.debian.org/debian-devel/2017/02/msg00175.html]] * [[https://github.com/ezhukov/testvm]] ''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 ==== Cross-build ==== * [[https://subdivi.de/~helmut/mdct24-cross.pdf]] * [[https://wiki.debian.org/CrossCompiling]] * [[https://wiki.debian.org/CrossBuildPackagingGuidelines]] * https://wiki.debian.org/CategoryMultiarch * [[https://wiki.debian.org/umlaeute/Packaging4CrossCompiling]] ==== Devenir un DM ou DD ==== * Mainteneur Debian : ne peut uploader que ses paquets sans RFS * Développeur Debian : peut uploader n'importe quel paquet * [[https://www.debian.org/doc/manuals/developers-reference/new-maintainer.fr.html|Référence des développeurs : Candidater pour devenir membre du projet]] * [[https://www.debian.org/devel/join/newmaint|Le coin des nouveaux membres Debian]] * [[https://wiki.debian.org/DebianMaintainer|DebianMaintainer]]