HowtoRPM

From AleikoumWiki

Jump to: navigation, search

Howto : Comment construire les packages RPMs pour Weborama


v1.0 par Erwan 'Laby' Ben Souiden e.bensouiden<@>gmail.com base : http://www.rpm.org/max-rpm-snapshot/index.html

La génération des packages RPM se fait grâce à l'outil rpmbuild suivant un fichier de spécifications nommé le spec file (.spec) . Le spec file est OBLIGATOIRE pour la création du RPM. Le spec file est une description du futur package avec la suite d'instructions nécessaires pour construire les binaires du package qui seront installés.

Par convention, le nom du spec file doit être formaté de la façon suivante : nomdupackage-version-release.spec . Par exemple GeoIP-1.3.7-1.spec pour GeoIP version 1.3.7 release 1.

Le spec file peut être divisé en plusieurs parties dans lesquelles se mélangent définitions de tags et scripts shell.


L'entête (The Header):

   	* Name (tag obligatoire) : nom du package
   	* Version (tag obligatoire) : version
   	* Release (tag obligatoire) : numéro de la release
   	* Summary (tag obligatoire) : description en une ligne du package 
   	* Group (tag obligatoire) : pour classer le package, doit appartenir à la liste suivante :

Amusements/Games Amusements/Graphics Applications/Archiving Applications/Communications Applications/Databases Applications/Editors Applications/Emulators Applications/Engineering Applications/File Applications/Internet Applications/Multimedia Applications/Productivity Applications/Publishing Applications/System Applications/Text Development/Debuggers Development/Languages Development/Libraries Development/System Development/Tools Documentation System Environment/Base System Environment/Daemons System Environment/Kernel System Environment/Libraries System Environment/Shells User Interface/Desktops User Interface/X User Interface/X Hardware Support * Copyright (tag obligatoire) : le type de licence GPL, BSD, MIT, public domain, distributable, ou commercial. * Source : représente l'archive à partir de laquelle le package a été générée (typiquement une url). * Patch : de la même façon que le tag Source, ce tag donne l'archive utilisée pour patcher les codes. * Build-Root : chemin du répertoire dans lequel on va construire le package sans interférrer avec le reste du système. Exemple : /tmp/GeoIP-buildroot. * Packager : nom et adresse mail de la personne ayant créé le package * %description (tag obligatoire) : description détaillée en quelques lignes du contenu du package.


Prep : %prep Deuxième partie du spec file, c'est dans cette partie que l'on prépare les sources pour les construire. Typiquement c'est dans cette partie que l'on décompresse l'archive et qu'on lance le ./configure avec les options adéquates (comme le chemin où installer les binaires... à noter que pour rester propre dans la création des rpms devant les chemins souhaités il faut rajouter $RPM_BUILD_ROOT pour builder les binaires dans l'architecture prévue pour et ne pas interférrer avec le reste cf tag Build-Root).

Dans cette section il est possible d'utiliser une macro particulière : %setup qui permet de juste décompresser l'archive et rentrer dans le répertoire créé par la décompression de l'archive.

Voila ce que fait par defaut la macro %setup sans option : cd /usr/src/redhat/BUILD rm -rf cdplayer-1.0 gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf - if [ $? -ne 0 ]; then exit $? fi cd /usr/src/redhat/BUILD/cdplayer-1.0 chown -R root.root . chmod -R a+rX,g-w,o-w .

Il existe plusieurs options associées à cette macro :

   	* -n name  : name sera le nom du répertoire créé lors de la décompression de l'archive et dans lequel on sera à la fin du %setup.

* -c : va créer et rentrer dans le répertoire avant même d'avoir décompresser l'archive. Utile si il n'y pas de top level répertoire, ce qui entrainerait que tout les dossiers de l'archive décompressée se trouverait dans /usr/src/redhat/BUILD/ . Uniquement si il n'y a qu'une seule source !

   	* -b # : va décompresser uniquement Source# avant de rentrer dans le répertoire (aucun sens si on utilise avec l'option -c qui 

est faite pour une seule source), uniquement utile pour les spec files utilisant plusieurs Sources.

   	* -a # : va décompresser uniquement Source# avant de rentrer dans le répertoire
   	* -T : à utiliser uniquement lorsqu'il y a une seconde Source, uniquement décompresser l'archive principale, nécessite les 

