Conférence COAGUL : Initiation à la mise en paquet RPM

Cet article a été mis à jour, vous consultez ici une archive de cet article!

Mardi 14 Janvier 2014

Conférence COAGUL :
Initiation à la mise en paquet RPM

Adrien DAUGABEL




Prérequis pour l'atelier




Avoir accès à Internet (ou à la copie locale des miroirs Mageia 3)
Une machine virtuelle Mageia (ou récupérer l'image OVA fabriquée) en pont ou en NAT.
Avoir Virtualbox installé sur son PC
Avoir à disposition le script d'ajout de miroir local (si dans 1. la copie locale est utilisée) / Ou un accès à Internet


Préparer la VirtualBox



Pour ceux qui n'ont pas de Mageia :
  • Distribuer la machine virtuelle.
  • Montrer comment importer. (Réinitialiser l'adresse MAC ! )
  • Ajouter processeurs nb de processeurs physiques /2.
  • Mettre ~2Go de RAM à la machine, pas plus de 50 % de la RAM.
  • Être en interface par pont sur la carte Ethernet.


Une fois la machine virtuelle importée, la démarrer.
Clic droit sur le net applet, Configurer le réseau. Filaire (Ethernet) => Suivant tout le temps.


Choix de la distribution



Mageia :
Personnel : J'utilise Mageia depuis sa sortie, et Mandriva depuis 2008.
Les dépôts Mageia sont en train de s'approvisionner il manque des logiciels
Les choix de Mageia sur les versions stables : Ne faire que les mises à jour "importantes"



Rappel sur les commandes RPM et URPM




RPM : RPM Package Manager




Système de gestion de paquets, utilisés par certaines distributions GNU/Linux : Mageia, CentOS, OpenSUSE, Fedora
Commandes RPM = les mêmes.
A noter que RPM ne gère pas les dépendances.

rpm -i : installer
rpm -e : supprimer
rpm -U : mettre à jour
-vh : En mode verbeux, et avec une barre de progression.
rpm -E %{macro} : donne la valeur de la macro ( rpm -E %{_lib} )


URPM : User RPM




Mageia utilise URPM (hérité de Mandriva, utilisé aussi dans ROSA et OpenMandriva)
Fedora utilise YUM, et OpenSuse utilise zypper.

Les commandes essentielles :
urpmi => Installation et Mise à jour
urpmq => Recherche
urpme => Suppression


Concept de build : RPM, SRPM





Un RPM, c'est un paquetage binaire ou métapaquetage.




Le métapaquetage : Le plus simple, suite de dépendances.
Un paquetage binaire est un fichier qui contient tous les fichiers appartenant à une certaine application (ou bibliothèque). Un peu à la manière d'une archive TAR (ou ZIP). Mais le paquetage n'est pas seulement une archive (compressée), il contient aussi des scripts de contrôle. Ces scripts sont lus, exécutés et stockés lors de l'installation locale du RPM. Ils gèrent l'installation, la désinstallation, les contrôles d'état, les dépendances etc.


Un SRPM, c'est un paquetage source.




Un paquetage source contient le code source de l'application, les éventuels patchs, et le fichier SPEC.


Ce qu'il faut comprendre




La création d'un paquet binaire consiste à compiler le programme sur une machine, à partir du code source. Nécessite bien souvent de connaître le langage de programmation. Google est notre ami sinon.
On y applique parfois des patchs.
On en produit un fichier RPM.

Compilation = long + chercher les dépendances etc...

Avantage du RPM, apporter à l'utilisateur un paquet tout fait, qui s'installe rapidement.

Attention : Si compile sur machine 32bits, c'est un RPM 32bits généré. (Idem 64bits). Impossible de faire des RPM32 sur PC 64bits (mais dépendances 32bits OK). Sauf paquets noarch.


Installer les prérequis




Besoin de plusieurs outils :
  • rpm et urpmi : Logique pour faire des paquets mais déjà installé par défaut.
  • rpm-build : Contient les scripts et exécutables pour compiler des paquets RPM.
  • rpm-sign : Sert à signer ses paquets RPM
  • rpmlint et rpmlint-mageia-policy : Vérificateur de paquets RPM
  • rpmdevtools : Outils de développement RPM


Se déconnecter de root, car pas besoin de droits root pour compiler.


Créer les répertoires requis




Créer l'arborescence :
Code BASH :
mkdir -p ~/rpmbuild/{BUILD,RPMS/{i586,noarch,x86_64},SOURCES,SRPMS,SPECS}


Vérifier :
Code BASH :
tree rpmbuild 
rpmbuild 
|-- BUILD 
|-- RPMS 
|   |-- i586 
|   |-- noarch 
|   `-- x86_64 
|-- SOURCES 
|-- SPECS 
|-- SRPMS 


  • ~/rpmbuild/BUILDROOT : émulation du / pour compiler les paquets (Fake-root)
  • ~/rpmbuild/BUILD : dossier où se fait la compilation des sources.
  • ~/rpmbuild/RPMS : contient les répertoires, un par architecture, qui contiendront les paquetages binaires générés.
  • ~/rpmbuild/RPMS/i586 : le répertoire où seront stockés les paquetages binaires 32bits.
  • ~/rpmbuild/RPMS/x86_64 : le répertoire où seront stockés les paquetages binaires 64bits.
  • ~/rpmbuild/RPMS/noarch : le répertoire où seront stockés les paquetages binaires indépendants de l'architecture du processeur (Exemples thèmes, fond d'écran...)
  • ~/rpmbuild/SOURCES : contient les fichiers sources (par exemple monpaquetage.tar.bz2 ).
  • ~/rpmbuild/SPECS : contient les fichiers spec que nous devons écrire.
  • ~/rpmbuild/SRPMS : RPM sources après la construction. (pas d'architecture)





Structure d'un fichier SPEC




Créer un fichier spec : test.spec
Pour plus de simplicité (et fichier pré-rempli) :
Code BASH :
rpmdev-newspec test


Décortiquer les sections SPEC :

En bleu, les valeurs minimum requises pour effectuer la compilation d'un RPM

  • %global var val : variable globale
  • Name : nom du paquet
  • Version : version du paquet
  • Release : Révision du paquet (%mkrel 1)
  • Summary : Résumé du paquet
  • License : Type de License
  • Group : Groupe de tri des paquets https://wiki.mageia.org/en/RPM_groups_policy (Pour classer dans le CCM).
  • URL : Lien de téléchargement du logiciel empaqueté
  • Source0 : Premier fichier source
  • Patch0 : Premier fichier patch
  • BuildRequires : Paquetages requis pour la compilation du paquet RPM.
  • BuildConflicts : Paquetages en conflits pour la compilation du paquet RPM.
  • Requires : Paquetages requis pour l'utilisation du RPM (dépendances)
  • %{_lib} = lib si 32bits, lib64 si 64bits.
  • Suggests : Paquets suggérés à l'installation (pas orphelins si paquet désinstallé)
  • Obsoletes : Paquets obsolètes à proposer de désinstaller
  • Conflicts : Paquets en conflits avec celui qu'on créée
  • %description : Description complète du paquet
  • %prep : section de préparation à la compilation (créé le dossier ~/rpmbuild/BUILD)
  • %setup -q (silencieux) (-n name si le nom du rpm est différent du dossier source) (-a 1 = Source1 si pas de -a = Source0) : Extraction du zip
  • %patch0 -p1 : Applique le patch0 avec la commande patch

  • %build : section de compilation (compilation réelle du logiciel dans ~/rpmbuild/BUILD)
  • %configure : = ./configure avec des options (more /etc/rpm/macros.d/20build.macros)
  • %make = make (avec les -j qui vont bien )