RPM (RedHat Package Manager) est un système de gestion de paquets destiné aux systèmes RHEL.
Le fichier .rpmmacros permet de définir les macros du système, pour les dadpter à un environnement particulier. Toutes les macros définies dans ~/.rpmmacros remplacent les macros système définies.
Dans l'exemple suivant :
~/.rpmmacros % packager VOTRE NOM % _topdir% (echo $ HOME) / rpmbuild % _smp_mflags% (\ [-z "$RPM_BUILD_NCPUS"]\\\ && RPM_BUILD_NCPUS = "`/usr/bin/nproc2>/dev/null|| \\\ /usr/bin/getconf _NPROCESSORS_ONLN`";\\\ if ["$ RPM_BUILD_NCPUS" -gt 16]; then \\\ echo "-j16"; \\\ elif ["$RPM_BUILD_NCPUS" -gt 3]; then \\\ echo "-j $RPM_BUILD_NCPUS"; \\\ else\\\ echo "-j3"; \\\ Fi) %__arch_install_post \ [ "%{buildarch}" = "noarch" ] || QA_CHECK_RPATHS=1 ; \ case "${QA_CHECK_RPATHS:-}" in [1yY]*) /usr/lib/rpm/check-rpaths ;; esac \ /usr/lib/rpm/check-buildroot
Un fichier SPEC peut être considéré comme la recette utilisée par l'utilitaire rpmbuild pour créer un RPM. Il indique au système de compilation quoi faire en définissant des instructions dans une série de sections.
Pour créer un modèle de fichier SPEC, exécuter la commande suivante :
$ rpmdev-newspec nom_du_spec
Certains types de paquets ont besoin de fichier SPEC “particuliers” ; comme par exemple les paquets Python, Perl, Ruby… La liste des modèles à cet effet se trouve dans les fichiers /etc/rpmdevtools/spectemplate-*.spec, c'est le fichier spectemplate-minimal.spec qui sera utilisé par défaut. La dernière commande deviendra dans ce cas :
$ rpmdev-newspec -t {template} nom_du_spec
Pour empaqueter un logiciel écrit en Perl par exemple, la commande sera :
$ rpmdev-newspec -t perl nom_du_spec
Cette commande créera un squelette dans le fichier nomduspec.spec dont le contenu sera :
Name: nom_du_spec Version: Release: 1%{?dist} Summary: Group: License: URL: Source0: BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: Requires: %description %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc %changelog
Name: nom_du_spec Version: Release: 1%{?dist} Summary: Group: License: URL: Source0: BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Le début du fichier est composé des entrées suivantes :
$ cat /usr/share/doc/rpm-*/GROUPS
BuildRequires: Requires:
Un paquet RPM possède deux sortes de dépendances : les dépendances pour la compilation et celles pour l'utilisation.
Les paquets doivent ici être simplement listés, séparés par un espace. Soyez le plus restrictif possible, si votre paquet dépend de 'a' et 'b', et que 'a' dépend lui même de 'b', il suffit de mettre 'a' en BR ou Requires, yum fera le reste
Définit les dépendances de compilation. On rencontre souvent l'abréviation BR pour désigner cette entrée. Les BR seront utilisés lors de la construction du RPM par extras ; le passage à mock produira une erreur si les BR ne sont pas corrects.
La liste des BR correspond généralement à un *-devel, beaucoup de dépendances (bibliothèques, *.so et perl) sont gérées automatiquement.
Note : Installation des dépendances
Pour pouvoir (re)construire un paquet, il faudra installer tous les paquets listés en BuildRequires. Pour ce faire, utiliser la commande suivante :
$ su -lc 'yum-builddep nomdupaquet'
Définit les dépendances d'installation. Les Requires sont utilisés lors de l'installation du paquet par l'utilisateur.
Pour connaître les dépendances d'un paquet rpm, utiliser la commande :
$ rpm -qp --requires paquet.rpm
ou encore :
$ rpm -q --requires paquet
On peut trouver les macros existantes dans les fichiers /usr/lib/rpm/macros et /usr/lib/rpm/i386-linux/macros, et aussi /etc/rpm/* qui peuvent contenir des macros ajoutés par d'autres RPM (ex : php, pear, jpackage…)
%prep %setup -q
Cette section prépare votre logiciel pour son empaquetage.
C'est ici que les sources seront décompressées, et que les patchs éventuels (que ce soient les vôtres ou cexu fournis par le projet initial) seront appliqués.
Cette étape travaille uniquement dans le dossier BUILD.
%build %configure make %{?_smp_mflags}
Cette section compile le logiciel.
C'est ici que seront exécutées les commandes ./configure et make. L'exécution du script de configuration vérifiera (si le logiciel empaqueté les renseigne correctement ) les autres programmes requis pour sa compilation. Vous pourrez, au fur et à mesure des erreurs signalées par le script de configuration, renseigner les BuildRequires.
Cette étape travaille uniquement dans le dossier BUILD.
%install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT
La section %install du fichier .spec installe les fichiers binaires, les pages de manuel, les fichiers de configuration et tous les autres composants appartenant au package RPM dans leurs emplacements respectifs dans le répertoire racine de construction virtuelle. Il faut définir le mot clé BuildRoot dans la première partie, c'est le répertoire racine de la construction virtuelle dans lequel seront installés le fichiers.
La macro $RPM_BUILD_ROOT doit être définie dans le répertoire défini dans le mot clé BuildRoot de l'en-tête du fichier SPEC du RPM. En règle générale, on le définit comme suit: %{_tmppath}/%{name}-%{version}}. Ceci est considéré comme le répertoire racine de premier niveau par RPM.
L'exemple suivant présente une installation assez simple qui illustre un des scripts de %install les plus faciles que l'on puisse rencontrer :
%install mkdir -p $ RPM_BUILD_ROOT/usr/bin install -m755 $RPM_BUILD_DIR/%{name}-%{version}/rpmproc $RPM_BUILD_ROOT/usr/bin install -m644 $RPM_BUILD_DIR/%{name}-%{version}/rpmproc.conf $RPM_BUILD_ROOT/etc
%files %defattr(-,root,root,-) %doc
La section %files du fichier .spec est une section très importante car elle indique à RPM quels fichiers doivent être inclus dans les packages binaires. Dans l'exemple suivant :
%files %defattr(-,root,root) %doc README COPYING COPYRIGHT /usr/bin/rpmproc /etc/rpmproc.conf
La partie changelog du fichier SPEC indique les modifications apportées au fichier. Chaque entrée est formatée de la façon suivante :
* Sun Dec 3 2006 Nom Auteur <adresse@email> version_logiciel-version_paquet - Modification - ...
La date au bon format peut être facilement connue via la commande :
LC_TIME=en_US date +"%a %b %e %Y"
Si l'application empaquetée contient des fichiers de localisation (généralement, ces fichiers sont installés dans %{_datadir}/locale et se nomment %{name}.mo), il faudra les traiter d'une façon particulière.
Tout d'abord, ajoutez gettext à vos BuildRequires. Ensuite, il faut trouver les fichiers de localisation, vous utiliserez pour cela la macro %find_lang dans la section %install de la façon suivante :
%find_lang %{name}
Enfin, il faut inclure les fichier de localisation dans la section %files :
%files -f %{name}.lang
Si l'application possède une interface graphique, il est probable que l'on ai besoin d'un fichier .desktop afin qu'un raccourci apparaissent dans les menus. Il est possible que l'application intègre déjà une fichier .desktop qui sera alors simplement intégré lors de la résolution des %files. Dans le cas contraire, il suffit de créer le fichier ~/rpmbuild/SOURCES/nom_application.desktop selon le modèle suivant :
[Desktop Entry] Encoding=UTF-8 Name=Comical GenericName=Comic Archive Reader Comment=Open .cbr & .cbz files Exec=comical Icon=comical.png Terminal=false Type=Application Categories=Application;Graphics; Version=0.9.4
Puis ajouter dans lee fichier SPEC :
dans BuildRequires :
desktop-file-utils
en source, votre fichier .desktop :
Source10: %{name}.desktop
pour la prise en charge du fichier, dans la section %install :
desktop-file-install --vendor="" \ --dir=%{buildroot}%{_datadir}/applications/ \ %{buildroot}%{_datadir}/applications/foo.desktop
Dans le cas ou le fichier .desktop fait référence à une image (comical.png), il est nécessaire de mettre à jour le cache des icônes. Dans le cas contraire, l'icône ne sera visible qu'après reconnexion de l'utilisateur à sa session graphique.
Dans la section %post du fichier SPEC, mettez à jour le cache pour les icones :
touch --no-create %{_datadir}/icons/hicolor if [ -x %{_bindir}/gtk-update-icon-cache ]; then %{_bindir}/gtk-update-icon-cache -q %{_datadir}/icons/hicolor; fi update-mime-database %{_datadir}/mime &> /dev/null || : update-desktop-database &> /dev/null || :
Dans la section %postun du fichier SPEC, mettez également à jour le cache pour les icones :
touch --no-create %{_datadir}/icons/hicolor if [ -x %{_bindir}/gtk-update-icon-cache ]; then %{_bindir}/gtk-update-icon-cache -q %{_datadir}/icons/hicolor; fi update-mime-database %{_datadir}/mime &> /dev/null || : update-desktop-database &> /dev/null || : Ressources : Spécification Catégories
Afin de construire le paquet, les sources du programme doivent être dans une archive .tar.gz dans le répertoire ~/rpmbuild/SOURCES/ (Le nom du paquer .tar.gz doit correspondre à la valeur renseignées dans Source0 dans le fichier SPEC).
Une fois cette étape complétée, suivre simplement les étapes suivantes :
rpmbuild -bp fichier.spec
Execute la section %prep
rpmbuild -bc --short-circuit fichier.spec
Execute les sections %prep, %build
L'option –short-circuit permet de forcer la compilation à redémarrer à la dernière étape valide (-bc, -bi uniquement)
rpmbuild -bi --short-circuit fichier.spec
Execute les sections %prep, %build, %install, %check
Note: L'option –short-circuit permet de forcer la compilation à redémarrer à la dernière étape valide (-bc, -bi uniquement)
(Cette dernière commande va exécuter de nouveau les procédures précédentes)
rpmbuild -ba fichier.spec
Execute les sections %prep, %build, %install, %check, package (bin, src)