Outils pour utilisateurs

Outils du site


openbsd.org:faq:ports:ports.html

OpenBSD Ports: Working with Ports : (v1.57 ; 04/12/2020)

— [ FAQ Index ] | [ Index Ports ] ~ Traduction française de la page OpenBSD Ports : Travailler avec les ports —

Ports - Travailler avec les ports

Introduction

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 :

  • Où et comment récupérer la source du logiciel
  • De quel autre logiciel il dépend
  • Comment modifier les sources (si nécessaire)
  • Comment le configurer et le compiler
  • Comment le tester (optionnel)
  • Comment l'installer

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'application
  • distinfo - 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échargement
  • infrastructure/ - 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 :

  • ports(7) - décrit les différents stages (les cibles make) d'une installation de port, l'usage des saveurs, des sous-packages et d'autres options.
  • bsd.port.mk(5) - l'information en profondeur à-propos de toutes les cibles make, variables, le framework de simulation (répertoire d'installation), etc.

Récupérer l'arborescence des ports

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 'v' marque la disponibilité et un 'x' signifie qu'il n'est pas disponible par la source spécifique.

Source Format Saveurs
-release -stable snapshots -current
Mirrors .tar.gz v x v x
AnonCVS cvs checkout v v x v

Recherchez un fichier nommé ports.tar.gz sur les miroirs.

$ cd /tmp
$ ftp https://cdn.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.

Configuration du système de ports

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). Les détails sur comment configurer la séparation des privilèges sont dans la page du manuel bsd.port.mk(5).

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 :

  • Le répertoire de travail des ports. Contrôlé par la variable WRKOBJDIR, qui spécifie le répertoire qui contiendra les répertoires de travail.
  • Le répertoire contenant les fichiers distribution. Contrôlé par la variable DISTDIR.
  • Le répertoire contenant les packages binaires nouvellement construits. Contrôlé par la variable 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).

Recherche dans l'arborescence des ports

Une fois que vous avez l'arborescence des ports et le paquet portslist 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
$ doas pkg_add portslist
$ make search key=rsnapshot
Port:   rsnapshot-1.4.2
Path:   net/rsnapshot
Info:   remote filesystem snapshot utility
Maint:  Antoine Jacoutot <ajacoutot@openbsd.org>
Index:  net sysutils
L-deps:
B-deps: devel/autoconf/2.69 devel/automake/1.15 devel/metaauto 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> SELECT FULLPKGNAME,COMMENT FROM Ports WHERE COMMENT LIKE '%statistics%';
pg_statsinfo-3.3.0p0|monitor PostgreSQL activity & statistics
kactivities-stats-5.51.0|statistics for the KDE Activity concept
p5-Devel-Cover-Report-Clover-0.35|backend for Clover reporting of coverage statistics
mailgraph-1.14p1|RRDtool frontend for Postfix statistics
R-3.5.1p1|powerful math/statistics/graphics language
p5-Math-VecStat-0.08p0|provides basic statistics on numerical vectors
py-probstat-0.912p8|probability and statistics utilities for Python
py-statistics-1.0.3.5|port of Python 3.4 statistics module to Python 2
darkstat-3.0.719p1|network statistics gatherer with graphs
pfstat-2.5p2|packet filter statistics visualization
rtg-0.7.4p12|SNMP statistics monitoring system
slurm-0.4.3|network traffic monitor and statistics
tcpstat-1.5p0|report network interface statistics
libstatgrab-0.91p3|system statistics gathering library
p5-Unix-Statgrab-0.109p0|interface to libstatgrab system statistics library
diffstat-1.62|accumulates and displays statistics from a diff file
fragistics-1.7.0p2|Quake 3 statistics program
drupal7-google_analytics-1.2p2|add the Google Analytics web statistics to your site
dstat-0.5p0|dwm status bar statistics
kdf-4.14.3p4|KDE storage device statistics
libsysstat-0.4.1|library used to query system info and statistics
qdirstat-1.4p1|Qt-based directory statistics
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.

Installation simple et rapide : un exemple simple

Pour plus de clarté, considérons un exemple simple : rsnapshot. Cette application a de nombreuses dépendances de construction : devel/autoconf/2.69 devel/automake/1.15 devel/metaauto net/rsync. Les commandes suivantes supposent que vous avez configuré PORTS_PRIVSEP, telle que détaillée dans le manuel de bsd.port.mk.

