Ce petit memento comporte 7 parties:
1) Fabrication d'un paquet élémentaire
(vikings)
2) Fabrication d'un paquet plus compliqué avec
compilation (cacheproc)
3) Exemple d'un paquet de scripts de mise
à jour
4) Le rétroportage vite fait, bien ou mal
fait
5) ./configure;make;make install et paquet debian...
6)Recompilation
7) Fabrication directe.
Les
sources et les résultats de ces paquets se trouve sur
deb
http://boisson.homeip.net/sarge/
./
deb http://boisson.homeip.net/source
./
1) Un exemple très simple: vikings
On ne travaille PAS sous root
Ce paquet
contient une arborescence /usr/games/lost et un script
/usr/games/vik. Les fichiers sont tout prêts et n'ont pas
besoin de préparation.
- faire un répertoire
/tmp/vikings-1.0
- Y mettre vik et le répertoire lost
-
Faire
Code: |
|
dh_make pose la question de savoir
si c'est un paquet simple (oui), multiple, librairie ou module noyau.
Il crée un répertoire debian et un répertoire
/tmp/vikings-1.0.orig permettant de faire le fichier .diff.gz (les
paquets sources contiennet en général les sources
initiaux, un fichier .diff rajoutant l'arborescence et les patchs
debian et un fichier .dsc décrivant le paquet). A ce stade,
il est important de noter que seules des modifications de textes sont
permises. Si un binaire est modifié dans le paquet source, il
est nécessaire de supprimer le répertoire
/tmp/vikings-1.0.orig, les sources seront alors composés d'un
fichier .tar.gz et d'un fichier .dsc (pas de diff.gz),
Puis
viennent les éditions
Code: |
|
Mettre à jour les champs
Description, et éventuellement Depends. Ici, le paquet dépend
de dosbox donc remplacer
Code: |
|
par
Code: |
|
(la syntaxe est paquet, paquet,
...)
Faire
Code: |
|
Ce fichier est essentiel car
contenant les instructions permettant de faire le paquet.Ici, il n'y
a pas de Makefile donc virer ou commenter les lignes contenant
$(MAKE), puis remplacer la ligne
Code: |
|
par
Code: |
|
Le répertoire de travail
est /tmp/vikings-1.0=CURDIR, $(CURDIR)/debian/vikings contient
l'arborescence du paquet à venir. Il est parfois bon de
faire au préalable
Code: |
|
Pour créer le répertoire.
Une autre méthode plus simple consiste à déclarer
le répertoire dans debian/dirs
Code: |
|
(Y mettre usr/games et virer le
reste). Faire
Code: |
$ emacs debian/copyright |
pour y mettre la licence. Ici j'ai
complété par
«It was downloaded from
abandonnia». Faire de même pour README.debian
Ces
fichiers debian/README.debian et debian/copyright se retrouvent
toujours et sont copiés sur /usr/share/doc/<paquet>/.
Usuellement, on rajoute un fichier README de doc.
Faire enfin
Code: |
|
qui fabrique les paquets sources et
le .deb.
Supposons que damned, faute de frappe et le paquet
plante, dans ce cas, repartir de sources propres:
Code: |
|
Le paquet vikings_1.0-1_i386.deb
est cré dans la racine.
2) Un deuxième
exemple: cacheproc
cacheproc est un petit programme
recherchant des processus cachés, il est écrit en
camllight. Il se compose de
Code: |
|
On procède comme ci dessus
(dh_make, etc), l'idéal étant de modifier le moins
possible debian/rules en utilisant le Makefile.
README est un
fichier sommaire de docs. Je le copie sur debian/README.debian (ce
qui est une mauvaise idée mais bon, c'était un de mes
premiers paquets)
a) le fichier debian/control
Outre les
rubriques usuelles, rajouter camllight dans le Build-Depends:
Code: |
|
(J'oublie tout le temps, dsl)
b) mettre usr/bin dans debian/dirs (c'est là où
seront les binaires)
c) Dans debian/rules mettre
Code: |
|
au lieu de $(MAKE) dans le build-stamp
et commenter le dh_strip (les objets caml supporte mal le strip
(=compression de l'exe)).
Reste donc à faire le Makefile.
J'utilise un Makefile «générique» que je
modifie à la demande. Il contient
Code: |
|
Les lignes importantes sont
INSTALL_LIST_BIN=.. donnant la liste des binaires à obtenir.
Les cibles sont clean, all et install.
clean nettoie les
fichiers objets (noter le -rm et non rm qui évite l'erreur si
il n'y a pas de fichier objet, on peut se demander pourquoi je
n'ai pas fait pareil pour les binaires mais bon...)
installinstalle les binaires dans le répertoire
$(DESTDIR)$(bindir), donc ici on crée le répertoire, on
vérifie qu'il y a les bons droits, puis on y copie les
binaires de la liste INSTALL_LIST_BIN (à noter que dans mon
script, j'ai prévu le cas où il y a un répertoire
source séparé).
all renvoie sur 2 cibles,
une par binaire. Chaque cible fabrique le binaire correspondant.
Le
reste est comme dans 1)
3) Un paquet de mis à
jour pour gérer un parc de machines.
Ce genre
de paquet est très utile pour répercuter des patchs sur
un lot de machines (salle) toutes indentiques.
Pour cela on
utilise un script /etc/init.d/maj contenant dans la rubrique start
Code: |
|
puis on fait
Code: |
|
/etc/apt/sources.list.lycee
contient une ligne
deb file:/home/ftp/ /
qui est ici un
dépot partagé via nfs.
Le paquet pris en
exemple est celui qui me permet de gérer les salles du lycée
où je travaille. A l'heure actuelle il contient
Code: |
|
Il faut savoir que les logiciels de
chimie utilisés par les élèves tournent sur un
Windows98 dans un qemu (les machines sont des amd64). Comme prévus
les patchs concernent surtout windows98. On y trouve un nouvel
autoexex.bat, un fichier init.reg à mettre dans la racine du
disque virtuel windows. Pour cela un utilitaire lomount (dont j'ai
fini par faire un paquet) permet de monter des partitions d'une image
d'un disque hda par exemple. repareW98 est un script qui remplace
l'image du disque virtuel par une image neuve et y applique les
patches. Quand l'élève plante le Windows (en gros
toutes les deux heures), il clique sur une icone «repareWindows»,
et relance un windows tout neuf. Il a perdu tout son boulot ce qui a
l'avantage de l'éduquer sur Windows. Voilà pour
l'explication du contexte.
Le paquet à faire doit donc
à chaque installation installer la nouvelle version de maj,
appliquer d'éventuels patchs et installer les fichiers ci
dessus dans les bonnes places.
Comme précédemment,
l'installation des fichiers se fait par le Makefile:
Code: |
|
Pour le fichier debian/rules,
il n'y a pas de fabrication de binaires (donc commenter le $(MAKE) de
build-stamp). Le reste est le script par défaut.
Le
fichier debian/control contient les paquets rajoutés sur les
machines au fur et à mesure de leur évolution:
Code: |
|
Ici j'ai rajouté camllight, le mode tuareg pour
caml, un java, ntpdate pour synchroniser les machines et fingerd pour
savoir qui travaille et quand sur les machines (c'est mon coté
bigbrother qu'il faut bien assumer).
Enfin, le fichier
debian/postinst exécute les différents patchs
éventuels:
Code: |
|
Pour faire une mise à
jour sur les machines, il suffit donc de mettre à jour le
dépot local et tout se fera automatiquement. Cela a remplacé
avantageusement le rapatriement automatique de scripts. Ça
montre bien la puissance du paquetage .deb qui permet vraiment de
tout faire très simplement
4) Fabrication rapide
de backports.
Le problème s'est posé
pour moi pour clamav avant la mise en place de debian/volatile (que
je n'utilise pas du coup). clamav fait des maj régulièrement
et mon serveur était sous potato puis est maintenant sous
woody (je n'ai pas le temps ni le vrai désir de passer sous
sarge). Il s'agit donc de faire des backports de clamav. Il se trouve
que Stephen Gran a fait un paquet très propre (en tout cas la
version 0.80), lors des mise à jour je procède comme
suit:
Mettons que je parte de la version 0.80
0)
Récupération de l'arborescence debian de ce paquet
1)
rapatriement de l'archive source clamav nouvelle
2) dépilage
de cette archive et renommage du répertoire en clamav-0.80
3)
Exécution de
Code: |
|
Le paquet sera dans la version
backport-0.88
4) Compilation
Code: |
|
C'est fini, les nouveaux
paquets sont faits.
Voici les commandes tapés pour le
passage de 0.88-2 à 0.88-4:
Code: |
|
C'est tout. Les sources obtenus
me permettent de faire les paquets pour woody, sarge amd64, etc.
Il
peut y avoir quelques soucis nécessitant des retouches de
debian/rules
5) Fabrication d'un paquet via
checkinstall.
attention, il y a un bug dans la
version de checkinstall de lenny, le checkinstall n'existe pas chez
etch, on pourra le trouver ici
deb
http://boisson.homeip.net/debian etch divers
Pour contourner
le bug, lancer checkinstall avec l'option --fstrans=no
Sinon,
checkinstall ne peut construire correctement le paquet si
l'installation se fait avec un programme binaire statique.
Parfois,
la méthode dh_make conduit à modifier le Makefile, on
ne comprend plus rien et on a juste envie de faire un paquet et pas
les paquets sources. Un petit génie a inventer checkinstall
(par encore parfait mais bon)...
Exemple scilab version 4
dont j'avais besoin en urgence (ci dessous de mémoire, c'est
reconstitué).
Chargement rapide des sources, configuration
classique:
Code: |
|
bref, du classique.
Là
commence checkinstall:
Code: |
|
là on tape la description du
paquet suivi d'une ligne vide
Code: |
|
S'en suit les parties identifiant
le paquet. On les remplit en tapant le numéro de la catégorie
à modifier puis le texte correspondant.
Code: |
|
Là on se dit c'est fini, eh ben non. checkinstall
ne crée pas les dépendances. On peut les faire on
modifiant les dépendances à la main. Pour cela, on
utilisera le script suivant:
Code: |
|
On fait donc tout d'abord
l'extraction des fichiers du paquet dans un répertoire (ici
gre).
Code: |
|
La troisième commande
fabrique un répertoire DEBIAN contenant un seul fichier
control contenant
Code: |
|
(La quatrième commande
déplie l'archive des fichiers du paquet)
Pas de champ
Depends dans ce fichier Control, donc de la pagaille et des
déconvenues à prévoir. Pour cela on peut avoir
une idée des paquets nécessaires avec le script
lsdepend. Celui ci cherche les librairies appelées et donne la
liste des paquets nécessaires. Ainsi ici, sachant que les
bianires sont dans usr/lib/scilab-4.0/bin/
Code: |
|
Le paquet maple4 est une hérésie
non libre inutile (doublon) qu'on oublie, cela nous donne le champ
Depends suivant:
Code: |
|
et le fichier DEBIAN/control
suivant
Code: |
|
On peut éventuellement
créer un fichier DEBIAN/postinst et DEBIAN/prerm si on veut
éxécuter un script juste après l'installation ou
un script avant la désinstallation. Il ne reste plus qu'à
refaire le paquet:
Code: |
|
et voilà le beau paquet scilab avec ses dépendances
(du moins on l'espère). Bien évidemment, c'est rustique
comme méthode mais cela permet de dupliquer une installation
facilement et cela constitue une alternative pratique et rapide à
la méthode classique sans sombrer dans les méandres
d'un debian/rules ne fonctionnant pas...
6) Recompilation
Pour le coup c'est très simple. Il suffit de charger les
sources, modifier eventuellement les options et recompiler le paquet.
Soit donc pour le paquet paquet-1.23-6_i386.deb
Code:
$
apt-get source paquet
$ cd paquet-1.23
$ emacs debian/rules
(là chercher les options, regarder pres de la cible
configure_stamp: ou build_stamp: et les modifier)
Code:
$
fakeroot dpkg-buildpackage -b -uc
$ cd ..
$ ls *.deb
Le
paquet est prêt.
7) Fabrication directe.
Un paquet peut être fait simplement. Pour cela
Préparer l'arborescence des fichiers composant le paquet dans un répertoire /tmp/paquet.
Faire un répertoire /tmp/paquet/DEBIAN
Y mettre dedans un fichier control de la forme
Package:
nomdupaquet
Priority: optional
Section: x11
Installed-Size:
4023 (si le paquet fait 4023K environ)
Maintainer: Georges Sand
<aurore.dupin@chopin.muses.fr>
Architecture: all
Version:
1.0
Depends: xbase-clients
Description: Modifications de
startx
Lancement de X différent
.
Y mettre éventuellement un fichier postinst
(éxécutable) pour les éventuels instructions à
faire après l'installation. Dans le cas où un fichier
d'un paquet est modifié (mettons startx ici) il est important
de faire une «diversion», ce qui se fait par un fichier
preinst comme suit:
set
-e
case "$1" in
install)
dpkg-divert --package
nomdupaquet --divert /usr/bin/startx.org --rename /usr/bin/startx
dpkg-divert --package nomdupaquet --divert /usr/X11R6/bin/startx.org
--rename /usr/X11R6/bin/startx
;;
abort-upgrade)
;;
upgrade)
;;
*)
echo "preinst called with unknown
argument \`$1'" >&2
exit 1
;;
esac
exit
0
et bien sûr un fichier postrm
supprimant la diversion en cas de retrait du paquet:
set
-e
case "$1" in
remove|purge)
dpkg-divert
--package xbase-agreg --rename --remove /usr/X11R6/bin/startx
dpkg-divert --package xbase-agreg --rename --remove /usr/bin/startx
;;
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;;
*)
echo "postrm called with unknown argument \`$1'"
>&2
exit 0
esac
faire ensuite
$ cd
/tmp/paquet
$ find . -type f | grep -v "^./DEBIAN" |
md5sum > DEBIAN/md5sums
$ su
# chown -R root.root *
#
dpkg-deb -b . ../nomdupaquet-1.0_all.deb
Le paquet est prêt.