Sources :
Je vous encourage à lire l’excellent « BuildingTutorial » du wiki Debian dont les commandes et la trame principal sont reprisent dans cet article si vous voulez faire les chose proprement (générer un paquet que vous pourrez redistribuer). Et notamment la section « Edit the source code ».
généralitées
paquet source
Un paquet source est constitué de :
- ….dsc
- metadata, checksum et signature du paquet source et de ces différents composants
- ….orig.tar.gz
- code source du logiciel empaqueté, upstream, non modifié
- ….debian.tar.xz
- contient le répertoire
debiandans lequel se trouve tous les patches, recettes et metadata nécessaire à la création du paquet. Les fichier/dossier contenu dans ce dossier sont décrit dans les chapitres Required files under the debian directory et Other files under the debian directory de la documentation officiel.
Pour récupérer ces fichier vous pouvez aller sur packages.debian.org ou utiliser la commande suivante :
max@testhost % apt-get source P=V-D
packages.debian.org
Rendez-vous sur le site debian.org pour rechercher un paquet.
Une fois le paquet trouvé, rechercher “Download Source Package” dans la page pour obtenir l’url du paquet source.
Le lien « Developer Information (PTS) » mène à l’un des tracker du paquets (nouveau, ancien).
Dans ces trackers on peut trouver un lien vers le dépôt git du répertoire debian du paquet.
build
Sources :
Compiler un paquet à partir des sources :
max@testhost % wget P_V-D.dsc
max@testhost % wget P_V.orig.tar.gz
max@testhost % wget P_V-D.debian.tar.xz
max@testhost % dpkg-source --no-check -x P_V-D.dsc
max@testhost % cd P-V
max@testhost % sudo mk-build-deps -i -r debian/control
max@testhost % debuild -us -uc
dpkg-source -x extrait les archives et appliques les patches contenu debian au sources upstream.
Sans dpkg-source :
max@testhost % wget P_V.orig.tar.gz
max@testhost % wget P_V-D.debian.tar.xz
max@testhost % mkdir P-V
max@testhost % cd P-V
max@testhost % tar xvaf ../P_V.orig.tar.gz
max@testhost % tar xvaf ../P_V-D.debian.tar.xz
max@testhost % sudo mk-build-deps -i -r debian/control
max@testhost % cat debian/patches/series
max@testhost % patch …
max@testhost % debuild -us -uc
Attention, le dossier doit bien s’appeler « P-V » (l’archive upstream s’appelant P_V.orig.tar.gz).
La list des patchs à appliquer peut aussi se trouver dans le fichier debian/patches/debian.series (man dpkg-source).
mk-build-deps
mk-build-deps -i -r debian/control créé un meta-packet avec les dépendance décrite dans le fichier control, l’installe (-i) puis le supprime (-r).
Si mk-build-deps -i -r debian/control ne fonctionne pas, on peut installé manuellement le meta-packet créé par mk-build-deps et voir ce qui ne vas pas.
root@testhost # mk-build-deps debian/control
root@testhost # dpkg --unpack …deb
root@testhost # apt-get -f install
debuild
Source : Building debian package
Quelques notes sur la commande debuild.
debuild [options_debuild] [options_dpkg-buildpackage] [--lintian-opts options_lintian]
Attention, l’ordre des options est importante. Il faut d’abord mettre toutes les options debuild, puis celles dpkg-buildpackage et enfin celles de lintian.
Options intéressantes :
-e: permet de passer une variable d’environment à debian/rules ; e.g.debuild -e"DEBIAN_VARNISH_SRC=/home/userbuild/varnish/…"-us: unsigned source package (cf.dpkg-buildpackage -h)-uc: unsigned .changes file (cf.dpkg-buildpackage -h)-b: binary-only, do not build source (cf.dpkg-buildpackage -h)-i: Options passed to dpkg-source : -i[] ignore diffs of files matching regex (cf.dpkg-buildpackage -h)
Parfois debuild (j’ai eu les deux cas) à besoin que le fichier ….orig.tar.gz soit présent dans le dossier parent, il a aussi besoin des sources patchées dans le dossier courant.
Il ne re-génère pas le fichier ….orig.tar.gz.
Pour que debuild fonctionne correctement, il faut que le répertoire de build ne contienne rien si ce n’est les sources du paquet.
Lancer un git clean -dfx avant debuild est généralement une bonne idée.
binaire precompilé
Sources :
Cette méthode permet d’empaqueter des binaires précompilé. C’est une méthode “manuel”, pour faire des paquets un peu à la shlag… je déconseille mais ça peu s’avérer pratique.
On va juste créer un dossier DEBIAN dans le l’arborescence de fichiers qui doit être créé à l’installation du paquet.
Ce dossier DEBIAN doit contenir au moins le fichier control, contenant à minima :
- Package: le nom du paquet
- Version: la version du paquet
- Section: une des sections de paquets debian
- Priority: Essential, Required, Important, Standard, Optional ou Extra. Logiquement, si c’est un package que vous ajoutez, ce sera “optional”.
- Architecture: l’architecture pour laquelle vous construisez le paquet (any, i486, amd64…).
- Depends: liste des dépendances du package, sous la forme “foo, bar, baz (>=2.15)”
- Maintainer: votre nom
- Description: une description du soft installé
Pour créer se dossier on peut utiliser dh_make (paquet dh-make) puis renommer le dossier debian en DEBIAN.
Une fois ce dossier créé on utilise fakeroot (ou sudo) et dpkg-deb pour empaqueter l’arborescence.
root@debian:~# tree --noreport aaa/
aaa/
|-- DEBIAN
| |-- control
|-- etc
| `-- …
|-- lib
| `-- …
`-- usr
`-- …
root@debian:~# dpkg-deb --build aaa/ toto.deb
dpkg-deb: building package 'superpackage' in 'toto.deb'.
Voir prometheus-apache-exporter pour un exemple concret.
checkinstall
checkinstall permet de générer simplement un nouveau paquet à partir de source upstream.
max@testhost % tar -xvaf ….tar.gz
max@testhost % cd …
max@testhost % ./configure
max@testhost % make
max@testhost % checkinstall --install=no
Exemple avec le paquet php-cld :
root@debian-8-test:/test/php-cld# # je créé le fichier ini de l'extention php car celui-ci
root@debian-8-test:/test/php-cld# # n'est pas contenu dans les sources
root@debian-8-test:/test/php-cld# mkdir -p `dirname /usr/share/php5/cld/cld.ini`
root@debian-8-test:/test/php-cld# cat > /usr/share/php5/cld/cld.ini
; configuration for php CLD module
; priority=20
extension=cld.so
^C
root@debian-8-test:/test/php-cld# # création de la documentation et de la description du paquet
root@debian-8-test:/test/php-cld# mkdir doc-pak
root@debian-8-test:/test/php-cld# cat > doc-pak/README
…
^C
root@debian-8-test:/test/php-cld# cat > description-pak
This small extension provides bindings to use the Chromium Compact Language Detector in PHP.
^C
root@debian-8-test:/test/php-cld# # ajout de bibliothèque nécessaire au paquet mais non installé par `make install`
root@debian-8-test:/test/php-cld# echo '/usr/lib/x86_64-linux-gnu/libcld2.so' > checkinstall-include
root@debian-8-test:/test/php-cld# echo '/usr/lib/x86_64-linux-gnu/libcld2_full.so' >> checkinstall-include
root@debian-8-test:/test/php-cld# echo '/usr/share/php5/cld/cld.ini' >> checkinstall-include
root@debian-8-test:/test/php-cld# checkinstall --install=no --pkgname 'php5-cld' --pkgversion 20170327 --pkgrelease 1 --pkglicense BSD --pkgsource 'https://…' --maintainer 'maxime.deroucy@google.com' --requires php5-common --include=checkinstall-include
checkinstall 1.6.2, Copyright 2009 …
…
root@debian-8-test:/test/php-cld# dpkg -c php5-cld_20170327-1_amd64.deb
drwxr-xr-x root/root 0 2017-03-27 13:54 ./
drwxr-xr-x root/root 0 2017-03-27 13:54 ./usr/
drwxr-xr-x root/root 0 2017-03-27 11:50 ./usr/share/
drwxr-xr-x root/root 0 2017-03-27 13:54 ./usr/share/doc/
drwxr-xr-x root/root 0 2017-03-27 13:34 ./usr/share/doc/php5-cld/
-rw-r--r-- root/root 191 2017-03-27 12:26 ./usr/share/doc/php5-cld/README
drwxr-xr-x root/root 0 2017-03-27 13:52 ./usr/share/php5/
drwxr-xr-x root/root 0 2017-03-27 13:54 ./usr/share/php5/cld/
-rw-r--r-- root/root 66 2017-03-27 13:52 ./usr/share/php5/cld/cld.ini
drwxr-xr-x root/root 0 2017-03-27 13:54 ./usr/lib/
drwxr-xr-x root/root 0 2017-03-27 13:54 ./usr/lib/x86_64-linux-gnu/
-rwxr-xr-x root/staff 1865216 2017-03-27 11:58 ./usr/lib/x86_64-linux-gnu/libcld2.so
-rwxr-xr-x root/staff 6542848 2017-03-27 11:58 ./usr/lib/x86_64-linux-gnu/libcld2_full.so
drwxr-xr-x root/root 0 2017-03-27 13:54 ./usr/lib/php5/
drwxr-xr-x root/root 0 2017-03-27 13:54 ./usr/lib/php5/20131226/
-rwxr-xr-x root/root 26296 2017-03-27 13:54 ./usr/lib/php5/20131226/cld.so
root@debian-8-test:/test/php-cld# dpkg --info php5-cld_20170327-1_amd64.deb
new debian package, version 2.0.
size 5221736 bytes: control archive=427 bytes.
0 bytes, 0 lines conffiles
302 bytes, 10 lines control
Package: php5-cld
Priority: extra
Section: checkinstall
Installed-Size: 8252
Maintainer: maxime.deroucy@google.com
Architecture: amd64
Version: 20170327-1
Depends: php5-common
Provides: php5-cld
Description: This small extension provides bindings to use the Chromium Compact Language Detector in PHP.
Note: Ici le fichier cld.so n’a pas les bon droits (la faute à make install qui utilise install), mais ça n’empèchera pas sont bon fonctionnement.
quilt
Sources :
Pour ajouter un patch à un paquet il est recommendé d’utiliser quilt.
Si on suit ce qui est indiqué dans la documentation officiel, et qu’on imagine modifier le paquet N_U-D_A.deb.
- N : nom du paquet
- U : version upstream
- D : révision Debian
- A : Architecture
Installation et configuration de quilt et création du fichier ~/.quiltrc-dpkg :
root@testhost # apt-get install quilt
max@testhost % alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
max@testhost % complete -F _quilt_completion $_quilt_complete_opt dquilt
max@testhost % cat > ~/.quiltrc-dpkg
d=.
while test ! -d $d/debian -a `readlink -e $d` != /
do
d=$d/..
done
if test -d $d/debian -a -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 test ! -d $d/debian/patches
then
mkdir $d/debian/patches
fi
fi
Installation des dépendances de compilation et téléchargement et extraction des sources :
root@testhost # apt-get build-dep N
max@testhost % apt-get source N
max@testhost % cd N-U
Dans l’ordre :
- lancement de l’enregistrement des modification, configuration du patch (vide pour l’instant)
- ajout du fichier à modifier au patch
- modification du fichier
- génération du patch
- ajout d’un descriptif
- ajout des modification au changelog (suivre le style des précédentes modifications)
- génération du/des paquet (généré dans le répertoire parent)
En console :
max@testhost % dquilt new mon-super-patch.patch
max@testhost % dquilt add le-fichier-a-modifier
max@testhost % vim le-fichier-a-modifier
max@testhost % dquilt refresh
max@testhost % dquilt header -e
max@testhost % dch -i
max@testhost % debuild -us -uc
version
Sources :
- Debian Policy Manual: Chapter 5 - Control files and their fields
- Debian Policy Manual: Chapter 7 - Declaring relationships between packages
- serverfault: debian packages version convention
Les versions des paquets se décompose en [epoch:]upstream_version[-debian_revision].
upstream_version peut contenir les caractères spéciaux . + - : ~.
: n’est autorisé que lorsque epoch est présent (le premier : délimite forcément l’epoch).
- n’est autorisé que lorsque debian_revision est présent (le dernier - délimite forcément la debian_revision).
debian_revision peut contenir les caractères spéciaux + . ~.
~est considéré inférieur à tout (1.0~beta1~svn1245 < 1.0~beta1 < 1.0)+est considéré supérieur à tout.est considéré supérieur à toutes les lettres mais inférieur à+
Comparaison de version :
max@testhost % dpkg --compare-versions '1' '>=' '1~2' ; echo $?
0
max@testhost % dpkg --compare-versions '1~1' '>=' '1~2' ; echo $?
1
Algorithm :
The strings are compared from left to right.
First the initial part of each string consisting entirely of non-digit characters is determined. These two parts (one of which may be empty) are compared lexically. If a difference is found it is returned. The lexical comparison is a comparison of ASCII values modified so that all the letters sort earlier than all the non-letters and so that a tilde sorts before anything, even the end of a part. For example, the following parts are in sorted order from earliest to latest: ~~, ~~a, ~, the empty part, a.
Then the initial part of the remainder of each string which consists entirely of digit characters is determined. The numerical values of these two parts are compared, and any difference found is returned as the result of the comparison. For these purposes an empty string (which can only occur at the end of one or both version strings being compared) counts as zero.
These two steps (comparing and removing initial non-digit strings and initial digit strings) are repeated until a difference is found or both strings are exhausted.
info
Pour obtenir des informations sur un fichier « .deb » j’utilise ces deux options de dpkg.
root@debian-8-test:~# dpkg --info varnish_4.0.2-1_amd64.deb
new debian package, version 2.0.
size 528790 bytes: control archive=4606 bytes.
187 bytes, 8 lines conffiles
1191 bytes, 27 lines control
3095 bytes, 45 lines md5sums
4405 bytes, 132 lines * postinst #!/bin/sh
2348 bytes, 99 lines * postrm #!/bin/sh
999 bytes, 38 lines * preinst #!/bin/sh
487 bytes, 17 lines * prerm #!/bin/sh
Package: varnish
Version: 4.0.2-1
Architecture: amd64
Maintainer: Varnish Package Maintainers <pkg-varnish-devel@lists.alioth.debian.org>
Installed-Size: 1429
Depends: libc6 (>= 2.14), libedit2 (>= 2.11-20080614), …
Suggests: varnish-doc
Replaces: libvarnishapi1 (<< 3.0.0-5)
Section: web
Priority: optional
Homepage: http://varnish-cache.org/
Description: state of the art, high-performance web accelerator
Varnish Cache is a state of the art web accelerator written with
performance and flexibility in mind.
…
root@debian-8-test:~# dpkg -c varnish_4.0.2-1_amd64.deb
drwxr-xr-x root/root 0 2014-10-14 22:58 ./
drwxr-xr-x root/root 0 2014-10-14 22:58 ./usr/
drwxr-xr-x root/root 0 2014-10-14 22:58 ./usr/share/
drwxr-xr-x root/root 0 2014-10-14 22:58 ./usr/share/varnish/
-rwxr-xr-x root/root 3846 2014-10-14 22:58 ./usr/share/varnish/reload-vcl
drwxr-xr-x root/root 0 2014-10-14 22:58 ./usr/share/man/
drwxr-xr-x root/root 0 2014-10-14 22:58 ./usr/share/man/man1/
-rw-r--r-- root/root 1194 2014-10-14 22:58 ./usr/share/man/man1/varnishadm.1.gz
-rw-r--r-- root/root 11175 2014-10-14 22:58 ./usr/share/man/man1/varnishd.1.gz
…
installation
Pour installer un paquet, sous forme de fichier en local, avec toutes ses dépendances on peut utiliser gdebi, ou procéder comme suit :
root@testhost # dpkg --unpack …deb
root@testhost # apt-get -f install
Pour installé un paquet dans un répertoire particulier :
root@testhost # dpkg --instdir=test-directory/ -i …deb
environement
nspawn
Pour compiler le paquet j’ai utilisé un nspawn Debian.
policy-rc.d
Debian 7 wheezy n’utilise pas systemd et aucun service n’a besoins de tourné dans le nspawn pour pouvoir compiler un paquet, je n’utilise donc pas l’option « -b, –boot » de systemd-nspawn.
Debian démarre les services qu’il installe, ce qui peut poser problème lorsqu’on installe des paquets dans un nspawn non booté. Pour empécher Debian de démarrer les services à l’installation j’ai utilisé la configuration suivante :
root@testhost # echo exit 101 > /usr/sbin/policy-rc.d
root@testhost # chmod +x /usr/sbin/policy-rc.d
build-essential
Ces paquets sont nécessaire à la compilation des autres paquets.
root@testhost # apt-get install build-essential fakeroot devscripts
Très souvent j’ai aussi eu à installer les paquets suivant ; je ne sais pas pourquoi ils ne sont pas inclue dans build-essential.
automakelibtoolpkg-configsudo
Vérifier que nous avons accès aux « dépôts sources ».
root@testhost # grep deb-src /etc/apt/sources.list
deb-src http://ftp.fr.debian.org/debian/ jessie main
deb-src http://security.debian.org/ jessie/updates main
deb-src http://ftp.fr.debian.org/debian/ jessie-updates main
deb-src http://ftp.fr.debian.org/debian/ jessie-backports main
Si ce n’est pas le cas, il faut ajouter l’accès et mettre à jour l’indexe des paquets.
root@testhost # cat /etc/apt/sources.list
deb http://ftp2.fr.debian.org/debian jessie main
root@testhost # echo "deb-src http://ftp2.fr.debian.org/debian jessie main" >> /etc/apt/sources.list
root@testhost # apt-get update
Création de l’utilisateur et du répertoire qui serviront à compiler le paquet.
root@testhost # useradd -u 1000 -g users -G sudo -m userbuild
root@testhost # passwd userbuild
root@testhost # su - userbuild
max@testhost % mkdir src/
max@testhost % cd src
Le --gid 100 est une conf perso non nécessaire, elle me permet de partagé facilement les home de userbuild avec celui de mon user standard.
Dans la suite de cette article je considère que tous ces prérequis ont été appliqué.
passwd: Authentication token manipulation error
Je ne sais pas pourquoi mais dans certains environment (eg. stretch) je ne peux plus changer le mot de passe de l’utilisateur userbuild.
root@testhost # passwd userbuild
Enter new UNIX password:
Retype new UNIX password:
passwd: Authentication token manipulation error
passwd: password unchanged
Je n’ai trouvé ni la cause, ni le correctif mais un contournement : ne pas mettre de mot de passe à l’utilisateur et utiliser sudo.
PECL → deb
php5
Source: Compiler un module PECL en paquet Debian
dh-make-php permet de transformer une extention PHP disponible sur PECL en paquet debian.
Dans un premier temps faite vous un environment de build puis installer dh-make-php et php5-dev.
root@testhost # apt-get install dh-make-php php5-dev
dh-make-php n’est pas disponible sous stretch, il est toutefois possible de l’installer à la main.
Après vous être logger en tant que userbuild, télécharger l’extention sur PECL.
root@testhost # su - userbuild
userbuild@testhost $ wget https://pecl.php.net/get/superextention-1.2.3.tgz
Transformer l’archive en sources de paquet debian :
userbuild@testhost $ DEBFULLNAME="Maxime de Roucy" DEBEMAIL="maxime.deroucy@gmail.com" dh-make-pecl --depends toto --build-depends 'titi, tata' superextention-1.2.3.tgz
Installer les dépendances et compiler les sources pour générer le paquet.
userbuild@testhost $ cd php-superextention-1.2.3
userbuild@testhost $ sudo mk-build-deps -i -r debian/control
userbuild@testhost $ debuild -us -uc
php7
Sources:
- Rewriting PECL extensions packaging (by Ondrej Sury)
- Packaging standard PECL extensions? dh-php 0.15 comes to rescue for your one-liner d/rules
dh-make-php permet de transformer une extention PHP disponible sur PECL en paquet debian.
Dans un premier temps faite vous un environment de build puis installer dh-make-php et php5-dev.
root@testhost # apt-get install dh-make php7.2-dev
Après vous être logger en tant que userbuild, télécharger l’extention sur PECL.
root@testhost # su - userbuild
userbuild@testhost $ mkdir src/
userbuild@testhost $ cd src/
userbuild@testhost $ wget https://pecl.php.net/get/superextention-1.2.3.tgz
userbuild@testhost $ tar xvaf superextention-1.2.3.tgz
userbuild@testhost $ mkdir debian
Créer les fichiers necessaire pour créer un paquet debian :
- debian/changelog
- debian/compat
- debian/control (aide pour la valeur Standards-Version)
- debian/rules
Ainsi qu’un fichier ini de conf php et un fichier de chargement du fichier de conf :
- debian/superextention.ini
- debian/php-superextention.php
Pour ce faire je prend exemple sur le paquet php-rrd de Ondrej Sury :
Vous pouvez aussi vous inspirer de mon exemple avec couchbase.
Installer les dépendances et compiler les sources pour générer le paquet.
userbuild@testhost $ sudo mk-build-deps -i -r debian/control
userbuild@testhost $ debuild -us -uc
Expériences
Je détaille ici quelques-unes de mes expériences avec les paquets debian.
gdm3
J’ai du re-packager gdm (paquet gdm3) pour déboguer et corriger le problème évoqué dans mon précédent article sur Xephyr.
Je n’ai pas fait de packaging propre (ajout d’un nouveau patch, modification du nom du paquet…) mais une modification rapide qui m’a permit de déboguer gdm et tester mon correctif.
Sans modification des sources
Si vous n’avez pas besoin de modifier les sources et voulez juste les symboles de débogues.
Avec paquets dbg
Certains logiciels dispose de paquets particulier pour installer les symboles de débogues.
Ces paquets ont une extension -dbg.
max@testhost % apt-cache search zsh | grep dbg
zsh-dbg - shell with lots of features (debugging symbols)
Ce n’est pas le cas de gdm.
max@testhost % apt-cache search gdm | grep dbg
lcgdm-dbg - LHC Computing Grid debuggng symbols
Sans paquets dbg
Si votre logiciel ne dispose pas de ce type de paquet, vous pouvez le reconstruire facilement avec la suite de commandes suivantes.
root@testhost # apt-get build-dep gdm3
max@testhost % DEB_BUILD_OPTIONS="nostrip noopt" fakeroot apt-get -b source gdm3
Utiliser fakeroot directement n’est pas recommandé. Il est préférable d’utiliser debuild.
Avec modification des sources
Téléchargement des dépendances et des sources du paquet gdm3.
root@testhost # apt-get build-dep gdm3
max@testhost % apt-get source gdm3
Édition directe des sources, comme je l’ai dit précédemment, je n’ai pas fait les choses proprement et n’ai pas généré de patch.
max@testhost % cd gdm3-*
max@testhost % …
Compilation en conservant les symboles de débogue (pour pouvoir lancer gdb dessus).
(Note: fakeroot fonctionne très bien dans un systemd-nspawn mais doit être lancé avec un utilisateur autre que root)
max@testhost % DEB_BUILD_OPTIONS='nostrip noopt debug' fakeroot debian/rules binary
Comme indiqué plus haut, utiliser fakeroot directement n’est pas recommandé. Il est préférable d’utiliser debuild. Ici je ne m’embarasse car ce paquet n’est destiné qu’a faire du debugage.
Installation du paquet que nous venons de générer
root@testhost # dpkg -i /home/userbuild/src/gdm3_*.deb
Si vous re-modifier les sources vous devrez « nettoyer » le répertoire de compilation avant de re-générer le paquet.
max@testhost % fakeroot debian/rules clean
max@testhost % DEB_BUILD_OPTIONS='nostrip noopt debug' fakeroot debian/rules binary
tzdata
J’ai eu à backporter sous debian 7 wheezy des modifications faites sur le paquet tzdata de debian 8 jessie. Plus précisément, j’ai du générer la version « 2016g-0+deb7u1 », sachant que la dernière version été « 2016d-0+deb7u1 ». Sous jessie les paquets « 2016d-0+deb8u1 » et « debian/2016g-0+deb8u1 » existent.
Préparation des sources debian. Ici, je ne modifie pas les sources du logiciel empaqueté mais celle du paquet lui-même. J’effectue cette opération en dehors du nspawn pour plus de facilité.
- téléchargement des sources
- recherche des tags des versions qui m’intéresse
- déplacement dans la branch wheezy
- lecture des logs et de leurs patchs associés (
-p) pour visualiser le travail future - création des patchs
- modification rapide des patchs (j’ai vérifié qu’il n’y avais pas de risque lors de l’étape 4)
- application des patchs
- copie des sources dans le nspawn
En console :
max@testhost % git clone https://anonscm.debian.org/git/pkg-glibc/tzdata.git
max@testhost % cd tzdata
max@testhost % ls
debian/
max@testhost % git tag --list | grep '2016[dg]'
debian/2016d-0+deb7u1
debian/2016d-0+deb8u1
debian/2016d-1
debian/2016d-2
debian/2016g-0+deb8u1
debian/2016g-1
max@testhost % git checkout -b wheezy origin/wheezy
La branche wheezy est paramétrée pour suivre la branche distante wheezy depuis origin.
Basculement sur la nouvelle branche 'wheezy'
max@testhost % git log -p debian/2016d-0+deb8u1..debian/2016g-0+deb8u1
…
max@testhost % git format-patch debian/2016d-0+deb8u1..debian/2016g-0+deb8u1
0001-New-upstream-version-affecting-the-following-future-.patch
…
0010-releasing-package-tzdata-version-2016g-0-deb8u1.patch
max@testhost % sed -i 's/deb8u/deb7u/' 000*
max@testhost % git am 00*
Application de New upstream version, affecting the following future time stamp:
error: le patch a échoué : debian/changelog:1
error: debian/changelog : le patch ne s'applique pas
le patch a échoué à 0001 New upstream version, affecting the following future time stamp:
La copie du patch qui a échoué se trouve dans : .git/rebase-apply/patch
Quand vous avez résolu ce problème, lancez "git am --continue".
Si vous préférez plutôt sauter ce patch, lancez "git am --skip".
Pour restaurer la branche originale et arrêter de patcher, lancez "git am --abort".
max@testhost % vim debian/changelog
max@testhost % git add debian/changelog
max@testhost % git am --continue
Application de New upstream version, affecting the following future time stamp:
…
max@testhost % …
max@testhost % git am --continue
Application de releasing package tzdata version 2016g-0+deb8u1
max@testhost % sudo cp -r debian '/var/lib/machines/.#machine.debian-7-build-tmp/home/userbuild/'
max@testhost % sudo chown max:1000 -R '/var/lib/machines/.#machine.debian-7-build-tmp/home/userbuild/debian'
Dans le nspawn j’ai :
- installé les dépendances de compilation de tzdata (heureusement, elles n’ont pas changé avec les versions du paquet)
- créé le répertoire « src/P-V » (P: paquet, V: version)
- téléchargé les sources du logiciel tzdata
- les ai extrait
- appliqué les patchs listés dans les sources debian
- compilé les paquets
En console :
root@debian-7-build-tmp:~# apt-get build-dep tzdata
root@debian-7-build-tmp:~# su - userbuild
userbuild@debian-7-build-tmp:~$ mkdir -p src/tzdata-2016g
userbuild@debian-7-build-tmp:~$ cd src
userbuild@debian-7-build-tmp:~/src$ wget http://debian.bononia.it/debian/pool/main/t/tzdata/tzdata_2016g.orig.tar.gz
userbuild@debian-7-build-tmp:~/src$ cd tzdata-2016g/
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ tar xvaf ../tzdata_2016g.orig.tar.gz
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ mv ~/debian/ .
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ cat debian/patches/series
systemv.diff -p1
java.diff -p1
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ patch -p1 < debian/patches/systemv.diff
…
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ patch -p1 < debian/patches/java.diff
…
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ debuild -us -uc
…
dpkg-deb: building package `tzdata' in `../tzdata_2016g-0+deb7u1_all.deb'.
dpkg-deb: building package `tzdata-java' in `../tzdata-java_2016g-0+deb7u1_all.deb'.
dpkg-genchanges >../tzdata_2016g-0+deb7u1_amd64.changes
dpkg-genchanges: including full source code in upload
dpkg-source --after-build tzdata-2016g
dpkg-source: info: using options from tzdata-2016g/debian/source/options: --compression=xz
dpkg-buildpackage: full upload (original source is included)
Now running lintian...
W: tzdata: binary-without-manpage usr/sbin/tzconfig
Finished running lintian.
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ echo $?
0
userbuild@debian-7-build-tmp:~/src/tzdata-2016g$ ls ..
tzdata-2016g/ tzdata_2016g-0+deb7u1_all.deb
tzdata-java_2016g-0+deb7u1_all.deb tzdata_2016g-0+deb7u1_amd64.build
tzdata_2016g-0+deb7u1.debian.tar.xz tzdata_2016g-0+deb7u1_amd64.changes
tzdata_2016g-0+deb7u1.dsc tzdata_2016g.orig.tar.gz
php-couchbase
php5
Utilisation de dh-make-php.
Après avoirs créé un environment de build (et installé sudo).
root@testhost # apt-get install dh-make-php php5-dev
root@testhost # # installation d'une dépendance non présente dans les dépots
root@testhost # wget http://packages.couchbase.com/releases/couchbase-release/couchbase-release-1.0-4-amd64.deb
root@testhost # dpkg -i couchbase-release-1.0-4-amd64.deb
root@testhost # su - userbuild
userbuild@testhost $ wget https://pecl.php.net/get/couchbase-1.1.5.tgz
userbuild@testhost $ DEBFULLNAME="Maxime de Roucy" DEBEMAIL="mderoucy@oxalide.com" dh-make-pecl --depends libcouchbase2-bin --build-depends libcouchbase-dev couchbase-1.1.5.tgz
cd php-couchbase-1.1.5
userbuild@testhost $ # pour éviter https://stackoverflow.com/questions/5010387/php-unable-to-load-memcached-extension-due-to-json
userbuild@testhost $ sed -i 's/priority=20/priority=25/' ./debian/couchbase.ini
userbuild@testhost $ sudo mk-build-deps -i -r debian/control
userbuild@testhost $ debuild -us -uc
php7
Après avoirs créé un environment de build (et installé sudo).
userbuild@testhost $ cd src
userbuild@testhost $ # https://docs.couchbase.com/c-sdk/2.10/start-using-sdk.html
userbuild@testhost $ wget -O - http://packages.couchbase.com/ubuntu/couchbase.key | sudo apt-key add -
userbuild@testhost $ echo "deb http://packages.couchbase.com/ubuntu bionic bionic/main" | sudo tee /etc/apt/sources.list.d/couchbase.list
userbuild@testhost $ wget 'https://pecl.php.net/get/couchbase-2.6.0.tgz'
userbuild@testhost $ tar xvaf couchbase-2.6.0.tgz
userbuild@testhost $ mkdir debian
userbuild@testhost $ vim debian/changelog
userbuild@testhost $ date -R >> debian/changelog
userbuild@testhost $ vim debian/control
userbuild@testhost $ vim debian/couchbase.ini
userbuild@testhost $ vim debian/php-couchbase.php
userbuild@testhost $ vim debian/rules
userbuild@testhost $ tail -n+1 debian/*
==> debian/changelog <==
php-couchbase (2.6.0) unstable; urgency=medium
* init
-- Maintainer: Maxime de Roucy <maxime.deroucy@fr.clara.net> Wed, 03 Apr 2019 16:52:15 +0200
==> debian/compat <==
9
==> debian/control <==
Source: php-couchbase
Section: php
Priority: optional
Maintainer: Maxime de Roucy <maxime.deroucy@fr.clara.net>
Build-Depends: debhelper (>= 9),
dh-php (>= 0.33~),
php-all-dev,
pkg-config,
libcouchbase-dev (>= 2.10), libcouchbase-dev (<< 2.11)
Standards-Version: 3.9.6
Homepage: http://pecl.php.net/package/couchbase
Package: php-couchbase
Architecture: any
Depends: ${misc:Depends},
${php:Depends},
${shlibs:Depends},
libcouchbase2-bin (>= 2.10), libcouchbase2-bin (<< 2.11)
Provides: ${php:Provides}
Description: php-couchbase
==> debian/couchbase.ini <==
; configuration for php couchbase module
; priority=25
extension=couchbase.so
==> debian/php-couchbase.php <==
mod debian/couchbase.ini
==> debian/rules <==
#!/usr/bin/make -f
include /usr/share/dh-php/pkg-pecl.mk
userbuild@testhost $ sudo mk-build-deps -i -r debian/control
userbuild@testhost $ debuild -us -uc
php-phalcon
Pour ce paquet je n’ai pas utilisé dh-make-pecl mais j’ai adapté un paquet à Debian (jessie) un paquet venant d’un dépot Ubuntu.
Après avoirs créé un environment de build (jessie) et installé sudo, j’ai téléchargé les sources du paquets sur le ppa falcon de Ubuntu.
userbuild@testhost $ wget https://launchpad.net/~phalcon/+archive/ubuntu/legacy/+files/php-phalcon_1.3.4-ppa1~precise.dsc
userbuild@testhost $ wget https://launchpad.net/~phalcon/+archive/ubuntu/legacy/+files/php-phalcon_1.3.4-ppa1~precise.debian.tar.gz
userbuild@testhost $ wget https://launchpad.net/~phalcon/+archive/ubuntu/legacy/+files/php-phalcon_1.3.4.orig.tar.gz
userbuild@testhost $ dpkg-source --no-check -x php-phalcon_1.3.4-ppa1~precise.dsc
userbuild@testhost $ cd php-phalcon-1.3.4/
userbuild@testhost $ cp debian/changelog /tmp/
userbuild@testhost $ vi debian/changelog
userbuild@testhost $ diff -Naur /tmp/changelog debian/changelog
--- /tmp/changelog 2018-02-07 15:20:47.911032962 +0100
+++ debian/changelog 2018-02-07 15:21:19.139101446 +0100
@@ -1,3 +1,8 @@
+php-phalcon (1.3.4-1) jessie; urgency=low
+ * ppa1~vivid -> jessie
+
+ -- Maxime de Roucy <mderoucy@oxalide.com> Thu, 21 Nov 2017 18:58:20 +0100
+
php-phalcon (1.3.4-ppa1~precise) precise; urgency=low
* Fix improper access to \Phalcon\Debug::$_charset (#2840)
* Fix segfault in Phalcon\Mvc\Collection when an invalid parameter is passed as conditions
userbuild@testhost $ sudo mk-build-deps -i -r debian/control
userbuild@testhost $ debuild -us -uc
prometheus-apache-exporter
J’ai du backporter prometheus-apache-exporter d’une sid vers une debian wheezy. Je ne pouvais pas lancer la compilation du paquet sous wheezy (même en tordant la conf dans tous les sens) mais le binaire est standalone. Je peux donc utilisé le binaire sid sous wheezy sans problème. J’ai quand même du adapté les script de démarrage de systemd à systemV.
max@debian:~$ mkdir prometheus-apache-exporter_0.5.0+ds-1+b1_amd64
max@debian:~$ cd prometheus-apache-exporter_0.5.0+ds-1+b1_amd64/
max@debian:~$ ar x ../prometheus-apache-exporter_0.5.0+ds-1+b1_amd64.deb
max@debian:~% tree ..
..
├── prometheus-apache-exporter_0.5.0+ds-1+b1_amd64
│ ├── control.tar.xz
│ ├── data.tar.xz
│ └── debian-binary
└── prometheus-apache-exporter_0.5.0+ds-1+b1_amd64.deb
1 directory, 4 files
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64$ mkdir data
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64$ tar xvaf ../data.tar.xz -C data
./
./etc/
…
./usr/share/doc/prometheus-apache-exporter/copyright
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64$ mkdir data/DEBIAN
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64$ cd data/DEBIAN/
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64/data/DEBIAN$ tar xvaf ../../control.tar.xz
./
./conffiles
./control
./md5sums
./postinst
./postrm
./prerm
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64/data/DEBIAN$ rm md5sums
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64/data/DEBIAN$ vim *
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64/data/DEBIAN$ # adaptation de l'arborescence
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64/data/DEBIAN$ cd ../..
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64$ fakeroot dpkg-deb --build data/ prometheus-apache-exporter_0.5.0+ds-1+b1_amd64.deb
dpkg-deb : construction du paquet « prometheus-apache-exporter » dans « prometheus-apache-exporter_0.5.0+ds-1+b1_amd64.deb ».
max@debian:~/prometheus-apache-exporter_0.5.0+ds-1+b1_amd64$