Construire des paquets RPM pour CentOS

Paquets RPMCet article décrit de façon succincte la mise en place d’un environnement de construction et la compilation de paquets pour CentOS. La construction de paquets RPM est un vaste chapitre. Ce petit tutoriel me sert avant tout de pense-bête pour les spécificités de la construction d’un paquet sous RHEL/CentOS. Il ne pourra pas remplacer une documentation détaillée.

Dans l’exemple qui suit, je vais construire le paquet Plank pour CentOS 7 depuis le paquet source de Fedora 22. Je vais partir d’un système minimal et installer pas à pas les outils et autres dépendances nécessaires.

Mettre en place l’environnement de construction

L’outil de construction rpmbuild est fourni par le paquet rpm-build. L’outil rpmsign fourni par le paquet rpm-sign nous servira à signer nos paquets.

# yum install rpm-build rpm-sign

On prendra soin de construire les paquets en tant que simple utilisateur. Les droits root seront uniquement nécessaires pour l’installation des paquets.

Créer l’arborescence de construction des paquets.

$ mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
mkdir: création du répertoire « /home/kikinovak/rpmbuild »
mkdir: création du répertoire « /home/kikinovak/rpmbuild/BUILD »
mkdir: création du répertoire « /home/kikinovak/rpmbuild/RPMS »
mkdir: création du répertoire « /home/kikinovak/rpmbuild/SOURCES »
mkdir: création du répertoire « /home/kikinovak/rpmbuild/SPECS »
mkdir: création du répertoire « /home/kikinovak/rpmbuild/SRPMS »

Vérifier la clé GPG.

$ gpg --list-keys
...
pub 4096R/C56945AE 2018-04-09
uid                Nicolas Kovacs <info@microlinux.fr>
uid                [jpeg image of size 15912]
sub 4096R/D8190FE0 2018-04-09

Exporter la clé publique vers un fichier texte.

$ gpg --export -a 'info@microlinux.fr' > RPM-GPG-KEY-microlinux

Importer la clé publique vers la base de données RPM.

$ sudo rpm --import RPM-GPG-KEY-microlinux

Vérifier la liste des clés GPG publiques dans la base de données RPM.

$ rpm -q gpg-pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
gpg-pubkey-352c64e5-52ae6884
gpg-pubkey-baadae52-49beffa4
gpg-pubkey-c56945ae-5acb6997 <== empreinte de ma clé publique

Ensuite, éditer un fichier ~/.rpmmacros comme ceci.

%_topdir /home/kikinovak/rpmbuild
%packager Nicolas Kovacs <info@microlinux.fr>
%dist .el7.microlinux
%_signature gpg
%_gpg_path /home/kikinovak/.gnupg
%_gpg_name Nicolas Kovacs
%_gpgbin /usr/bin/gpg

Construction d’un paquet RPM

Dans l’exemple, je pars d’un paquet SRPM (Source RPM) récupéré sur le portail http://rpm.pbone.net. , en l’occurrence plank-0.10.1-1.fc22.src.rpm. Dans la pratique quotidienne, on partira souvent d’un SRPM de Fedora que l’on recompilera pour l’intégrer à CentOS.

rpm.pbone.net

Créer un répertoire ~/SRPMS pour y ranger les paquets source téléchargés.

$ mkdir -v ~/SRPMS
mkdir: création du répertoire « /home/kikinovak/SRPMS »

Si l’on part d’un paquet source SRPM, on peut utiliser rpm en tant que simple utilisateur, et la commande rpm -ivh installera les fichiers au bon endroit.

$ rpm -ivh plank-0.10.1-1.fc22.src.rpm
attention : plank-0.10.1-1.fc22.src.rpm: Entête V3 
RSA/SHA256 Signature, clé ID 8e1431d5: NOKEY
Mise à jour / installation...
1:plank-0.10.1-1.fc22 ################################# [100%]

Voici comment se présentent les fichiers installés.

$ tree ~/rpmbuild/
/home/kikinovak/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
│   ├── 000_patentpatch.patch
│   └── plank-0.10.1.tar.xz
├── SPECS
│   └── plank.spec
└── SRPMS
  • le code source “vanillaplank-0.10.1.tar.xz
  • les instructions de compilation plank.spec
  • un patch 000_patentpatch.patch

