fabrication de package rpm
Ce document est sous licence LGPL voir le site www.gnu.org pour plus de
renseignements
Vous pouvez redistribuer et modifier ce document selon les termes de la License
Publique Generale GNU (LGPL) version 2 ou toute autre version ultérieure
- pourquoi du rpm
- qui est concerné
- recherche de packages
- examiner un rpm
- refaire un rpm depuis le src.rpm
- refaire un rpm depuis le tar.gz contenant un fichier spec
- conversion Debian/rpm
- a partir d'un module perl (cpan)
- a partir d'un module python
- a partir d'un package installé
- modifier un package
- transformer un package tar.gz en rpm
- utiliser un makefile pour générer un rpm
- graphique récapitulatif
- documentation
- outils
- notions avancées
avantage des packages
les packages sont faits pour faciliter la vie des administrateurs dans l'administration des logiciels :
- installation
- mise a jour
- désinstallation
- gestion des conflits
- gestion des dépendances
- gestion de la sécurité
choix du logiciel rpm
concernant le choix du format rpm, Il faut aussi savoir que :
- le format rpm est utilise par la majorité des distributions linux ( a l'exception notable de Debian qui a son propre format) :
- le format rpm a été choisi par le Linux Standard Base dans ses préconisations pour standardiser les différentes distributions (et éviter ainsi de reproduire l'éparpillement des Unix dans les années 1980)
Enfin, il est très dangereux de mélanger des installations depuis des rpm et des tar.gz :
en effet la gestion des conflits de fichiers se fait par rapport aux autres logiciels installes en rpm et non pas par rapport aux fichiers réellement sur disque !
Ainsi, rien n'empêche une bibliothèque installée par un package rpm d'être écrasée par un logiciel en tar.gz, et vice-versa (problème bien connu par les utilisateurs de Windows avec leurs dll).
Donc, si on veut installer un programme a partir d'un format tar.gz, il y a deux solutions propres possibles :
- le passer au format rpm, puis l'installer "normalement" (conseillé)
- l'installer sur un répertoire tout-a-fait distinct du reste des applications (difficile a cause des chemins PATH, MANPATH, LIBPATH ...)
Parmi les utilisateurs de linux, il y a deux types de personnes qui peuvent être amenées a fabriquer des packages rpm :
- les développeurs qui veulent diffuser des logiciels "pret-a-installer"
- les administrateurs qui désirent installer des logiciels non fournis par leur distribution sans soucis (voir pourquoi)
recherche
la recherche de logiciels peut se faire dans l'ordre :
- sur une site qui recense les rpm existants : http://fr.rpmfind.net
- sur une base des projets libres : http://www.freshmeat.net
- cliquer ici pour plus de possibilités
interprétation
la convention de nommage des packages rpm est la suivante : nom-version-release.architecture.rpm
pour son interprétation, voir mon introduction a rpm
conseil : pour une diffusion sur internet, a cause des problèmes de portabilité,
il faut TOUJOURS mettre également a disposition le fichier src.rpm. C'est ce qui permettra aux utilisateurs d'autres distributions d'utiliser vos packages.
il y a quelques outils qui permettent de voir/extraire le contenu d'un fichier rpm
- mc :permet d'explorer le contenu d'un rpm comme un (pseudo) file systeme
- rpm2cpio : extrait le contenu d'un rpm en format cpio
- alien : permet de convertir un fichier rpm en fichier tar.gz
quand on ne trouve pas de rpm tout fait pour sa distribution, le premier réflexe à avoir, c'est d'essayer de le refaire a partir d'un package source.
Il y a un inconvénient : c'est qu'il faut pour cela avoir installé au préalable :
- les packages dits de développement : compilateur (gcc), make, kernel-header ou glibc-kernheaders ...
- les packages "devel" des bibliothèques utilisées par ce package (exemple : qt-devel pour qt)
Pour la fabrication proprement dite, c'est très simple :
rpmbuild --rebuild source_rpm
- la commande affiche la localisation du fichier généré, qui dépend de l'architecture et de la distribution
- /usr/src/redhat/RPMS/architecture sur Redhat
- /usr/src/RPM/RPMS/architecture sur Mandriva
- /usr/src/redhat/pkgs/architecture sur Suse
- ...
remarque : si l'on regarde le contenu d'un fichier src.rpm, par exemple avec le gestionnaire de fichier mc, on voit que celui-ci contient :
- un fichier tar.gz
- éventuellement des fichiers de patch
- un fichier de spécifications (.spec), qui contient en fait toutes les informations sur le package (nom, version, url, licence, fichiers contenus ...)
on peut donc fabriquer également un rpm à partir d'un src.rpm en deux temps :
rpm -i source_rpm
: éclate le fichier src.rpm sur l'arborescence /usr/src/.../
cd /usr/src/.../SPECS/
rpmbuild -bb specfile
Comme le format rpm est de plus en plus répandu, les fichiers tar.gz contenant des fichiers spec sont assez courant.
Ils permettent également une fabrication facile de package rpm par une variante de la méthode précédente :
rpmbuild -tb fichier_tar
Les développeurs Debian ont fait un outil pour convertir les différents formats de package : alien. Je l'utilise assez souvent, avec succès, dans le sens rpm vers Debian.
il y a deux outils faits pour convertir un module cpan en rpm :
- cpan2rpm (disponible sur rpmfind), qui permet d'interroger le cpan (cree un cache sur la machine)
- cpan2flute (disponible sur rpmfind, qui travaille a partir d'un fichier tar.gz obtenu a partir du cpan
detarrer le module, puis taper python setup.py bdist_rpm
en cas d'erreur du type error: byte-compiling is disabled
, il faut lancer la commande :
PYTHONDONTWRITEBYTECODE= python setup.py bdist_rpm
problème
refaire un fichier rpm a partir un package installe
solution
comme je n'ai pas trouvé de logiciel, je l'ai écrit, puis mis sur le net : rpmrebuild
syntaxe
rpm --rpmrebuild package
problème
refaire un fichier rpm contenant des modifications
solution
il y a plusieurs possibilités :
- s'il s'agit de modifications personnelles (fichier de configuration), je conseille mon outil rpmrebuild. Il suffit de modifier les fichiers disques désirés et de lancer la commande, pas besoin de modifier le fichier specfile !
- s'il s'agit de modifications du code, il vaut mieux fabriquer un patch et l'envoyer a l'auteur
principe
- Il va falloir générer un fichier contenant les informations sur le package que l'on veut faire (nom, version ...) : c'est le fichier specfile.
Pour cela, on va se faire aider par un générateur de specfile. Plusieurs outils existent :
- checkinstall
- alien : le plus vieux, qui n'est plus le meilleur maintenant (il faut beaucoup retoucher le fichier specfile généré)
- rpmerizor un petit script perl assez simple
- autospec : longtemps le meilleur, mais le code ne supporte pas les versions récentes de python.
- deuxième étape, obligatoire, il va falloir modifier le fichier spec génère, pour y ajouter quelques informations, que le générateur ne peut inventer (description, résumé ...).
- enfin, la fabrication du rpm se fait comme pour un src.rpm
exemple
soit un logiciel très simple avec 3 fichiers :
- toto (exécutable) -> /usr/local/bin
- toto.conf (configuration) -> etc
- readme (documentation) -> /usr/share/doc/toto
on va donc :
- créer une arborescence pour ces fichiers :
toto-0.1
|-- README
|-- etc
| `-- toto.conf
|-- toto.spec
`-- usr
`-- local
`-- bin
`-- toto
- créer le fichier tar :
cd toto-0.1
tar cvfz /tmp/toto.tgz *
- générer un fichier specfile avec autospec:
tar tfz /tmp/toto.tgz | autospec -b > toto.spec
- éditer (vim, emacs, ont un mode de colorisation syntaxique du fichier spec) le fichier toto.spec pour :
- decommenter et modifier la valeur "unknown" des "tags" suivants (obligatoires) : Group, Licence(Copyright), summary, description
- supprimer certains "attributs" de fichiers :
%readme
ou %license
, générés par certaines version d'autospec, mais que rpm ne comprends pas
- générer le fichier rpm:
- passer root :
su
- copier le tar a sa place (ici sur Redhat) :
cp ../toto.tgz /usr/src/redhat/Sources/toto-0.1.bin.tar.gz
- fabriquer le rpm :
rpmbuild -bb toto.spec
principe
Comme pour les tar.gz,
- on va utiliser un générateur de specfile :
- autospec : mon préféré pour le moment (simple, efficace).
- checkinstall : travaille mieux que autospec sur les Makefile
- modifier le fichier specfile
- fabriquer le rpm
exemple
on reprend les mêmes fichiers que ci-dessus, mais avec un Makefile
toto-0.2
|-- Makefile
|-- README
|-- toto
`-- toto.conf
le fichier Makefile contient juste quelques lignes :
build:
install :
install -d ${DESTDIR}/usr/local/bin
install toto ${DESTDIR}/usr/local/bin
install -d ${DESTDIR}/etc
install toto.conf ${DESTDIR}/etc
avec autospec
- générer le fichier specfile:
cd toto-0.2
make -n install | autospec -i > toto.spec
- éditer (vim, emacs) le fichier toto.spec pour :
- changer les "tags" Group, Licence (Copyright), summary, description : de-commenter et changer la valeur "unknown"
- decommenter le "tag" BuildRoot
- remplacer la ligne "
make install
par make DESTDIR=$RPM_BUILD_ROOT install
- decommenter les lignes %clean et sa suivante
- générer le fichier rpm:
- faire un tar :
cd ..; tar cvfz /tmp/toto-0.2.tar.gz toto-0.2
- passer root :
su
- fabriquer le rpm :
rpmbuild -tb /tmp/toto-0.2.tar.gz
remarque : l'explication du tag BuildRoot sera faite en section avancée
avec checkinstall
- il suffit de taper
checkinstall make install
- puis de répondre aux quelques questions posées
ce graphique résumé les différentes commandes pour travailler sur les fichier rpm
- rpmlint : permet de verifier si un package est correct (respecte certaines règles)
- les très bonnes documentation faires par ibm (3 articles didactiques et progressifs)
- rpm : contient notamment une liste des projets autour de rpm (intégration cvs, fabrication de specfile, outils de mise a jour, ...)
- une documentation en français
- le rpm-HOWTO (sur /usr/share/doc/HOWTO) : les bases sur l'utilisation et la fabrication de rpm (existe en français sur /usr/share/doc/HOWTO/translations/fr/)
- "le" livre maximum rpm énorme pavé, malheureusement un peu obsolète
- la doc mandrake est disponible sour forme de howto : mdk-rpm-howto (disponible en rpm)
- la liste de diffusion rpm-list pour les questions pointues (en Anglais)
remarque : cette page a été faite pour une conférence sur la fabrication des rpm au culte
version 1.10 du 2009-10-05
Eric Gerbier
documentation sous licence GNU Free Documentation License