Commençons par examiner l’entête du fichier de spécification :
BuildRoot: %{_topdir}/BUILDROOT/ Summary: Prints "Hello world!" on stdout License: GNU Name: hello-world Version: 1 Release: 1 Group: Education BuildArchitectures: i586 %description Prints "Hello world!" on stdout, that's all !
Seul le BuildRoot mérite des explications approfondies. Il s’agit de la racine du répertoire qui va servir de laboratoire. Lors de la construction du package, le fichier exécutable est placé dans $HOME/rpmbuild/BUILDROOT/usr/bin/. Lors de l’installation sur la machine de l’utilisateur, le BuildRoot est supprimé du chemin, l’exécutable est donc placé dans /usr/bin/. Le %{_topdir} est lu dans le fichier $HOME/.rpmmacros.
Détaillons maintenant les sections contenant les commandes. Commençons par la section %build :
%build cd %{_sourcedir}; gcc -Wall -o helloWorld helloWorld.c
%{_sourcedir} est le répertoire contenant les sources, il se construit de la façon suivante : %{_topdir}/SOURCES. La première commande positionne le shell dans le répertoire contenant les sources et la deuxième commande compile la source. La deuxième section, %install, contient les instructions nécessaires pour installer les exécutables à la bonne position dans le "laboratoire" :
%install rm -fR $RPM_BUILD_ROOT; mkdir -p $RPM_BUILD_ROOT/usr/bin; cd %{_sourcedir} mv helloWorld $RPM_BUILD_ROOT/usr/bin/;
$RPM_BUILD_ROOT est une variable d’environnement du shell positionnée automatiquement sur le BuildRoot précisé dans l’entête. La première instruction créée dans le laboratoire le répertoire qui va contenir le binaire, se place dans le %{_sourcedir} et recopie l’exécutable au bon endroit. C’est à ce moment que se fait la "photo" et que le package est construit. Les fichiers générés ne servent plus à rien et doivent être détruits une fois la construction terminée. On fait le ménage en exécutant les commandes de la section %clean.
%clean rm -rf $RPM_BUILD_ROOT/
Le seul fichier généré se trouvant dans BuildRoot, on fait le nettoyage de façon quelque peu expéditive en vidant le répertoire BuildRoot. Lorsque la photo se fait, la liste des fichiers trouvés est comparée à celle se trouvant dans la section %file.
%files %attr(755,root,root) /usr/bin/helloWorld
Cette section permet de récupérer seulement les fichiers qui feront partie du package, et de préciser entre autres les droits de ces fichiers. Ils doivent apparaître dans cette section tels qu’on les trouvera sur la machine de l’utilisateur, donc sans le BuildRoot. L’instruction %attr(755,root,root) signifie que le fichier sera en droits 755, appartient à l’utilisateur root qui est dans le groupe root.
On vérifie la façon dont les sections sont exécutées en observant la trace d’exécution de rpmbuild :
Exécution_de(%build): /bin/sh -e /home/klaus/rpmbuild/tmp/rpm-tmp.mYkjvt + umask 022 + cd /home/klaus/rpmbuild/BUILD + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + cd /home/klaus/rpmbuild/SOURCES + gcc -Wall -o helloWorld helloWorld.c + exit 0
Exécution_de(%install): /bin/sh -e /home/klaus/rpmbuild/tmp/rpm-tmp.mlKdL2 + umask 022 + cd /home/klaus/rpmbuild/BUILD + '[' 1 -eq 1 ']' + rm -fR /home/klaus/rpmbuild/BUILDROOT/hello-world-1-1.i386 + mkdir -p /home/klaus/rpmbuild/BUILDROOT/hello-world-1-1.i386/usr/bin + cd /home/klaus/rpmbuild/SOURCES + mv helloWorld /home/klaus/rpmbuild/BUILDROOT/hello-world-1-1.i386/usr/bin/
Exécution_de(%clean): /bin/sh -e /home/klaus/rpmbuild/tmp/rpm-tmp.swL3yp + umask 022 + cd /home/klaus/rpmbuild/BUILD + rm -rf /home/klaus/rpmbuild/BUILDROOT/hello-world-1-1.i386/ + exit 0