Skip to content

Home > GNU/Linux > Travailler sur un RPM

Travailler sur un RPM

Monday 21 March 2005, by Stéphane Téletchéa

Quand un paquetage n’existe pas dans une distribution, on peut l’installer à partir des sources, mais créer ledit paquetage peut permettre de gagner du temps si par exemple on met à jour le système.

De plus, d’autres pourront bénéficier du travail et améliorer le paquetage pour qu’il s’intègre au mieux dans la distribution.

RPM est utilisé ici comme raccourci pour logiciel préparé pour être installable et désinstallable sous le format RPM.
Ce format RPM, pour RedHat Package Manager est documenté sur le site de l’éditeur Red Hat à l’adresse http://www.redhat.com/docs/books/max-rpm/max-rpm-html/index.html.

Préparation de l’environnement de construction du RPM

  1. Création des répertoires de travail :
    mkdir -p rpm/{SOURCES,SPECS,BUILD,RPMS/{i586,x86_64,noarch},SRPMS}
  2. Création du fichier $HOME/.rpmmacros contenant les chemins nécessaires pour RPM :
    • le répertoire temporaire pour RPM
    • le répertoire où sont stockées les informations pour le RPM, les sources, ...
      Il est de la forme :
      %_topdir                $HOME/rpm
      %_tmppath               $HOME/tmp
  1. Créationdu fichier $HOME/.rpmrc contenant les traductions des différentes architectures en i586 (spécificité Mandriva):
    buildarchtranslate: i386: i586
    buildarchtranslate: i486: i586
    buildarchtranslate: i586: i586
    buildarchtranslate: i686: i586
  2. S’il s’agit d’un RPM destiné à être intégré dans la distribution Mandriva Linux, d’autres options dans le fichier de configuration $HOME/.rpmmacros seront nécessaires (voir la liste actualisée dans le RPMHowTo de Mandriva) :
    %_topdir                $HOME/rpm
    %_tmppath               $HOME/tmp

    %_signature             gpg
    %_gpg_name              Mandrivalinux
    %_gpg_path              $HOME/.gnupg

    %distribution           Mandriva Linux
    %vendor                 Mandriva

Préparation d’un RPM

Un fichier RPM est constitué de deux parties :

  1. une archive compressée (.tar.gz ou .tar.bz2) qui contient tous les fichiers à déployer avec idéalement leur arborescence complète et les bonnes permissions (à positionner dans rpm/SOURCES/), les différents ’patchs’ permettant de corriger le fichier source originel ou d’intégrer celui-ci dans la distribution ;
  2. un fichier de spécifications .spec qui permet de décrire les actions à réaliser avant le déploiement des fichiers de l’archive compressée (compilation, création de répertoires, d’utilisateurs, arrêt de services), des actions à réaliser après le déploiement de ces fichiers (lancement du service de l’application déployée par exemple), que ce soit au moment de l’installation ou de la désinstallation (à positionner dans rpm/SPECS/).

Ces deux fichiers sont assemblés dans un rpm ’source’ qui est créé dans le répertoire rpm/SRPMS.

S’il s’agit d’une première création du RPM, il faut alors créer l’archive et le fichier.spec. Il est possible de réutiliser le travail déjà réalisé par d’autres contributeurs, comme décrit plus bas.

Construction d’un RPM

Pour construire le rpm binaire qui va servir à l’installation, il faut le créer à partir du fichier.spec en utilisant, dans le répertoire rpm/SPECS, la commande :

rpm -ba fichier.spec.

Cette commande va procéder à la décompression de l’archive compressée, aux modifications éventuelles sur les fichiers (gestion des droits, positionnement de variables, etc.) puis va créer deux fichier : un fichier.src.rpm et un fichier.arch.rpm (arch = i586 ou noarch en général).

Extraction des informations d’un RPM existant

Si un RPM source existe, il suffit de l’installer dans l’environnement de construction définit ci-dessus en utilisant la commande :

rpm -ivh fichier.src.rpm.

Il est alors possible de modifier le spec et/ou l’archive pour apporter les corrections nécessaires.

Il est aussi possible d’extraire le fichier.spec pour l’adapter à ses besoins (nouvelle vesrion d’un logiciel par exemple) :

rpm2cpio paquet.rpm | cpio —extract —make-directories

Plus d’informations sur la page de LinuxFR.

Logique de construction d’un RPM

Le rpm est un format qui permet d’installer et de désinstaller les logiciels en tenant compte des dépendances nécessaires, et en s’installant ou en se désinstallant proprement dans la cohérence de l’ensemble des logiciels de la distribution.

