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)