Les caractères génériques dans le
système de paquetages de NetBSD
Hubert Feyrer <hubertf@NetBSD.org>, janvier 2000

Préambule : ce document commence par rappeler la manière dont fonctionnaient les dépendances dans le Système de Paquetages de NetBSD. Il décrit ensuite une façon d'utiliser les caractères génériques pour installer des paquetages binaires contenant des dépendances génériques afin de mieux gérer les conflits. Enfin, il survolera les changements depuis que les outils pkg_* ont été introduits.

1) Il était une fois

Laissez-moi vous remettre en mémoire comment fonctionnait la gestion des dépendances dans les systèmes de paquetages/ports de *BSD. Vivant au côté de RUN/BUILD_DEPENDS, le shéma de dépendances fonctionnait en inscrivant des lignes dans les fichiers Makefile. Par exemple :

	DEPENDS+=	foo-1.2:../../uncat/foo
spécifie deux choses :

  1. La version de «foo» dont dépend ce paquetage. S'il doit être installé, foo-1.2 doit être présent.
  2. S'il n'est pas présent dans la version requise, il doit être compilé par le système de paquetages.
Pour l'installation, «pkg_info -e» est utilisé pour savoir si la version requise de «foo» est présente. Si c'est le cas, le processus d'installation se poursuit, que ce soit la compilation avec pkgsrc ou l'intégration d'un binaire avec pkg_add.

Si la version voulue n'est pas présente, le système se rabattra sur le répertoire indiqué pour l'installer. Les dépendances sont ainsi satisfaites. Dans le cas d'installation de paquetage binaire, pkg_add considère qu'il existe foo-1.2.tgz dans les chemins d'accès et l'installe.

2) Dépendances et caractères génériques

Indiquer en dur la version voulue de «foo» pose des problèmes de maintenance. De plus, la plupart du temps, ce n'est pas une version précise qui est nécessaire mais plusieurs voire toutes. Les dépendances se présentent alors sous la forme :

	DEPENDS+=	foo-*:../../somecat/foo
C'est à dire que «toute» version de «foo» fait l'affaire. Le système de compilation cherche si «foo» est présent en appelant «pkg_info -e 'foo-*'». S'il ne l'est pas, le système prend la version se trouvant dans pkgsrc et l'installe en utilisant le chemin d'accès précisé.

Pour les paquetages binaires, la gestion est plus complexe. En effet, un paquetage binaire sait parfaitement qu'il dépend de «toute» version installée de «foo» et effectue la même vérification que le système de compilation. Si une version voulue est présente c'est bien. Sinon, l'installation (automatique) d'une version de «foo» devient légèrement problématique. En effet, le répertoire indiqué est inutilisable dans le contexte binaire, la compilation depuis les sources n'étant pas l'option demandée.

pkg_add se met donc à parcourir tous les paquetages (binaires !) disponibles pour installer le plus récent (correspondant au critère «foo-*»). Cette exploration est nécessaire avec la notion de caractères génériques. Si le logiciel requis est voulu jusqu'à une certaine version, par exemple foo<1.0, alors le plus récent paquetage avant la version 1.0 sera trouvé et installé, satisfaisant les dépendances.

Les paquetages binaires peuvent être installés non seulement depuis le disque local mais aussi par FTP, parcouru lui aussi. Ce dernier parcours de répertoire distant était la dernière pièce manquante au Système de Paquetages de NetBSD pour entièrement gérer les caractères génériques.

3) Notes sur l'implémentation

Prenons l'exemple d'une installation de paquetages par FTP. Nous voulons installer «a-1.0» qui dépend de «b-1.*» qui nécessite «c-*»... (quelque chose du genre de «kde»). Les actions sont approximativement les suivantes :

Les opérations «récupère le reste de» pourraient utiliser la même connexion (FTP ou autre) mais tout nouveau paquetage est ajouté par un processus pkg_add différent. Il y a donc de nombreuses connexions potentielles au même serveur ftp avec, comme inconvénients :

Pour éviter cela, toutes les requètes pkg_add utilisent la même session FTP. Le processus faisant tourner ftp(1) ouvre deux pipes, l'une pour stdin et l'autre pour stdout. Elles sont passées aux commandes pkg_add suivantes qui en connaissent le descripteur par des variables d'environnement. Ainsi, une connexion permet de récupérer et d'installer plusieurs paquetages binaires.

4) Plus que pour les dépendances

Les caractères génériques du Système de Paquetages de NetBSD sont un super ensemble de ceux des interpréteurs de commandes. Il reconnait actuellement :

Par exemple, «pkg_info -e 'foo>=1.3'» correspond à la version 1.3 ou plus récente du paquetage «foo». Les caractères génériques ne sont pas uniquement utilisés pour connaitre les paquetages installés ou pour savoir quel paquetage dépendant récupérer. Il sont aussi permis (et utilisés) pour résoudre les conflits et éviter que deux paquetages soient présent alors qu'il ne devraient pas (conflits sur les noms de fichiers ou les fonctions).

pkg_info et pkg_delete utilisent aussi les caractères génériques. Le nom seul du paquetage, sans la version, peut leur être donné pour qu'ils retrouvent ce qu'il faut. De cette manière, non seulement nous économisons des frappes clavier mais, plus important, nous n'avons pas besoin de connaitre la version installée.

5) Autres modifications du Système de Paquetages de NetBSD

Depuis l'intégrations de pkg_*, issu de FreeBSD à la mi 1997, NetBSD a apporté de nombreuses améliorations. Voici les plus intéressantes :

Les personnes suivantes ont permis au Système de Paquetage de NetBSD d'être ce qu'il est aujourd'hui :


Pour plus d'informations :


(c) Copyright 20000110 Hubert Feyrer <hubertf@NetBSD.org>
$NetBSD: pkg-wildcards.html,v 1.2 2003/07/17 07:50:09 keihan Exp $