Pour assurer cette cohésion, le fichier.spec qui sert à la construction du rpm est composé de quatre parties principales :

  1. Une partie descriptive qui indique le nom du logiciel, sa version, la provenance, la licence
  2. Une partie comprenant les contraintes d’interaction avec la distribution (les dépendances entre les logiels), que ce soit pour la construction, l’installation, l’utilisation ou la désinstallation du logiciel.
  3. Une partie comprenant les commandes à effectuer pour réaliser la construction, l’installation et la désinstallation du logiciel.
  4. Une partie Changelog qui décrit les différents changements apportés au RPM (et pas uniquement au logiciel lui-même), aux fins de traçabilités.

Informations pratiques

- Dépendances virtuelles : les dépendances ne sont pas forcément des paquets réels, elles peuvent être des paquets virtuels. ex : le serveur apache remplit le service de serveur d’applications web, mais d’autres serveurs peuvent aussi remplir cette fonction (par exemple caudium). Un logiciel ayant besoin d’un serveur web pourra avoir besoin spécifiquement d’apache (auquel cas il faudra mettre la dépendance sur apache), ou d’un serveur web indifférencié, auquel cas il suffit d’utiliser la dépendance virtuelle webserver.

Pour connaître la dépendance virtuelle fournie par un paquet, vous pouvez regarder la section Provides: du fichier spec du logiciel qui est en dépendance (par exemple dans notre cas, la section Provides de apache nous indique qu’il fournit la dépendance webserver en plus de apache).

- macro disponibles pour le spec : en lançant la commande rpm --showrc, vous obtiendrez la liste des commandes disponbiles dans votre environnement rpm. Une partie d’entre elles sont positionnées dans le répertoire /usr/share/rpm-helper/.

Exemples de macros :

Commande Explication
%_pre_useradd <user> <home> <shell> ajouter un utilisateur
%_postun_userdel <user> supprimer un utilisateur
%_pre_groupadd <group> [utilisateur] ajouter un groupe
%_postun_groupdel <groupe> supprimer un groupe
%_post_service <service>/%_preun_service <service> ajouter/supprimer un service
%define _requires_exceptions \\(perl(Mozilla::.*)\\) ajouter des vérifications de dépendances

- Effectuer une commande dans un environnement RPM :
la commande rpm -qa --qf "%{arch} %{name}\n" permet d’indiquer l’architecture des paquets installés sur un système.

Outils annexes pour la création du RPM

Il faut parfois corriger certains fichiers des paquets que l’on souhaite créer. Il s’agit par exemple de modifier les chemins des exécutables, de changer des configurations, ou bien même de corriger des bugs, en attendant qu’ils soient corrigés en amont par le développeur principal.

Pour éviter de se tromper, il est possible d’utiliser gendiff, un outil qui permet, à partir d’un fichier et/ou d’un répertoire, de créer les fichiers patch.

Sa syntaxe est la suivante :
- soit le fichier exemple.c qui contient une erreur. Avant de le modifier, on le copie en exemple.c_orig, puis on édite exemple.c.
- une fois modifié, on générère la différence entre les deux en faisant gendiff ./ _orig > exemple.patch.
- dans le rpm, on ajoute la section Patch: avec comme source le fichier exemple.patch, puis lors du prep, le patch est appliqué en utilisant la macro patch:

Patch:                %exemple.patch.bz2

...

%prep
%setup -q -n %{Name}-v%{Version}
%patch

...

Remarque : le fichier .patch, comme tous les fichiers pour la création des RPMs pour Mandriva, doit être compressé avec bzip2.

Plus loin dans la construction du fichier.spec

- Il faut indiquer quels sont les fichiers faisant partie de fichiers de configuration en utilisant la macro %config(noreplace) dans la section %files.
Plus d’explications sur cette macro dans sur la page de Jon Warbrick

- Pour les serveurs, il faut créer un fichier d’init contenant les spécifications LSB, plus d’informations sur le wiki (cf plus bas).

Liens utiles

Maximum RPM
Maximum RPM en Français
Comment faire un RPM simplement sur LinuxFrench
Mandriva RPM HOWTO
Mandriva RPM HOWTO (avancé)
Intégration des applications dans les menus : catégories de menus
Inscription du RPM dans la catégorie appropriée
Intégration en prenant en compte les spécificités Mandriva
Indication de la licence du logiciel (et compatibilité avec celles connues)
La page Wiki qui a pour vocation d’organiser un peu tout ce qui est mentionné ici
Utilisation des initscripts et intégration des marqueurs LSB dans ces scripts

Comment on this article