Ports, dépanner
Un article de Diablotins.org.
|
Sommaire |
Problème sur les ports
Et oui, parfois il arrive qu'un port ne fonctionne plus ! Les raisons peuvent ĂŞtre multiples ; ce qui suit n'est qu'un guide de premier secours et il faut une bonne dose de feeling. Mais pas de panique on y arrive dans 99% des cas !
En gros il y a deux sortes de problèmes : - les problèmes de compilation et de liens (bibliothèques) - les problèmes à l'exécution
Avant toutes choses
À vérifier chez vous
Vérifiez que votre arbre des ports est à jour, et reconstruisez le fichier d'index des ports.
En fonction de vos options, l'index peut ne plus correspondre à l'index standard (celui que l'on récupère par cd /usr/ports && make fetchindex). Ceci parce que les options peuvent changer les dépendances.
Si vous utilisez portupgrade, soyez sûr d'avoir fait un portsdb -Uu et de ne pas avoir de problème de dépendances : pkgdb -F
Et bien sûr vous avez lu /usr/ports/UPDATING, non ?
À vérifier chez les autres
Faites une recherche sur les listes du projet FreeBSD (ports@) et dans les ' problem report ' du projet. Le problème est peut être déjà connu.
Regardez les journaux des machines de build du projet, ce sont des machines qui compilent en permanence les ports. Les journaux se trouvent sur http://pointyhat.freebsd.org/errorlogs/
Aide toi, le ciel t'aidera !
Si les recherches n'ont rien donné, y'a plus qu'à mettre la main à la pâte. Même si vous ne trouvez pas - ça arrive -, cela vous permettra de demander un coup de main plus précisément.
Problèmes de compilation
LĂ encore on a plusieurs cas.
Problème de dépendance
Le port utilise un autre port mais a oublié de l'indiquer dans le Makefile du port, c'est un bug qu'il faut signaler.
Cela peut se voir à plusieurs niveaux : le ./configure du port plante et dit qu'il manque quelque chose ou la compilation échoue parce qu'il manque un fichier "include".
Si vous arrivez à déterminer le fichier manquant, l'astuce suivante permet souvent de trouver le port qui installe ce fichier :
find /usr/ports -name 'pkg-plist' -exec fgrep -H fichier_a_trouver {} \;
Cette commande examine tous les fichiers pkg-plist de l'arbre des ports à la recherche de 'fichier_a_trouver'. Cette méthode n'est pas fiable à 100% parce que la liste peut être générée dynamiquement, mais ça donne en général de bons résultats.
Par exemple vous avez un port qui ne compile pas parce qu'il ne trouve pas le fichier d'include 'iconv.h'
find /usr/ports/ -name 'pkg-plist' -exec fgrep -H iconv.h {} \;
/usr/ports/converters/iconv/pkg-plist:include/biconv.h
/usr/ports/converters/libiconv/pkg-plist:include/iconv.h
[...]
Ă€ vue de nez, le port converters/libiconv est un bon candidat.
Problème de liens (link)
Le programme compile mais ne trouve pas les bibliothèques nécessaires. Là encore, l'astuce de la recherche dans le pkg-plist rend service.
Autres problèmes de compilation
Aïe ! N'utilisez pas d'optimisations de compilation de la mort qui tuent, restez sur un CFLAGS en -O ou -O2, pas plus. Si le port a plusieurs options, essayez avec les options par défaut.
Au pire essayez de reconstruire le port et toutes ces dépendances, avec un portupgrade -Rf le_port
Si vous avez des notions de programmation, regardez les sources !
Il faut aussi savoir que des problèmes de compilations aléatoires (ça plante mais pas toujours au même endroit) sont souvent symptomatiques de problèmes matériels. Vérifiez alors la mémoire avant tout (ça m'est arrivé...).
Problème à l'exécution
Problème de bibliothèque
Le programme ne trouve pas une bibliothèque, il ne se lance pas. Vous avez une erreur au lancement du programme (si c'est un programme graphique, lancez le dans un terminal genre xterm), l'astuce de la recherche dans la pkg-plist est utile ici aussi et il suffit d'installer le port manquant.
La commande ldd et le port sysutils/libchk sont très utilent pour vérifier les liens et diagnostiquer les problèmes.
Autre cas plus rare, le programme émet une erreur comme quoi il ne trouve pas un symbôle dans une bibliothèque : cela signifie qu'il n'est pas lié à la bonne bibliothèque ou qu'il y a un bug dans la bibliothèque... Utilisez libchk, si la bibliothèque est la bonne il n'y a plus qu'à appeler du secours.
Autres problèmes à l'exécution
Ça peut venir d'à peut prêt tout et n'importe quoi...
Si vous avez mis à jour le système de base vers une nouvelle version, il est recommandé de recompiler les ports. Principalement les commandes de bas niveaux prochent du système, par exemple cdrecord.
Mais le programme peut avoir des bugs qui ne sont pas spécifiques à FreeBSD, là encore si vous avez des notions de programmation, essayez de déboguer le programme.
Parfois un portupgrade -Rf peut remettre les choses d'aplomb...
Ă€ l'aide
N'hésitez pas à demander de l'aide. Il y a de bonnes ressources sur FreeBSD. Et même un « chez moi ça marche © » peut faire avancer le bidule !
Mailing liste sur les ports : http://lists.freebsd.org/mailman/listinfo/freebsd-ports
Usenet : fr.comp.os.bsd
Soyez précis, plus vous donnerez d'informations et plus le problème sera facilement résolu.
Pour finir, les problèmes délicats sont -heureusement- plutôt râres.
Exemples
Le monde est une bombe
Vous mettez régulièrement le monde de votre FreeBSD à jour.
Or en ce samedi pluvieux d'une froide journée de novembre,
le make installworld fut fatal Ă votre KDE.
La couche principale de KDE étant kdelibs:
portupgrade -f kdelibs
Et là , tout se passe bien, jusqu'aux liens avec les bibliothèques utilisées par kdelibs.
Patatra, kdelibs ne compile plus.
Premier réflexe, publier un appel au vaste monde:
«scours KDE marche pû »
sur les sites idoines [1] [2].
Seulement, KDE est plus qu'utile à ma station: il est nécéssaire.
Regardant de plus près, le lien incriminé est celui de arts.
Sans perdre une seconde, je le recompile, lui et tout ce qui en dépend.
portupgrade -fr arts
Après quelques heures de compilation, tout est rentré dans l'ordre. J'ai enfin pu lire mes messages dont celui-ci:
The ctype fix for UTF-8 locale unfortunately introduced some new symbols to libc. Therefore, binaries built on system with that fix can not be used on older system. For that sake, the fix is back-out for 6-STABLE. If you see undefined symbols '__mb_sb_limit', please rebuild the affected binary. Everything will be fine then. Binaries built between 20071025 and 20071030 will be affected by this.
Owned.
