Faire ses propres RPMs sous Fedora

Bonjour à tous,
Cela fait bien longtemps que je voulais faire ce ticket. A chaque fois que j’ai une manipulation à faire sur un RPM c’est la même rengaine, c’est une action rare et du coup je dois bien passer deux heures à chercher pour faire une action qui devrait prendre 3 minutes.

Les RPM, et le packaging en général sont des sujets très intéressants, très documentés aussi. Je citerais mes sources en fin d’article.

Étape 1 – Préparation logiciel

Alors voici un certains nombre d’applications à installer pour être bien préparé :

(En root)
yum groupinstall "Fedora Packager"
yum install rpmdevtools
yum groupinstall "Development Tools"
yum install kernel-devel kernel-headers kmodtool fedpkg (pour les amoureux du noyau et des modules)

Etape 2 – Utilisateur builder

Bon je l’appel builder (je sors ça d’un tutos) mais prenez le nom que vous voulez.

(En root)
useradd builder
passwd builder
su - builder
rpmdev-setuptree

echo "%vendor                    VOTRE_NOM" >>    $HOME/.rpmmacros
echo "%packager             Fedora user" >>    $HOME/.rpmmacros
echo "%dist                       .f14" >>    $HOME/.rpmmacros

(Pensez bien sur à remplacer VOTRE_NOM et f14 pour les valeurs de votre choix)

Etape 2bis (facultative) – Préparation des signatures GPG

A la suite de l’étape 2, faites :

gpg --gen-key
echo "%_signature             gpg" >>    $HOME/.rpmmacros
echo "%_gpg_name              VOTRE_NOM" >>    $HOME/.rpmmacros
echo "%_gpg_path              /home/builder/.gnupg" >>    $HOME/.rpmmacros
gpg --export --armor >RPM-GPG-KEY-VOTRE_NOM

Etape 3 – Construction d’un RPM

Alors ici, plusieurs possibilités, voici donc une liste de quelques opérations courantes :

  • Construction d’un paquet déjà existant sur un dépôt distant
  • Construction d’un paquet à partir d’un src.rpm
  • Construction d’un paquet à partir du fichier SPEC

Construction d’un paquet déjà existant sur un dépôt distant

C’est le cas le plus simple et le plus courant. Par exemple, mettons qu’il y ait une erreur de dépendance entre deux paquets suite à la mise à jour de l’un sans recompilation de l’autre, la solution est de compiler à nouveau le paquet défectueux.

Parfois cette erreur n’est corrigée sur les serveurs que plusieurs jours après. Un solution serait alors de les devancer sans pour autant avoir à compiler à la main le dernier tar.gz qui traine.

Pour cela, rien de plus simple,  il suffit de récupérer le fichier src.rpm sur le dépôt distant directement avec yum :

(En builder)
cd ~/rpmbuild/SRPMS
yumdownloader --source mpd

Désormais le fichier src.rpm se trouve dans le dossier courant (~/rpmbuild/SRPMS) lisez la suite pour préparer le rpm.

Construction d’un paquet à partir d’un src.rpm

Une fois le fichier src.rpm copié dans le dossier rpmbuild/SRPMS de l’utilisateur builder :

(En builder)
rpmbuild --rebuild mpd-0.15.11-1.fc14.src.rpm

Et voila, le dossier rpmbuild/RPMS/x86_64 (ou i586, selon l’architecture de la machine local) contient le rpm désiré.

Si vous souhaitez préciser l’architecture ciblée, faite ainsi :

rpmbuild --rebuild mpd-0.15.11-1.fc14.src.rpm --target i586,x86_64

Si vous souhaitez pouvoir modifier ce paquet (ajouter un patch ou je ne sais quoi, lisez la suite).

Construction d’un paquet à partir du fichier SPEC

La préparation de paquet à partir d’un fichier SPEC est très fréquente aussi. Qu’il s’agisse d’une nouvelle application (donc absente des dépôts distants) ou bien d’une mise à jour. C’est le moyen de modifier des paquets déjà existants.

Pour ce faire, vos sources (le tar.gz ainsi que les patchs)  doivent être présentes dans le dossier ~/rpmbuild/SOURCES et votre fichier spec dans le dossier rpmbuild/SPECS.

Si vous disposez d’un src.rpm, utilisez la commande suivante :

(En builder)
rpm -ivh mpd-0.15.11-1.fc14.src.rpm

Si vous ne disposez que d’un fichier SPEC, il existe une commande qui, si les liens du spec sont corrects, vous permettra de rapatrier tous  les fichiers nécessaires.

(En builder)
cd ~/rpmbuild/SOURCES
spectool -g ../mpd.spec

Ensuite la construction se fait ainsi :

(En builder)
cd ~/rpmbuild/SPECS
rpmbuild -ba mpd.spec

A la fin de ces étapes, vous disposez enfin de rpm valides dans le dossier ~/rpmbuild/RPMS.

Pour les installer, une solution simple s’offre à vous :

(En root)
rpm -ivh  /home/builder/rpmbuild/RPMS/i386/mpd-0.15.11-1.fc14.i386.rpm

Mais une deuxième solution existe, le dépôt local.

REMARQUE : La compilation d’un RPM nécessite les dépendances de ce dernier. Pour les installer facilement :

yum-builddep less-394-1.fc4.src.rpm -y

 

Création d’un dépôt local pour yum

Préparation

Pour construire son propre dépôt il faut commencer par ranger les rpms dans un dossier commun. Ici j’utiliserais /DATA/depot/14.

On respectera l’arbo (RPM et SRPMS) déjà utilisée pour le dossier rpmbuild de l’utilisateur builder.

[FACULTATIF] Signer les paquets (avec builder)  rpmsign –addsign paquet.rpm [FACULTATIF]

Pour générer le dépôt, rien de plus simple :

(utilisateur gérant le dossier /DATA/depot/14)
cd /DATA/depot/14
createrepo .

Un dossier repodata est créé, tout s’est bien passé.

Définition du dépôt local dans yum

La définition du dépôt local se fait dans le dossier /etc/yum.repos.d/

Ajoutez-y un fichier local.repo contant les lignes suivantes :

[localrepo]
name=Fedora Core $releasever - My Local Repo
baseurl=file:///DATA/14
enabled=1
gpgcheck=0

mettez gpgcheck=1 si vos paquet sont signez, mais pensez alors à installer la clef GPG :

(En root)
rpm --import ~builder/RPM-GPG-KEY-VOTRENOM

A chaque modification du dépôt, pensez à refaire la commande createrepo. De même, pour vous assurer que ces nouveaux paquets soient pris en compte par yum, pensez a faire un yum clean metadata.

Voilà, c’est tout pour aujourd’hui.

Sources :

http://doc.fedora-fr.org/wiki/RPM_:_environnement_de_construction (mon ticket est très inspiré de cette page)

http://www.g-loaded.eu/2005/12/11/local-yum-repository/ (Partie dépôt local)

Une réflexion sur “Faire ses propres RPMs sous Fedora

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s