next up previous contents
Next: About this document ... Up: Formation LiLiT Previous: 3 Gestion des utilisateurs,   Contents

Subsections

4 Système de packages

4.1 Qu'est-ce qu'un package

Un package est une archive contenant des données et/ou des programmes ainsi que les informations nécessaires à une installation correcte de ceux-ci sur le système. Un package est constitué d'un et un seul fichier, ce n'est pas un exécutable, il est pris en charge par un programme dédié, le gestionnaire de package.

Il existe plusieurs types différents de package

Il faut noter que les différentes saveurs libres de BSD utilisent un système différent, appelé ports, ou les programmes sont systématiquement recompilés.

4.2 Les dépendances

La gestion des dépendances est un des gros avantages des systèmes de packages.

Chaque package contient une liste des fonctionnalités qu'il fournit, cela commence par le nom du package lui-même, cela peut également être un programme particulier, une bibliothèque générique ou dans une version plus particulière ou encore une fonctionnalité plus ``diffuse'' telle que ``serveur ftp'' pour apache ou ``gestionnaire de téléchargement'' pour wget.

Ensuite les packages vont contenir une liste des fonctionnalités qui leurs sont nécessaires pour être fonctionnels2.

Lors de l'installation, le gestionnaire de packages va vérifier que toutes les dépendances sont vérifiées et que l'installation du nouveau package ne va pas écraser des fichiers d'autres packages, sinon il refusera d'installer, il reste possible de forcer l'installation à ses risques et périls.

De même, à la désinstallation d'un package, il vérifie que la suppression de ce(s) package(s) ne gène pas le fonctionnement d'autres packages, une fois encore on peut ne pas tenir compte des dépendances mais cela peut s'avérer assez grave (forcer la désinstallation de la glibc est le parfait exemple de ce qu'il faut faire si on veut foutre en l'air son système).

4.3 Les scripts

Si pour installer une documentation il est suffisant d'en décompresser les fichiers, il n'en va pas forcément de même pour des programmes et encore moins pour des bibliothèques dont l'installation nécessitera d'effectuer des opérations sur le systèmes pour que le contenu du package soit pleinement fonctionnel.

C'est à cela que servent les scripts d'installation/désinstallation qui se présentent sous la forme de simples scripts shell (au standard sh). Ils sont au nombre de quatre

4.4 Précisions sur les packages

Beaucoup de distributions utilisent le système RPM, l'organisation des packages n'est pas cohérente entre les différentes distributions (par exemple entre RedHat et SuSe), il faut donc être prudent si l'on veut installer un package n'ayant pas été prévu spécifiquement pour sa distribution, il convient alors de vérifier si les dépendances correspondent, si les lieux d'installation sont adéquats et si les scripts sont adaptés au système.
Si les dépendances ne sont pas nommées de la même façon mais sont présentes on peut forcer l'installation sans vérification des dépendances (en les ayant d'abord toutes vérifiées).
Si l'emplacement des fichiers est inadéquat, certains packages (suivant la façon dont ils ont été construits) permettent la relocalisation de ses fichiers.
Si les scripts ne sont pas adaptés on peut effectuer l'installation sans exécuter les scripts puis faire toutes les démarches à la main.

Il existe des outils permettant de convertir des packages d'un format vers un autre (par exemple alien qui fait le lien entre les types rpm et deb), ces outils doivent être pris comme des pis-aller car, les différents types ne gérant pas les choses de la même façon (voir carrément pas les mêmes choses), le package converti ne sera jamais aussi bon qu'un package natif.

4.5 Exemple de création d'un package RPM

