Version de traduction basée sur la 6.2 officielle
L'arborescence des ports est destinée aux utilisateurs avancés. Chacun est encouragé à utiliser les packages de binaire précompilé. Si vous avez des questions à-propos de l'arborescence des ports, il est supposé que vous ayez lu les pages de manuel et cette FAQ, et que vous soyez capable de travailler avec.
L'arborescence des ports est un ensemble de Makefiles, un pour chacune des applications tierces, qui contrôle :
Outre le Makefile, chaque port contient également au moins les éléments suivants :
PLIST
- instructions pour la création du package une fois que l'application a été compilée. DESCR
- description de l'applicationdistinfo
- les sommes de contrôle et la taille du fichier de distribution
Toutes ces informations sont conservées dans un répertoire hiérarchique sous /usr/ports
. Cette hiérarchie contient trois sous-répertoires spéciaux :
distfiles/
- où les ensembles de distribution logicielle sont stockés après le téléchargementinfrastructure/
- tous les scripts et makefiles nécessaires pour l'infrastructure des ports.packages/
- les packages binaires compilés pour le système des ports
Les autres sous-répertoires forment tous des catégories d'applications différentes, qui contiennent les sous-répertoires des ports actuels. Les ports complexes peuvent être organisés à un niveau encore plus profond, par exemple s'ils ont une partie centrale et un ensemble d'extensions, ou une version stable et instantanée (snapshot) de l'application. Chaque répertoire de port doit contenir un sous-répertoire pkg/ avec une/des liste(s) d'empaquetage et le(s) fichier(s) de description. Il peut aussi y avoir les sous-répertoires patches/
et files/
, pour les correctifs des sources et des fichiers additionnels, respectivement.
Quand un utilisateur a des problèmes avec make(1) dans le sous-répertoire d'un port spécifique, le système va parcourir son arborescence dépendante, vérifier quelles dépendances requises sont installées, compiler et installer les dépendances manquantes, et ensuite continuer la compilation du port désiré. Toutes les compilations s'effectuent à l'intérieur du répertoire de travail que le port crée. Normalement, cela est sous ${WRKOBJDIR}
, par défaut vers /usr/ports/pobj
, mais vous pouvez surcharger cela (lisez configuration du système de ports).
L'arborescence des ports est liée aux saveurs d'OpenBSD. Ne pas vous attendre à ce que l'arborescence du port -current fonctionne sur un système -release ou -stable. Si vous suivez -current, vous avez besoin à la fois du système de base -current et de l'arborescence du port -current. Du fait qu'aucun changement intrusif n'est fait dans -stable, il est possible d'utiliser l'arborescence du port -stable sur un système -release, et vice-versa.
Un autre défaut courant est d'oublier l'installation de X11. Même si le port que vous essayez de compiler n'a pas de dépendance directe à X11, un de ces sous-packages ou une de ses dépendances peut requérir les entêtes et bibliothèques de X11. Compiler les ports sur les systèmes sans X11 n'est pas supporté.
Plus d'informations à-propos du système des ports peuvent être trouvées dans ces pages de manuels :
Une fois que vous avez décidé quelle saveur de l'arborescence des ports vous désirez, vous pouvez l'obtenir depuis différentes sources. Le tableau ci-dessous donne un aperçu d'où vous pouvez trouver les différentes saveurs, et dans quel format. Un 'o' marque la disponibilité et un '-' signifie qu'il n'est pas disponible par la source spécifique.
Source | Format | Saveurs | |||
-release | -stable | snapshots | -current | ||
Mirrors | .tar.gz | o | - | o | - |
AnonCVS | cvs checkout | o | o | - | o |
Recherchez un fichier nommé ports.tar.gz
sur les miroirs.
$ cd /tmp $ ftp https://ftp.openbsd.org/pub/OpenBSD/$(uname -r)/{ports.tar.gz,SHA256.sig} $ signify -Cp /etc/signify/openbsd-$(uname -r | cut -c 1,3)-base.pub -x SHA256.sig ports.tar.gz
Vous voulez décompresser le fichier dans le répertoire /usr
, qui créera /usr/ports
et tous les répertoires à l'intérieur :
# cd /usr # tar xzf /tmp/ports.tar.gz
Les snapshots disponibles sur les miroirs sont générés quotidiennement depuis l'arborescence du port -current. Vous trouverez les instantanés dans le répertoire /pub/OpenBSD/snapshots/
. Si vous utilisez un instantané depuis l'arborescence des ports, vous devriez avoir installé le snapshot d'OpenBSD correspondant. Assurez-vous de garder votre arborescence des ports et votre système OpenBSD synchronisés !
Pour plus d'informations à-propos de l'arborescence des ports via CVS, lisez la page AnonCVS, qui contient une liste des serveurs disponibles et plusieurs exemples.
Cette section introduit quelques paramètres globaux additionnels pour la compilation des ports. Vous pouvez le sauter, mais vous devrez ensuite exécuter plusieurs états make(1) dans les exemples suivants en tant que root.
Puisque le projet OpenBSD n'a pas les ressources pour revoir correctement le code source de tous les logiciels dans l'arborescence des ports, vous pouvez configurer le système de ports en prenant quelques précautions de sécurité. L'infrastructure des ports est capable d'assumer toutes les compilations en tant qu'utilisateur régulier, et d'assumer seulement certaines étapes qui requièrent les privilèges super-utilisateur tel que root (par exemple, la cible make install
). Toutefois, parce que les privilèges administrateur sont toujours requis sur certains points, le système de ports ne vous sauvera pas lorsque vous déciderez de construire une application malveillante.
setenv
et keepenv
dans doas.conf(5). SUDO
définie dans bsd.port.mk(5), ce qui peut être rendu permanent en ajoutant SUDO=/usr/bin/doas
à mk.conf(5). wsrc
et les répertoires sous-jacents ont les permissions en écriture pour le groupe.# user mod -G wsrc exampleuser # chgrp -R wsrc /usr/ports # find /usr/ports -type d -print0 | xargs -0r chmod g+w
Il est possible d'utiliser l'arborescence des ports en lecture seule en séparant les répertoires qui sont écrits durant la construction du port :
WRKOBJDIR
, qui spécifie le répertoire qui contiendra les répertoires de travail. DISTDIR
. PACKAGE_REPOSITORY
.
Par exemple, vous pouvez ajouter les lignes suivantes à /etc/mk.conf
:
WRKOBJDIR=/usr/obj/ports DISTDIR=/usr/distfiles PACKAGE_REPOSITORY=/usr/packages
Si désiré, vous pouvez également changer le propriétaire de ces répertoires par votre nom d'utilisateur et groupe local, afin que le système de ports puisse créer les répertoires de travail sous-jacents en tant qu'utilisateur régulier. Encore une fois, les ports peuvent être construits en tant qu'utilisateur, mais doivent être installés par root ou avec doas(1).
Une fois que vous avez l'arborescence des ports en place dans votre système, il devient très facile de chercher un logiciel. Utilisez juste make search key=“searchkey”
tel que vu dans cet exemple :
$ cd /usr/ports $ make search key=rsnapshot Port: rsnapshot-1.3.1p0 Path: net/rsnapshot Info: remote filesystem snapshot utility Maint: Antoine Jacoutot <ajacoutot@openbsd.org> Index: net sysutils L-deps: B-deps: :net/rsync R-deps: :devel/p5-Lchown :net/rsync Archs: any
Le résultat de la recherche donne un bon aperçu de chaque application trouvée : le nom du port, le chemin du port, une description sur une ligne, le responsable du port, les mots-clés relatifs au port, les dépendances library/build/runtime, et les architectures sur lesquelles le port est connu pour fonctionner.
Ce mécanisme, cependant, est un mécanisme très basique, qui ne fait qu'exécuter awk(1) sur le fichier d'index des ports. Un port appelé “sqlports” permet une recherche très fine en utilisant SQL. C'est une base de données SQL, mais à peu près n'importe quel format de base de données peut être créé en utilisant l'infrastructure des ports. Le port sqlports
inclut le script utilisé pour générer la base de données, qui pourrait servir de base pour générer des bases de données dans différents formats.
Il suffit d'installer le paquet sqlports
pour démarrer. Une séance d'essai pourrait ressembler à celle-ci :
$ sqlite3 /usr/local/share/sqlports SQLite version 3.3.12 Enter ".help" for instructions sqlite> SELECT FULLPKGNAME,COMMENT FROM Ports WHERE COMMENT LIKE '%statistics%'; Guppi-0.40.3p1|GNOME-based plot program with statistics capabilities mailgraph-1.12|a RRDtool frontend for Postfix statistics R-2.4.1|clone of S, a powerful math/statistics/graphics language py-probstat-0.912p0|probability and statistics utilities for Python darkstat-3.0.540p1|network statistics gatherer with graphs pfstat-2.2p0|packet filter statistics visualization tcpstat-1.4|report network interface statistics wmwave-0.4p2|Window Maker dockapp to display wavelan statistics diffstat-1.43p0|accumulates and displays statistics from a diff file sqlite>
Ce qui précède est encore une recherche très basique. Avec SQL, il est possible de rechercher toute chose, y compris les dépendances, les drapeaux de configuration, les bibliothèques partagées, etc.
Pour plus de clarté, considérons un exemple simple : rsnapshot. Cette application a une seule dépendance : rsync. Les commandes suivantes supposent que vous avez configuré la variable SUDO
dans /etc/mk.conf
, telle que mentionnée ci-dessus.
$ cd /usr/ports/net/rsnapshot $ make install ===> Checking files for rsnapshot-1.2.9 >> rsnapshot-1.2.9.tar.gz doesn't seem to exist on this system. >> Fetch http://www.rsnapshot.org/downloads/rsnapshot-1.2.9.tar.gz. 100% |**************************************************| 173 KB 00:02 >> Size matches for /usr/ports/distfiles/rsnapshot-1.2.9.tar.gz >> Checksum OK for rsnapshot-1.2.9.tar.gz. (sha1) ===> rsnapshot-1.2.9 depends on: rsync-2.6.9 - not found ===> Verifying install for rsync-2.6.9 in net/rsync ===> Checking files for rsync-2.6.9 >> rsync-2.6.9.tar.gz doesn't seem to exist on this system. >> Fetch ftp://ftp.samba.org/pub/rsync/old-versions/rsync-2.6.9.tar.gz. 100% |**************************************************| 792 KB 00:31 >> Size matches for /usr/ports/distfiles/rsync-2.6.9.tar.gz >> Checksum OK for rsync-2.6.9.tar.gz. (sha1) ===> Verifying specs: c ===> found c.40.3 ===> Extracting for rsync-2.6.9 ===> Patching for rsync-2.6.9 ===> Configuring for rsync-2.6.9 [...] ===> Building for rsync-2.6.9 [...] ===> Faking installation for rsync-2.6.9 [...] ===> Building package for rsync-2.6.9 Link to /usr/ports/packages/i386/ftp/rsync-2.6.9.tgz Link to /usr/ports/packages/i386/cdrom/rsync-2.6.9.tgz ===> Installing rsync-2.6.9 from /usr/ports/packages/i386/all/rsync-2.6.9.tgz rsync-2.6.9: ok ===> Returning to build of rsnapshot-1.2.9 ===> rsnapshot-1.2.9 depends on: rsync-2.6.9 - found ===> Extracting for rsnapshot-1.2.9 ===> Patching for rsnapshot-1.2.9 ===> Configuring for rsnapshot-1.2.9 [...] ===> Building for rsnapshot-1.2.9 [...] ===> Faking installation for rsnapshot-1.2.9 [...] ===> Building package for rsnapshot-1.2.9 Link to /usr/ports/packages/i386/ftp/rsnapshot-1.2.9.tgz Link to /usr/ports/packages/i386/cdrom/rsnapshot-1.2.9.tgz ===> rsnapshot-1.2.9 depends on: rsync-2.6.9 - found ===> Installing rsnapshot-1.2.9 from /usr/ports/packages/i386/all/rsnapshot-1.2.9.tgz rsnapshot-1.2.9: ok
Ainsi que vous pouvez le voir, le système de ports fait beaucoup de choses automatiquement. Il ira récupérer, extraire, et corriger le code source, configurer et construire (compiler) les sources, installer les fichier dans le répertoire de simulation, créer un package (correspondant à la liste d'empaquetage) et installer le package sur votre système (habituellement sous /usr/local/
). Et il le fait récursivement pour toutes les dépendances du port. Remarquez les lignes “====⇒ Verifying install for …
” et “====⇒ Returning to build of …
” dans la sortie ci-dessus, indiquant la marche à travers l'arborescence des dépendances.
Si une ancienne version de l'application que vous désirez installer est déjà installée sur votre système, vous pouvez utiliser make update
au lieu de make install
. Cela appellera pkg_add(1) avec le drapeau -r
.
Les applications volumineuses nécessiteront beaucoup de ressources système pour compiler. Si vous avez des erreurs de type “out of memory” lors de la construction d'un tel port, ceci a généralement l'une des deux causes suivantes :
ulimit
de ksh ou limit
de csh. Vous voulez probablement nettoyer le répertoire de travail par défaut du port après avoir construit et installer le package :
$ make clean ===> Cleaning for rsnapshot-1.2.9
De plus, vous voulez aussi nettoyer les répertoires de travail de toutes les dépendances du port avec la cible make :
$ make clean=depends ===> Cleaning for rsync-2.6.9 ===> Cleaning for rsnapshot-1.2.9
Si vous souhaitez supprimer le(s) ensemble(s) de distribution source du port, vous devriez utiliser :
$ make clean=dist ===> Cleaning for rsnapshot-1.2.9 ===> Dist cleaning for rsnapshot-1.2.9
Dans le cas où vous avez compilé de multiples saveurs d'un même port, vous pouvez effacer les répertoires de travail de toutes ces saveurs en une seule fois en utilisant :
$ make clean=flavors
Vous pouvez également nettoyer les choses au fur et à mesure qu'elles sont construites en définissant une variable spéciale. Les répertoires de travail seront automatiquement effacés après que les packages aient été créés.
$ make package BULK=Yes
Il est très facile de désinstaller un port :
$ make uninstall ===> Deinstalling for rsnapshot-1.2.9 rsnapshot-1.2.9: ok Read shared items: ok
Cela appellera pkg_delete(1) pour que le package correspondant soit supprimé de votre système. Si vous le désirez, vous pouvez aussi désinstaller pour réinstaller un package du port en utilisant :
$ make reinstall ===> Cleaning for rsnapshot-1.2.9 /usr/sbin/pkg_delete rsnapshot-1.2.9 rsnapshot-1.2.9: ok ===> Installing rsnapshot-1.2.9 from /usr/ports/packages/i386/all/rsnapshot-1.2.9.tgz rsnapshot-1.2.9: ok
Si vous voulez vous débarrasser des paquets que vous venez de construire, vous pouvez faire ce qui suit :
$ make clean=packages ===> Cleaning for rsnapshot-1.2.9 rm -f /usr/ports/packages/i386/all/rsnapshot-1.2.9.tgz
Veuillez lire la page de manuel des ports(7), qui donne un bon aperçu de ce sujet. Il y a deux mécanismes à contrôler pour empaqueter les logiciels selon différents besoins.
Le premier mécanisme est appelé saveurs. Une saveur indique habituellement un certain ensemble d'options de compilation. Par exemple, quelques applications ont la saveur “no_x11” qui peuvent être utilisées sur les systèmes sans X. Quelques shell ont la saveur “static” qui compilera une version liée statiquement. Il y a des ports qui ont différentes saveurs pour les construire avec différents outils graphiques. D'autres exemples incluent le support pour différents formats de base de données, différentes options réseaux (SSL, IPv6, …), différentes tailles de papier, etc.
En résumé : Vous utiliserez très probablement des saveurs lorsqu'un package n'a pas été mis à disposition pour la saveur que vous recherchez. Dans ce cas, vous pouvez spécifier la saveur désirée et construire le port vous-même.
La plupart des saveurs de port ont leur propre répertoire de travail durant la compilation, et chacune des saveurs sera empaquetée dans un package au nom correspondant afin d'éviter la confusion. Pour lire les différentes saveurs d'un port, vous changeriez son sous-répertoire et demanderez :
$ make show=FLAVORS
Vous pouvez aussi regarder les fichiers DESCR
du port, qui expliquent les saveurs disponibles plus en détails.
Le second mécanisme est appelé sous-package. Un porteur peut décider de créer des sous-packages pour différentes pièces d'une même application si elles peuvent être logiquement séparées. Vous verrez souvent des sous-paquets pour la partie client et la partie serveur d'un programme. Parfois une documentation abondante est fournie dans un sous-paquet parce qu'elle prend trop d'espace disque. Des fonctionnalités supplémentaires qui attirent de fortes dépendances seront souvent empaquetées séparément. Le porteur peut aussi décider quel sous-paquet est le principal, qui doit être installé par défaut. D'autres exemples sont des suites de tests extensifs livrés avec le logiciel, des modules séparés avec le support de différentes choses, etc.
En résumé : Quelques ports sont découpés en plusieurs packages. make install
installera le sous-paquet principal.
Pour lister les différents packages construits par un port, utilisez :
$ make show=PKGNAMES
make install
installera le sous-paquet principal. Pour les installer tous, utilisez :
$ make install-all
Pour lister les différents sous-paquets disponibles d'un port, utilisez :
$ make show=MULTI_PACKAGES
Il est possible de sélectionner quel(s) sous-package(s) est à installer depuis l'arborescence des ports. Après plusieurs tests, cette procédure appellera simplement pkg_add(1) pour installer les sous-paquets désirés.
# env SUBPACKAGE="-server" make install
Le mécanisme des sous-paquets ne prend en charge que les packages. Il ne modifie aucunes options de configuration avant de construire le port. Vous devez utiliser les saveurs pour ce propos.
Quand vous avez besoin de construire plus d'un port ou deux à la fois, vous devez utiliser l'outil /usr/ports/infrastructure/bin/dpb
. dpb(1) prend la liste des ports à construire et les construit automatiquement dans un ordre optimal, utilisant autant que possible le parallélisme. Il peut aussi utiliser plusieurs machines pour exécuter la construction, et produire des journaux détaillés du processus de construction pour le dépannage, placés par défaut dans /usr/ports/logs
.
# /usr/ports/infrastructure/bin/dpb -P ~/localports
Cette commande lira la liste de pkgpaths dans ~/localports
et construire tous les packages. Il peut aussi installer les packages après leur construction. Le fichier ~/localports peut ressembler à cela :
net/rsync www/mozilla-firefox editors/vim
Si vous ne fournissez pas une liste des ports à construire à la ligne de commande ou via -P
ou -I
, dpb(1) construira tous les ports qui sont dans l'arborescence des ports. Si vous l'exécutez en tant que root, dpb supprimera automatiquement les privilèges des utilisateurs dédiés pour récupérer distfiles et construire les ports. C'est la manière recommandée pour l'utiliser, mais il peut aussi l'être en tant qu'utilisateur régulier. De plus, l'utilitaire proot(1) peut aussi être utilisé pour isoler davantage les opérations de construction.
Quand de sérieux bogues ou des failles de sécurité sont découverts dans un logiciel tiers, ils sont fixés dans la branche -stable de l'arborescence des ports. En contraste du système de base, l'arborescence des ports -stable ne reçoit que les backports de sécurité pour la dernière version.
Cela signifie que tout ce dont vous avez besoin de faire est de vous assurez de vérifier que vous êtes dans la branche correcte de l'arborescence des ports, et de construire le logiciel désiré depuis celle-ci. Vous pouvez garder à jour votre arborescence avec CVS et souscrire à la liste de diffusion ports-changes pour recevoir les annonces de sécurité relatives aux logiciels dans l'arborescence des ports.
Les signatures sont un bon moyen d'assurer que les packages soient légitimes et non corrompus. OpenBSD offre des paquets signés officiellement en utilisant signify(1). Aucun effort supplémentaire n'est nécessaire de la part de l'utilisateur pour s'assurer que les paquets n'ont pas été trafiqués.
Si vous voulez construire vos propres paquets signés, vous aurez en premier besoin de créer des clés pour signer.
# signify -Gns /etc/signify/my-pkg.sec -p /etc/signify/my-pkg.pub
Notez les noms : les clés pour signer les packages doivent terminer en pkg
.
Les packages existants peuvent être signés avec pkg_sign(1) après avoir été construits.
# cd /usr/ports/packages/$(uname -p) # pkg_sign -s signify2 -s /etc/signify/my-pkg.sec -o signed -S all
Afin d'installer le package sur une autre machine, la clé publique my-pkg.pub devrait être déposée dans le répertoire /etc/signify sur la machine.
Si vous avez des problèmes avec un port existant, veuillez envoyer un courriel au responsable du port. Pour connaître le responsable du port, tapez, par exemple :
$ cd /usr/ports/archivers/unzip $ make show=MAINTAINER
Alternativement, s'il n'y a pas de responsable, ou que vous ne pouvez le contacter, envoyez un mail à la liste de diffusion ports@openbsd.org.
Dans tous les cas, veuillez fournir :
sysctl -n kern.version
/usr/ports/CVS/Tag
existe, fournissez son contenu. Si le fichier est absent, vous utilisez l'arborescence des ports -current.
Pour les ports qui ne se construisent pas correctement, une complète transcription de la construction est presque toujours requise. Vous pouvez utiliser le script portslogger
, trouvé dans /usr/ports/infrastructure/bin
, pour cela. Une simple exécution peut ressembler à cela :
$ mkdir ~/portlog $ cd /usr/ports/archivers/unzip $ make 2>&1 | /usr/ports/infrastructure/bin/portslogger ~/portlog
Après cela, vous devriez avoir un fichier journal de construction dans votre répertoire ~/portlog
que vous pouvez envoyer au responsable du port. De même, assurez vous de n'utiliser aucunes options spécifiques à votre construction, par exemple dans /etc/mk.conf
.
Alternativement, vous pouvez :
gcc -save-temps
. Il y a beaucoup de manières dont vous pouvez aider. Elles sont listées ci-dessous, par ordre croissant de difficultés :
Des dons en matériel peuvent aider à tester des ports sur les différentes plates-formes sur lesquelles OpenBSD fonctionne.
Cette page est la traduction officieuse de la page “Ports - Working with Ports” de la FAQ officielle d'OpenBSD.
En cas de doute, merci de vous y référer !
Si vous voulez participer à l'effort de traduction, merci de lire ce topic.
Contribut(rice|eur)s :