options -b 0 ou -a 0.

   	* -D : n'efface pas le répertoire avant de décompresser l'archive. Uniquement util lorsqu'il y a plusieurs macros setup 

(au moins après la première macro setup). * -q : ne va pas afficher la liste des fichiers décompressés.

On peut utiliser n'importe quel script shell dans cette partie (ainsi que dans les suivantes).

Voici un exemple : %prep # section %prep %setup -q # décompression de l'archive et on rentre dans le répertoire associé patch -p1 --verbose -d ./ < enplus/top_fuel.vs.apache_1.3.33.patch # patch des sources avec le patch se trouvant dans enplus/ dans le répertoire associé à l'archive pwd # affiche le chemin jusqu'au répertoire dans lequel on se trouve ici on est dans /tmp/apache-buildroot cp -r enplus/mod_fastcgi-2.4.2/ src/modules/fastcgi # copie d'un module dans un répertoire précis de l'arboresence CFLAGS="-DTOP_FUEL -DHARD_SERVER_LIMIT=1024" \ # configuré avec les options et les flags qu'il faut ./configure \ --with-layout=Apache \ --prefix=/usr/local/httpd \ --exec-prefix=/usr/local/httpd-topfuel \


Build : %build Dans cette section on retourne à la racine du répertoire issue de la décompression (quelque soit l'endroit où on était dans la section précédente). Ici il y aura les commandes nécessaires pour créer les binaires : typiquement le make ! Mais toute commandes shell peut être utilisées pour cette section !


Install : %install Identique à %build sauf que dans cette section il n'y a que les commandes nécessaires pour installer les binaires : typiquement un make install ! Attention !! faire un "make install" sans rien spécifier va installer réellement le rpm ! il faut donc faire le "make install" en précisant le chemin du rpmbuildroot ! Voici un exemple de %install : %install make root="$RPM_BUILD_ROOT" install

Il faut bien entendu mettre le bon nom de l'option (ici root !) pour cela il suffit de regarder dans le Makefile.


Clean : %clean Dans cette section, il y a les commandes nécessaires à effacer toutes les traces laissées par la génération du RPM. Voici un exemple : %clean rm -rf $RPM_BUILD_ROOT


File :  %file (tags obligatoires) Dans cette section, il doit y avoir la liste des fichiers qui seront contenus dans le RPM. Car à la suite d'un make install, il n'y a aucun moyen pour que le rpmbuild sache ce qui a été installé !! Plusieurs macros sont donc disponibles :

   	* %doc utilise pour spécifier qu'un fichier est une documentation, le fichier sera donc par la suite installé 

automatiquement dans /usr/doc/$NAME-$VERSION-$RELEASE. /usr/doc est le chemin par defaut il est possible de le modifier en changeant la valeur de l'entrée defaultdocdir du fichier rpmrc (/usr/lib/rpm/rpmrc).

   	* %config utilisé pour spécifier qu'un fichier est un fichier de config. Ainsi lors de la désinstallation du package, 

si le fichier a été modifié il ne sera pas effacé, il sera sauvegardé avec l'extension .rpmsave .

   	* %dir utilisé pour spécifier un répertoire seul sans son contenu, sans cette macro si on précise un répertoire tout ce 

qu'il contient sera inclus dans la liste de fichiers. Cette macro empêche donc cela !

   	* %defattr permet de donner les attributs des fichiers listés en dessous de cette ligne. Cette macro doit être utilisée 

de la façon suivante : %defattr (mode, owner, group)

   	* %attr permet de donner les attributs du fichier qui suit. Cette macro s'utilise de la façon suivante :

%attr(mode, owner, group) fichier * %files -f <filename> permettre de lister un fichier particulier.

Scripts de pre et post installation/désinstallation : %pre : script executé avant installation du package %post : script executé après l'installation du package %preun : script executé avant la désinstallation du package %postun : script executé après la désinstallation du package

Utilisé, par exemple, pour rajouter ou enlever un process a lancé au démarrage ou pour la création ou destruction d'un utilisateur...



La création des subpackages : Il est possible, à partir d'un spec file, de générer plusieurs packages différents : utile pour créer des packages adaptés à différentes architectures par exemple. Pour cela il faut déclarer le package de la façon suivante : %package nom_du_subpackage

Puis pour les parties qui sont typiques à ce package, il suffit de déclarer la partie avec le nom du package comme suit : %post # post par defaut ... %post nom_du_subpackage # post pour nom_du_subpackage ...

Une condition est que chaque subpackage doit posséder ses propres tags summary, group et description ! De la même façon il faut obligatoirement une partie %file propre à chaque subpackage ! De plus comme il ne doit y avoir que un %build, un %prep et un %install, toutes ces parties sont donc communes pour les différents subpackages !

Nota : ainsi le rpm aura comme nom nom_du_package-nom_du_subpackage, lors de la définition du package on peut ajouter l'option -n ainsi le nom_du_package-nom_du_subpackage sera remplacé par nom_du_subpackage !


Exemple d'un spec file : %define name apache %define version 1.3.33 %define release 1

# Macro that print mesages to syslog at package (un)install time %define nnmmsg logger -t %{name}/rpm

Summary: Serveur Apache v1.3.33 release 1 URL: http://apache.org Name: %{name} Version: %{version} Release: %{release} Copyright: GPL Group: Application/System Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-buildroot Prefix: %{_prefix} #Requires: #PreReq:

%description Serveur Apache v1.3.33 patché avec top_fuel

%package ssl Summary: Serveur Apache v1.3.33 release 1 Group: Application/System %description ssl Serveur Apache v1.3.33 Avec module fast_cgi v2.4.2, module ssl 2.8.22 et openssl 0.9.7g

%prep %setup -q cp -r enplus/mod_fastcgi-2.4.2/ src/modules/fastcgi cd enplus/openssl-0.9.7g ./config make cd .. cd mod_ssl-2.8.22-1.3.33 ./configure --with-apache=../../ cd ../.. SSL_BASE="enplus/openssl-0.9.7g" \ ./configure \ --with-layout=Apache \ --prefix=/usr/local/httpd \ --exec-prefix=/usr/local/httpd-ssl \ --enable-module=expires \ --enable-module=rewrite \ --enable-module=ssl \ --activate-module=src/modules/fastcgi/libfastcgi.a

%build make

%install make root="$RPM_BUILD_ROOT" install

%clean rm -rf $RPM_BUILD_ROOT

%files /usr/local/httpd

%files ssl /usr/local/httpd /usr/local/httpd-ssl


Mise à jour d'un package RPM : Les packages créés jusqu'à présent sont amenés à évoluer et dans ce cas il sera nécessaire de refaire un package à jour. Pourr cela il faut

  • récupérer l'archive de la dernère version
  • la décompresser : tar -xvzf archive
  • effacer l'éventuel .spec présent dans le dossier issu de la décompression de l'archive
  • récupérer le .spec qui a été utilisé pour générer le package de la version précédente et mettre à jour les variables suivantes :

%define name nom_package %define version numero_de_la_derniere_version %define release

Summary : A mettre à jour

%definition A mettre à jour

  • placer le .spec modifié directement dans le répertoire issu de la décompression de l'archive
  • recréer une archive : tar -cvzf /tmp/package-version.tar.gz package-version/
  • créer le package : rpmbuild -tb /tmp/package-version.tar.gz
Personal tools