Nous allons suivre les étapes de la réalisation d'un package RPM simple (une application), l'exemple retenu est le programme ksetiwatch (http://ksetiwatch.sourceforge.net/), il va de soi qu'avant d'entreprendre la réalisation du package il faut vérifier que toutes les bibliothèques et programmes nécessaires au programme sont bien présents sur le système et que le programme se compile correctement, cela permet également de repérer des options de compilation utiles.

Maintenant que nous savons que notre programme compile, nous pouvons envisager de la packager.

4.5.1 configuration de rpm

Vérifions tout d'abord la configuration de rpm à l'aide de la commande

rpm -showrc
Cette commande affichera toute la configuration de rpm (la configuration globale et la configuration éventuellement définie dans les fichiers ~ /.rpmmacros et ~ /.rpmrc) l'élément le plus important est l'endroit ou doivent se trouver les fichiers sur lesquels nous allons travailler, cela est défini par la macro %_topdir, pour y voir plus clair utilisons la commande

rpm -showrc | grep _topdir
Si cette configuration ne convient pas on peut la modifier en plaçant dans ~ /.rpmmacros la ligne

%_topdir /home/moi/mespackages
Ce nouveau répertoire devra contenir l'arborescence archive, tmp, RPM/BUILD, RPM/RPMS/i[3456]86, RPM/RPMS/k6, RPM/RPMS/noarch, RPM/SOURCES, RPM/SPECS, RPM/SRPMS.

À partir d'ici les répertoires relatifs sont des sous-répertoires de %_topdir.

4.5.2 création du specfile

Plaçons l'archive dans RPM/SOURCES et créons un fichier ksetiwatch.spec dans RPM/SPECS, ce fichier spec va contenir toutes les informations de création du package.

  1. Quelques définitions

    On commence par définir quelques macros qui simplifierons l'écriture de la suite du specfile et la mise à jour du package vers une version plus récente

    %define ver 2.2.5 
    %define rel 1mdk 
    %define nam ksetiwatch 
    %define prefix /usr
  2. Les informations du package

    Summary: Monitoring tool for the setiathome client 
    Name: %{nam} 
    Version: %ver 
    Release: %rel 
    Copyright: GPL 
    Group: Applications/Scientific 
    Source: %{nam}-%ver.tar.gz 
    URL: http://ksetiwatch.sourceforge.net/ 
    Packager: Renaud Michel <renaud.michel@student.ulg.ac.be>

    Buildroot: /tmp/ksetiwatch-%ver

    %description 
    This is Ksetiwatch 2.2.5, a monitoring tool and work unit manager for the SETI@home project. It is designed for KDE 2.x and Qt 2.2.x or higher. Ksetiwatch provides the look-and-feel of the popular SETIWatch program for Windows95/98/NT, written by Mark Loukko (http://members.home.net/mloukko/SETI.html).

    On voit ici que les macros définies précédemment s'utilisent en les préfixant du signe % et en les entourant de {} s'il y a risque de confusion.

    L'entrée Source spécifie le nom de l' (des) archive(s) ou se trouvent les sources du programme, celle(s)-ci sera décompressée dans RPM/BUILD.

    L'entrée Buildroot indique ou le programme devra être temporairement installé avant de réunir ses fichiers dans le package, on utilise ici un sous-répertoire du répertoire temporaire du système, /tmp.

    Les autres entrées sont auto-explicites.

  3. Préparation, configuration et compilation du programme

    %prep

    %setup -n ksetiwatch-%{ver}

    %build 
    ./configure -prefix=$RPM_BUILD_ROOT%{prefix} 
    make all

    %prep est une étape chargée de préparer les sources à la compilation (généralement décompresser les archives et appliquer les patchs éventuels), on utilise ici la macro %setup prédéfinie dans rpm.

    %build est l'étape à laquelle le programme va être compilé, on effectue d'abord le classique ./configure en utilisant le répertoire temporaire précédemment défini ainsi qu'un préfixe (ici /usr), puis le make all qui lance la compilation.

  4. Installation du programme

    %install 
    rm -rf $RPM_BUILD_ROOT 
    make install 
    mkdir -p $RPM_BUILD_ROOT%{prefix}/lib/menu 
    cat > $RPM_BUILD_ROOT%{prefix}/lib/menu/%{nam}.menu <<EOF 
    ?package(%{nam}): \ 
    command="%{prefix}/bin/%{nam}" \ 
    title="%{nam}" \ 
    longtitle="%{nam}" \ 
    needs="x11" \ 
    section="Applications/Sciences" \ 
    icon="%{nam}.xpm" 
    EOF
    L'étape %install se charge de... l'installation, une petite subtilité, la création du fichier menu spécifique à la mandrake (que j'utilise), ceci explique également les scripts qui suivent

  5. Les scripts

    %post 
    if [ -x /usr/bin/update-menus ]; then /usr/bin/update-menus || true ; fi

    %postun 
    if [ -x /usr/bin/update-menus ]; then /usr/bin/update-menus || true ; fi

    Les scripts du package, ici les scripts de post-installation et de post-désinstallation. Ces deux scripts ont pour but de mettre à jour les menus du système.

  6. Nettoyage

    %clean 
    rm -rf $RPM_BUILD_ROOT
    Une fois le package terminé il convient de supprimer le répertoire ou s'est effectué la compilation, les fichiers intermédiaires de compilation peuvent prendre beaucoup de place.
    Lors de la mise au point d'un fichier spec il peut être préférable de ne pas mettre cette ligne pour pouvoir reprendre le programme déjà compilé au fil des essais, mais il ne faut pas l'oublier si l'on distribue un package source.

  7. Les fichiers

    %files 
    /usr
    Cette section contient la liste de tous les fichiers à inclure dans le package, j'utilise ici un truc un peu dangereux, lui dire de prendre tous les fichiers dans /usr (relativement à Buildroot), c'est dangereux car des fichiers non désirés pourraient avoir été copié là pendant la création du package, je me permet généralement de le faire car je sais être le seul à utiliser ma machine, mais dans le doute il est préférable de regarder quels sont les fichiers effectivement installés par le make install (et ceux créés à l'étape %install) et en fournir la liste complète.

  8. Le changelog

    %changelog 
    * Fri Jan 25 2002 Renaud Michel <renaud.michel@student.ulg.ac.be> 
    2.2.5-1mdk - Version 2.2.5 - Added menu file 
    * Mon Sep 3 2001 Renaud Michel <renaud.michel@student.ulg.ac.be> 
    2.2.4-1mdk - Version 2.2.4
    Comme le nom l'indique, notez le format des dates qui doit être respecté.

4.5.3 Création du package

La compilation s'effectue simplement avec

rpm -bb ksetiwatch.spec
Il est possible de n'effectuer que certaines étapes et de passer des étapes (utile pour la mise au point du specfile), voir à ce sujet la manpage de rpm à la section build.

Un package source se créera simplement avec la commande

rpm -bs ksetiwatch.spec
Le package compilé se trouve dans le sous-répertoire de RPM/RPMS correspondant à l'architecture pour laquelle il a été compilé. Le package source se trouve dans RPM/SRPMS.

Copyright (c) Renaud Michel.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation.


next up previous contents
Next: About this document ... Up: Formation LiLiT Previous: 3 Gestion des utilisateurs,   Contents
2002-03-30