Alternativement – si l’on ne trouve pas de paquet SRPM – on peut récupérer le fichier .spec pour le placer dans ~/rpmbuild/SPECS. Puis on récupère les sources correspondantes, et on les range manuellement dans le répertoire ~/rpmbuild/SOURCES.

Avant de tenter un premier essai, je vais quand-même installer un minimum d’outils de compilation.

# yum install gcc make

À cette étape, on peut éventuellement éditer le fichier .spec pour y apporter des modifications. En l’occurrence, j’annule l’application d’un patch qui désactive une fonctionnalité soumise à un brevet.

%prep
%setup -q
# %patch0 (commenter)

Je lance une première tentative de compilation.

$ cd ~/rpmbuild/SPECS/
$ rpmbuild -ba --clean plank.spec

Quelques remarques sur les options utilisées.

  • L’option -ba construit les paquets binaires et les sources (RPM et SRPM).
  • L’option --clean nettoie l’arborescence de construction.

Cette première tentative se solde par une erreur, étant donné qu’il manque un certain nombre de dépendances.

rpmbuild-deps

J’installe les dépendances de construction, qui sont fournies par les dépôts [base], [epel] et [nux-dextop].

Je relance rpmbuild, et au terme de la compilation, j’obtiens ceci.

$ tree ~/rpmbuild/
/home/kikinovak/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
│   └── x86_64
│       ├── plank-0.10.1-1.el7.microlinux.x86_64.rpm
│       ├── plank-debuginfo-0.10.1-1.el7.microlinux.x86_64.rpm
│       └── plank-devel-0.10.1-1.el7.microlinux.x86_64.rpm
├── SOURCES
│   ├── 000_patentpatch.patch
│   └── plank-0.10.1.tar.xz
├── SPECS
│   └── plank.spec
└── SRPMS
    └── plank-0.10.1-1.el7.microlinux.src.rpm

Il ne me reste plus qu’à installer les paquets RPM résultants avec rpm -ivh ou yum localinstall.

Signer un paquet

Une fois que j’ai construit mes paquets, je peux les signer comme ceci.

$ rpm --addsign untex-1.3-3.1.el7.microlinux.x86_64.rpm
Entrez la phrase de passe : 
Phrase de passe bonne.
untex-1.3-3.1.el7.microlinux.x86_64.rpm:

L’option --checksig me permet de vérifier la signature d’un paquet.

$ rpm --checksig untex-1.3-3.1.el7.microlinux.x86_64.rpm
untex-1.3-3.1.el7.microlinux.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

Il est tout à fait possible de signer plusieurs paquets “à la louche”.

$ rpm --addsign recoll-*
Entrez la phrase de passe :
Phrase de passe bonne.
recoll-1.23.1-2.el7.microlinux.x86_64.rpm:
recoll-debuginfo-1.23.1-2.el7.microlinux.x86_64.rpm:
recoll-kio-1.23.1-2.el7.microlinux.x86_64.rpm:
Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , . Vous pouvez le mettre en favoris avec ce permalien.

5 réponses à Construire des paquets RPM pour CentOS

  1. Ping : Construire des paquets RPM pour CentOS - My Tiny Tools

  2. Denis dit :

    En fait, le gros souci, c’est le fichier .spec. Et là, on a pas à faire à des partageux !

    Merci, en tout cas, de cet excellent tuto.

    • kikinovak dit :

      Je ne construis des paquets RPM que de manière très épisodique. La plupart du temps, je trouve ce qu’il me faut sur rpm.pbone.net. On trouve des SRPM pour à peu près tout, et après, il suffit d’extraire le fichier .spec et de le modifier à sa convenance. En tout cas, je suis content que ça vous ait été utile.

  3. Pofilo dit :

    Comme @Denis l’a dit, le plus dur est le .spec ^^

    Sinon, pour créer toute l’architecture sous ~/rpmbuild/, on peut utiliser la commande “rpmdev-setuptree” (disponible via le paquet “rpmdevtools.noarch” avec un “yum install”).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.