$ cd /usr/ports/net/rsnapshot
$ make install
===>  Checking files for rsnapshot-1.4.2
>> Fetch https://github.com/rsnapshot/rsnapshot/archive/1.4.2/rsnapshot-1.4.2.tar.gz
100% |**************************************************|   365 KB    00:02
>> (SHA256) rsnapshot-1.4.2.tar.gz: OK
===> rsnapshot-1.4.2 depends on: metaauto-* - not found
===>  Verifying install for metaauto-* in devel/metaauto
===>  Checking files for metaauto-1.0p1
[...]
===>  Installing metaauto-1.0p1 from /build/source/ports/packages/amd64/all/
metaauto-1.0p1: ok
===> Returning to build of rsnapshot-1.4.2
===> rsnapshot-1.4.2 depends on: metaauto-* -> metaauto-1.0p1
===> rsnapshot-1.4.2 depends on: autoconf-2.69 - not found
[...]
===> Returning to build of rsnapshot-1.4.2
===>  Extracting for rsnapshot-1.4.2
===>  Patching for rsnapshot-1.4.2
[...]
===>  Compiler link: clang -> /usr/bin/clang
===>  Compiler link: clang++ -> /usr/bin/clang++
===>  Compiler link: cc -> /usr/bin/cc
===>  Compiler link: c++ -> /usr/bin/c++
===>  Generating configure for rsnapshot-1.4.2
===>  Configuring for rsnapshot-1.4.2
[...]
===>  Building for rsnapshot-1.4.2
[...]
===>  Faking installation for rsnapshot-1.4.2
[...]
===>  Building package for rsnapshot-1.4.2
[...]
Link to /build/source/ports/packages/amd64/all/rsnapshot-1.4.2.tgz
Link to /build/source/ports/packages/amd64/ftp/rsnapshot-1.4.2.tgz
Link to /build/source/ports/packages/amd64/cdrom/rsnapshot-1.4.2.tgz
===> rsnapshot-1.4.2 depends on: p5-Lchown-* - not found
[...]
===>  Installing rsnapshot-1.4.2 from /build/source/ports/packages/amd64/all/
rsnapshot-1.4.2: 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 :

  • Vos limites de ressources sont trop restrictives. Ajustez les avec les commandes ulimit de ksh ou limit de csh.
  • Vous n'avez simplement pas assez de RAM.

Nettoyage après une construction

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.4.2

Par défaut, le répertoire de travail des dépendances est automatiquement nettoyé. Vous pouvez supprimer les paquets installés qui n'étaient nécessaires que pour la construction ainsi :

# pkg_delete -a
p5-Module-Build-0.4224: ok
autoconf-2.69p2:automake-1.15.1: ok
autoconf-2.69p2: ok
metaauto-1.0p1: ok
Read shared items: ok

Si vous souhaitez supprimer le(s) ensemble(s) de distribution source du port, vous devriez utiliser :

$ make clean=dist
===>  Cleaning for rsnapshot-1.4.2
===>  Dist cleaning for rsnapshot-1.4.2

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 

Désinstaller un paquet du port

Il est très facile de désinstaller un port :

$ make uninstall
===> Deinstalling for rsnapshot-1.4.2
rsnapshot-1.4.2: ok
Read shared items: ok

Cela appellera pkg_delete(1) pour que le paquet correspondant soit supprimé de votre système. 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.4.2
rm -f /usr/ports/packages/amd64/all/rsnapshot-1.4.2.tgz

Utiliser les saveurs et les sous-paquets

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 paquet 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 paquet 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-paquet. Un porteur peut décider de créer des sous-paquets 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 paquets. make install installera le sous-paquet principal.

Pour lister les différents paquets 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-paquet(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 paquets. Il ne modifie aucunes options de configuration avant de construire le port. Vous devez utiliser les saveurs pour ce propos.

Utiliser dpb pour construire de multiples ports

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.

Mises à jour de sécurité (-stable)

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.

Signature des paquets

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.

Rapporter des problèmes

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 :

  • Votre version d'OpenBSD, incluant tous les correctifs que vous avez appliqués. La version du noyau est donnée par : sysctl -n kern.version
  • La version de votre arborescence des ports : si le fichier /usr/ports/CVS/Tag existe, fournissez son contenu. Si le fichier est absent, vous utilisez l'arborescence des ports -current.
  • Une complète description du problème. N'ayez pas peur de fournir des détails. Mentionnez toutes les étapes que vous avez suivies avant que le problème n'arrive. Le problème est-il reproductible ? Plus vous fournissez d'informations, plus vous aurez de chances de recevoir de l'aide.
  • Si l'application crashe, essayez de fournir une backtrace.

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 :

  • Utiliser script(1) pour créer une complète transcription de construction.
  • Attacher la sortie de pkg_info(1) si cela semble même plus significatif.
  • Les erreurs du compilateur interne gcc(1) vous demandent de rapporter le bogue à la liste de diffusion gcc. Cela permet de gagner du temps si vous suivez leur direction, et de fournir au moins les différents fichiers produits par gcc -save-temps.

Paquets de Débogage, débogueurs et backtraces

Si un programme se bloque, l'obtention d'un backtrace permet souvent de localiser le problème. Normallement, c'est fait avec GDB ; une vieille version est incluse dans la base de l'OS, mais elle ne fonctionne pas toujours correctement avec les compilateurs actuels. Pour déboguer un paquet, installez la version la plus récente depuis les ports qui fournissent le binaire egdb :

# pkg_add gdb

Pour certains ports sur certaines architectures, les paquets de debogage sont disponibles (par exemple, si le port principal est neomutt-20201127, le paquet de débogage sera debug-neomutt-20201127). Ceux-ci contiennent les symboles de débogages qui ont été séparés dans un fichier différent ; GDB montre comme ils sont chargés automatiquement. Le paquet de débogage doit correspondre au paquet pricipal. Si vous utilisez des instantanés, vous devez les réinstaller afin de vous assurez qu'ils correspondent au paquet principal. Installez les paquets de débogages avec pkg_add, comme d'habitude :

# pkg_add debug-neomutt

Si un paquet de débogage n'est pas disponible, vous serez probablement capable de voir les noms de fonctions (mais pas les lignes exactes) à partir d'un coredump ; parfois, cela suffit de mettre le doigt sur le problème. Si un paquet de débogage est disponible, vous devez l'installer autrement la backtrace sera inutile - même les noms de fonctions ne seront pas disponibles.

Un port peut être construit avec les symboles de débogage sur une base ad-hoc (utile pour une archicteture où les paquets de débogage ne sont pas normallement construits) par la création du port avec make DEBUG=-g. En premier, vous aurez besoin de nettoyer la construction existante et les paquets (ce qui peut parfois créer des problèmes de construction à moins de les désinstaller avant). Si le paquet en question est une bibliothèque ou dépend d'un autre port, vous devrez peut-être désinstaller l'ensemble afin d'y parvenir. Il peut aussi être utile de désactiver l'optimisation (ajouter -O0 à DEBUG).

$ cd /usr/ports/math/moo
$ make clean; make DEBUG="-g" repackage; make reinstall

Si vous avez un fichier de vidage du noyau, pointez dessus GDB et obtainez une backtrace :

$ egdb neomutt neomutt.core
GNU gdb (GDB) 7.12.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-openbsd6.8".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/local/bin/neomutt...Reading symbols from /usr/local/bin/.debug/neomutt.dbg...done.
done.
[New process 577437]
Core was generated by `neomutt'.
Program terminated with signal SIGABRT, Aborted.
#0  _thread_sys_poll () at /tmp/-:3
3       /tmp/-: No such file or directory.
(gdb) bt
#0  _thread_sys_poll () at /tmp/-:3
<...>
#9  0x00000b3f1d5ec847 in main (argc=<optimized out>, argv=0x7f7ffffc8a08, envp=<optimized out>) at ../neomutt-20201127/main.c:1236
(gdb) q

Pour les programmes ayant les permissions setuid/setgid, les vidages de noyau sont désactivés par défaut, lisez sysctl(8) pour connaître la manière de leur permettre. Alternativement vous pouvez charger le programme avec un débogueur, paramètrer les arguments au besoin, puis run :

 $ egdb neomutt
<...>
(gdb) set args -d 2
(gdb) run
<...>

Vous serez renvoyé au débogueur lorsque certains signaux seront reçus (dans la plupart des cas, au moment où il planterait).

Pour activez les paquets de débogage dans la construction normal du paquet pour un port typique, ajoutez “DEBUG_PACKAGES=${BUILD_PACKAGES}” au fichier Makefile. Cela paramètrera DEBUG durant la construction, et durant la phase de package les symboles de débogages seront séparés automatiquement du binaire principal. Cela essaiera aussi de compresser les symboles avec dwz ; cette étape échoue parfois ; si cela est; elle peut être surchargée avec “DWZ=:”. Si vous faites régulièrement des travaux de développement de ports, paramètrer “INSTALL_DEBUG_PACKAGES=Yes” dans le fichier /etc/mk.conf installera automatiquement les paquets de débogage nouvellement construits.

Aidez-nous

Il y a beaucoup de manières dont vous pouvez aider. Elles sont listées ci-dessous, par ordre croissant de difficultés :

  • Signalez les problèmes au fur et à mesure que vous les rencontrez.
  • Vous pouvez systématiquement tester les ports et rapporter les problèmes, ou suggérer des améliorations. Prenez simplement le temps de regarde le Guide de Test des Ports. Vous devez exécuter un système -current pour créer et tester des ports.
  • Testez les mises à jour des ports qui sont postées sur la liste de diffusion des ports.
  • Envoyez les mises à jour ou les correctifs au responsable du port, ou sur la liste de diffusion des ports s'il n'y a pas de responsable. Généralement, cela est hautement apprécié, à moins que vos correctifs ne causent aux développeurs une perte de temps plus qu'ils n'en gagnent.

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 :

pengouinpdt
openbsd.org/faq/ports/ports.html.txt · Dernière modification: 2021/05/02 13:41 de pengouinpdt