Fink

Q.F.P. - 6. Problèmes généraux de compilation

Q.6.1: Un script configure signale qu'il ne peut trouver un "cc acceptable". De quoi s'agit-il ?

R.: Lisez la documentation avant de poser des questions. Pour compiler des paquets à partir du source, vous devez installer les Developer Tools, qui, entre autres, contiennent le compilateur C nommé cc.

Q.6.2: Lors de l'exécution de "fink selfupdate-cvs", un message signale que "la commande cvs est introuvable" (message en anglais : "cvs: Command not found."). Que faire ?

R.: Vous devez installer les Developer Tools.

Q.6.3: Un message d'erreur relatif à make apparaît. Que faire ?

R.: Si ce message est du type :

make: command not found

ou :

Can't exec "make": 
No such file or directory at /sw/lib/perl5/Fink/Services.pm line 190.

cela signifie que vous devez installer les Developer Tools.

Si, par contre, le message est du type :

make: illegal option -- C

cela signifie que vous avez remplacé la version GNU de l'utilitaire make installée par les Developer Tools par une version BSD de make. De nombreux paquets utilisent des fonctionnalités spéciales implémentées seulement dans GNU make. Vérifiez que /usr/bin/make est un lien symbolique vers gnumake, et non vers bsdmake. De plus, assurez-vous que le répertoire /usr/local/bin/ ne contient aucune autre copie de make.

Q.6.4: Un étrange message d'erreur concernant la commande head apparaît. Que se passe-t-il ?

R.: Si vous voyez apparaître ce message :

Unknown option: 1 Usage: head [-options] <url>...

suivi d'une liste d'options, cela signifie que la commande head est défectueuse. Cela se produit lorsqu'on installe la bibliothèque Perl libwww sur un volume système HFS+. Elle tente de créer une nouvelle commande /usr/bin/HEAD, qui écrase la commande head existante, car le système de fichiers ne respecte pas la casse. head est une commande standard utilisée dans de nombreux scripts shell et dans les Makefiles. Vous devez récupérer la commande head originale si vous voulez utiliser Fink.

Le script bootstrap de la version source de fink fait, maintenant, cette vérification ; mais vous pouvez vous retrouver devant ce problème si vous utilisez la version binaire lors de la première installation de fink ou si vous installez libwww après avoir installé Fink.

Ce problème peut aussi venir de l'installation de /sw/bin/HEAD (mais pas par un paquet de Fink). La solution est plus simple : renommez /sw/bin/HEAD.

Q.6.5: À l'installation d'un paquet, un message d'erreur signale qu'il y a tentative d'écrasement d'un fichier situé dans un autre paquet. Que faire ?

R.: Cela arrive parfois avec les paquets multiples (c'est-à-dire ceux qui sont scindés en -dev, -shlibs, etc...) quand un fichier est déplacé d'un paquet à l'autre (par exemple de toto à toto-shlibs. Vous pouvez tenter d'écraser le fichier par celui présent dans le paquet (puisqu'ils sont identiques) via la commande :

sudo dpkg -i --force-overwrite nomdufichier

nomdufichier est le nom du fichier .deb correspondant au paquet que vous êtes en train d'installer.

Q.6.6: Lors de la construction d'un paquet, un message indique que l'exécution de la commande mv a échoué (message en anglais : "execution of mv failed, exit code 1"). Que faire ?

R.: Si vous avez installé StuffIt Pro, il se peut que vous ayez activé le mode "Archive Via Real Name". Recherchez un panneau de préférences Stuffit dans les préférences système et désactivez "ArchiveViaRealName" si cette option est activée. Elle contient une implémentation boguée de certains appels système importants qui entraîne un grand nombre d'erreurs étranges et passagères comme celle-ci.

Dans le cas contraire, une erreur sur la commande mv signifie, en général, qu'une autre erreur s'est produite précédemment dans le processus de construction sans l'arrêter. Pour trouver le ou les fichiers concernés, recherchez dans les messages de sortie le fichier manquant. Par exemple, si vous obtenez ce message :

mv /sw/src/root-toto-0.1.2-3/sw/lib/libtata*.dylib \
/sw/src/root-toto-shlibs-0.1.2-3/sw/lib/ 
mv: cannot stat `/sw/src/root-toto-0.1.2-3/sw/lib/libtata*.dylib': 
No such file or directory 
### execution of mv failed, exit code 1 
Failed: installing toto-0.1.2-3 failed

vous devez rechercher libtata parmi les messages de sortie précédents du processus de construction.

Q.6.7: Il est impossible d'installer ou de mettre à jour un paquet, un message indique qu'un "noeud" existe déjà (message en anglais : "node already exists"). Que faire ?

R.: Ces messages d'erreurs sont similaires au message suivant :

Failed: Internal error: node for system-xfree86 already exists

Le moteur de dépendances ne sait plus où il en est, car il y a eu des changements dans certains fichiers info des paquets. Pour résoudre ce problème :

  • Supprimez de force le paquet en cause, par exemple :

    sudo dpkg -r --force-all system-xfree86

    pour l'exemple donné ci-dessus.

  • Essayez de le réinstaller ou de le remettre à jour. À un moment, vous verrez apparaître un message concernant une "dépendance virtuelle" (en anglais "virtual dependency") sur le paquet que vous venez de supprimer. Sélectionnez-le et le paquet sera réinstallé pendant le processus de construction.

Q.6.8: Des problèmes de compilation de paquet Fink apparaissent quand des bibliothèques ou des headers sont installés dans le répertoire /usr/local. Que faire ?

R.: C'est une source fréquente de problèmes, car le script de configuration du paquet trouve les bibliothèques et les headers installés dans le répertoire /usr/local avant ceux installés dans l'arborescence de Fink. Si vous rencontrez des problèmes lors de la construction d'un paquet, et que vous ne trouvez pas de solution à ce problème dans les QFP, regardez si vous avez des bibliothèques installées dans le répertoire /usr/local/lib ou des headers installés dans le répertoire /usr/local/include. Si c'est le cas, déplacez temporairement le répertoire /usr/local via la commande :

sudo mv /usr/local /usr/local.moved

construisez le paquet, puis remettez en place le répertoire /usr/local via la commande :

sudo mv /usr/local.moved /usr/local

Q.6.9: Lors de la construction d'un paquet, un message indique que la "table des matières" n'est pas à jour (message en anglais "table of contents out of date"). Que faire ?

R.: Le message de sortie vous indique (hélas ! en anglais) ce qu'il faut faire. En général, il est de la forme suivante :

ld: table of contents for archive: 
/sw/lib/libintl.a is out of date; 
rerun ranlib(1) (can't load from it)

Vous devez exécuter ranlib (en tant que super-utilisateur) sur la bibliothèque qui est la cause du problème. Par exemple, dans le cas ci-dessus, vous devez exécuter :

sudo ranlib /sw/lib/libintl.a

Q.6.10: Fink Commander se bloque quand on tente d'installer atlas. Que faire ?

R.: Ceci provient du fait qu'une des étapes de la compilation du paquet atlas envoie une invite à l'utilisateur et que Fink Commander ne l'affiche pas. Vous devez utiliser fink install atlas au lieu de passer par Fink Commander.

Q.6.11: Un message indique qu'il est impossible de trouver les fichiers stddef.h, ou wchar.h, ou stdlib.h, ou crt1.o, ou bien encore que le compilateur C ne peut créer de fichiers exécutables ( message en anglais "C compiler cannot create executables"). Que faire ?

R.: Ces problèmes sont dus, généralement, à l'absence de headers essentiels fournis par le paquet DevSDK des Outils de Développement (Developer Tools). Vérifiez que le répertoire /Library/Receipts/DevSDK.pkg existe dans votre système. Si ce n'est pas le cas, relancez l'installeur des Outils de Développement et installez le paquet DevSDK en choisissant l'option Installation Personnalisée (Custom Install en anglais).

Le message d'erreur impossible de créer des fichiers exécutables peut aussi être généré lorsque la version des Outils de Développement installée provient d'une version antérieure du système d'exploitation.

Q.6.12: Il est impossible de mettre à jour, un message indique que Fink est "incapable de résoudre des conflits de versions entre dépendances" (message en anglais "unable to resolve version conflict on multiple dependencies"). Que faire ?

R.: Pour résoudre ce problème, essayez de ne mettre à jour qu'un seul paquet, puis lancez de nouveau "fink update-all". Si le message réapparaît, répétez le processus.

Q.6.13: Il est impossible d'installer quoi que ce soit, un message indique que "dpkg est incapable d'analyser la structure du fichier /sw/var/lib/dpkg/status" (message en anglais : "dpkg: parse error, in file `/sw/var/lib/dpkg/status'"). De quoi s'agit-il ?

R.: This means that somehow your dpkg database got damaged, usually from a crash or some other unrecoverable error. This most often occurs with a buildlock, e.g:

package `fink-buildlock-foo-1.2.3-4':  missing version

(of course, replace foo-1.2.3-4 with the package name you are seeing).

When this happens, you should edit /sw/var/lib/dpkg/status as a superuser. Then go near the line number which shows up in the error message. You should see a fink-buildlock-foo-1.2.3-4 package whose Status field is marked

install ok installed

Change that to

purge ok not-installed

Under other circumstances, there may be garbage in the file. You can fix this situation by copying the previous version of the database, like so:

sudo cp /sw/var/lib/dpkg/status-old /sw/var/lib/dpkg/status

You may need to re-install the last couple of packages you installed before the problem started occurring.

Q.6.14: Des messages d'erreurs concernant freetype apparaissent. Que faire ?

R.: Il y a plusieurs types d'erreurs concernant freetype. Si le message d'erreur ressemble au suivant :

/usr/bin/ld: can't locate file for: -lfreetype

Vérifiez que vous n'avez pas un exécutable freetype-config dans un endroit insolite via la commande :

where freetype-config

si vous utilisez tcsh, ou :

type -a freetype-config

si vous utilisez bash. La framework Mono installe /usr/bin/freetype-config en tant que lien symbolique vers un fichier de cette framework.

Si le message d'erreur ressemble au suivant :

/sw/include/pango-1.0/pango/pangoft2.h:52: 
error: parse error before '*' token 
/sw/include/pango-1.0/pango/pangoft2.h:57:
error: parse error before '*' token
/sw/include/pango-1.0/pango/pangoft2.h:61: 
error: parse error before '*' token 
/sw/include/pango-1.0/pango/pangoft2.h:86: 
error: parse error before "pango_ft2_font_get_face"
/sw/include/pango-1.0/pango/pangoft2.h:86: 
warning: data definition has no type or storage class 
make[2]: *** [rsvg-gz.lo] Error 1
make[1]: *** [all-recursive] Error 1 
make: *** [all-recursive-am] Error 2 
### execution of make failed, exit code 2 
Failed: compiling librsvg2-2.4.0-3 failed

ou à celui-ci :

In file included from vteft2.c:32: 
vteglyph.h:64: error:
parse error before "FT_Library" 
vteglyph.h:64: warning: 
no semicolon at end of struct or union vteft2.c: 
In function `_vte_ft2_get_text_width': 
vteft2.c:236: error: 
dereferencing pointer to incomplete type 
vteft2.c: In function `_vte_ft2_get_text_height':
vteft2.c:244: error: 
dereferencing pointer to incomplete type
vteft2.c: In function `_vte_ft2_get_text_ascent': 
vteft2.c:252: error:
dereferencing pointer to incomplete type 
vteft2.c: In function `_vte_ft2_draw_text': 
vteft2.c:294: error: 
dereferencing pointer to incomplete type 
vteft2.c:295: error: 
dereferencing pointer to incomplete type
make[2]: *** [vteft2.lo] Error 1 
make[1]: *** [all-recursive] Error 1 
make: *** [all] Error 2 
### execution of make failed, exit code 2
Failed: compiling vte-0.11.10-3 failed

ou encore à celui-là :

checking for freetype-config.../usr/X11R6/bin/freetype-config 
checking For sufficiently new FreeType (at least 2.0.1)... no 
configure: error: pangoxft 
Pango backend found but did not find freetype libraries 
make: *** No targets specified and no makefile found. Stop. 
### execution of LD_TWOLEVEL_NAMESPACE=1 failed, exit code 2 
Failed: compiling gtk+2-2.2.4-2 failed

le problème est dû à une confusion entre les headers des paquets freetype ou de freetype-hinting et les headers freetype2 qui sont inclus dans X11 ou dans XFree86. La commande :

fink remove freetype freetype-hinting

supprime la variante que vous avez installée. À contrario, si le message d'erreur est similaire à celui-ci :

ld: Undefined symbols: _FT_Access_Frame

cela est dû à la présence d'un fichier résultant d'une installation précédente de X11. Réinstallez X11 SDK.

Q.6.15: Des messages d'erreur concernant `Dl_info' apparaissent. Que faire ?

R.: Si vous avez des messages d'erreur similaire à celui-ci :

unix_dl.c: In function `rep_open_dl_library':
unix_dl.c:328: warning: assignment discards qualifiers from \
pointer target type 
unix_dl.c: In function `rep_find_c_symbol': 
unix_dl.c:466: error: `Dl_info' undeclared (first use in this \
function)
unix_dl.c:466: error: (Each undeclared identifier is reported \
only once 
unix_dl.c:466: error: for each function it appears in.)
unix_dl.c:466: error: parse error before "info" 
unix_dl.c:467: error: `info' undeclared (first use in this function) 
make[1]: *** [unix_dl.lo] Error 1

vous avez certainement un header /usr/local/include/dlfcn.h, incompatible avec Panther. Déplacez-le.

Note : les barres obliques inversées ont été rajoutées uniquement pour des raisons de formatage.

Ce header est, en général, installé par Open Office, et vous devez le remplacer, de même que la bibliothèque /usr/local/lib/libdl.dylib, par des liens symboliques vers les fichiers inclus dans Panther :

sudo ln -s /usr/include/dlfcn.h /usr/local/include/dlfcn.h
sudo ln -s /usr/lib/libdl.dylib /usr/local/lib/libdl.dylib

Q.6.16: Fink signale que les paquets gcc2 ou gcc3.1 n'existent pas, mais il ne semble pas possible de les installer. Que faire ?

R.: gcc2 et gcc3.1 sont des paquets virtuels qui indiquent la présence de gcc-2.95 ou de gcc3.1 dans votre système. Installez les paquets gcc2.95 ou gcc3.1 à partir de XCode Tools (les versions précédentes du système opératoire inclut gcc-2.95 dans l'installation standard des Developer Tools).

Note : L'installation de gcc2.95 et / ou de gcc3.1 n'interfère pas avec le compilateur gcc3.3. Ils peuvent coexister.

Q.6.17: Fink signale qu'il ne peut résoudre la dépendance "system-java14-dev", mais il n'existe pas de paquet system-java14-dev (message en anglais Failed: Can't resolve dependency "system-java14-dev"). Que faire ?

R.: Ce paquet est un paquet virtuel. Ce type d'erreur apparaît quand Java est mis à jour via Mise à jour de Logiciels : les headers sont supprimés, ce qui empêche la création du paquet -dev.

Vous devez télécharger le paquet approprié des Java Developer Tools à partir du site d'Apple. Dans le cas ci-dessus, il s'agit du paquet Java 1.4.2 Developer Tools.

Q.6.18: Lors de l'installation d'un paquet, un message d'erreur apparaît signalant que dpkg n'arrive à exécuter dpkg-split pour vérifier si le paquet fait partie d'un paquet multiple (message en anglais : dpkg (subprocess): failed to exec dpkg-split to see if it's part of a multiparter: No such file or directory). Que faire ?

R.: Ce problème se résout, en général, par la définition correcte de votre environnement, cf. cette partie des QFP.

Q.6.19: Un message d'erreur signalant que le module Perl XML est requis par intltool apparaît (message en anglais: configure: error: XML::Parser perl module is required for intltool). Que faire ?

R.: Si vous utilisez l'arbre instable, you devez installer une version de intltool supérieure ou égale à la version 0.34.1.

Sinon, vous devez vérifier que vous avez la variante du paquet qui correspond à la version de Perl installée dans votre système. Par exemple, sous Panther, vous devez avoir xml-parser-pm581 et non pas xml-parser-pm560 (il se peut que vous ayez le paquet fantôme xml-parser-pm), car, dans votre système est installé Perl-5.8.1 et non pas Perl-5.6.0. Sous Jaguar, vous devez avoir la variante pm560 si vous utilisez la version système de Perl; si vous avez installé Perl 5.8.0, vous devez avoir la variante pm580.

Q.6.20: Lors du téléchargement d'un paquet, Fink tente de le faire à partir d'un site dont le nom contient distfiles et ne trouve pas le fichier. Que faire ?

R.: Fink tente d'utiliser l'un de ses sites Maîtres. Ils servent à garantir que les sources des paquets de Fink sont disponibles même lorsque le site original a changé d'adresse. Cette erreur apparaît lorsqu'une nouvelle version d'un paquet est publiée, mais que les miroirs maîtres n'ont pas encore eu le temps de la prendre en compte.

Pour pallier cela, exécutez fink configure et changez l'ordre de recherche de telle sorte que les miroirs maîtres soient utilisés en dernier.

Q.6.21: Comment utiliser des options variables lors de la compilation d'un paquet ?

R.: La première chose à faire est de contacter le mainteneur du paquet pour lui demander d'introduire une variante dans le paquet. Cela peut être relativement facile à faire. Si le mainteneur ne vous répond pas ou si vous ne voyez pas apparaître de nouveaux paquets correspondant à votre demande, ou que vous vouliez essayer de faire le changement vous-même, étudiez le Tutoriel d'empaquetage et le Guide de construction de paquets.

Note : Fink est volontairement initialisé de telle façon que tous les paquets binaires officiels soient identiques quelle que soit la machine sur laquelle ils sont construits. C'est ainsi qu'il n'y aura jamais d'optimisation pour le G5 dans un paquet officiel. Si vous voulez ce type d'option, il vous faudra le faire vous-même.

Q.6.22: Whenever I try to build from source, Fink keeps waffling between alternate versions of the same library.

R.: Often, in a complicated build tree, you may find that some of the packages depend on a particular version of a library, and other depend on a different one (e.g. db47 vs. db44). Consequently, Fink may try to switch to whichever one isn't currently installed in order to satisfy the build dependency for the current package that you're trying to update.

Unfortunately, due to limitations in the build-dependency engine, you may wind up with the dreaded

Fink::SysState: Could not resolve inconsistent dependencies

message when trying a sufficiently complicated update-all. This generally gives you a command to try to resolve the issue:

fink scanpackages
sudo apt-get update
sudo apt-get install foo=1.23-4	
      

but this may not work for sufficiently complicated updates. You might need to update packages one-by-one, at least for a while.

Q.6.23: Un message d'erreur comportant MACOSX_DEPLOYMENT_TARGET apparaît lors de la compilation d'un module Python. Que faire ?

R.: Si le message ressemble au suivant :

running build
running build_ext
Traceback (most recent call last):
  File "setup_socket_ssl.py", line 21, in ?
    depends = ['socketmodule.h'] )
  File "/sw/src/root-python24-2.4.1-1/sw/lib/python2.4/distutils/core.py", line 166, in setup
SystemExit: error: $MACOSX_DEPLOYMENT_TARGET mismatch: now "10.4" but "10.3" during configure
### execution of /sw/bin/python2.4 failed, exit code 1

le problème apparaît parce que les paquets python2* notent la valeur en cours de MACOSX_DEPLOYMENT_TARGET dans un fichier de configuration lors de leur compilation. Les outils de compilation de python utilisent ensuite cette valeur lorsqu'ils compilent des modules. Par exemple, si avez sous Mac OS X 10.4 un paquet python24 qui a été compilé sous Mac OS X 10.3, soit par mise à jour 10.3 => 10.4, ou via la distribution binaire 10.4-transitionelle, et qui n'a pas été recompilé, il y aura divergence entre la valeur de MACOSX_DEPLOYMENT_TARGET stockée dans le fichier de configuration de python (10.3) et sa valeur réelle (10.4).

La solution de ce problème consiste à recompiler le paquet python en cause ; dans notre exemple, fink rebuild python24.

Si vous obtenez le même genre d'erreur au runtime, recompilez le module après avoir recompilé le paquet python2* concerné.

Q.6.24: Un message d'erreur signalant que libtool ne reconnait pas l'option '-dynamic' apparaît (message en anglais libtool: unrecognized option `-dynamic'). Que faire ?

R.: Le message :

 libtool: unrecognized option `-dynamic'

signifie que vous avez remplacé la commande /usr/bin/libtool d'Apple par la commande GNU libtool. Malheureusement les deux libtools ne font pas la même chose.

La seule manière de résoudre le problème est d'installer une version de libtool d'Apple en provenance d'ailleurs. Il fait partie du paquet DeveloperTools.pkg de XCode. Vous pouvez réinstaller le paquet si vous supprimez d'abord son reçu situé dans le répertoire /Library/Receipts (glissez-le dans la corbeille sur les systèmes Mac OS X 10.4 et ultérieurs ou exécutez la commande sudo rm -rf /Library/Receipts/DeveloperTools.pkg pour le système Mac OS X 10.3).

Suite: 7. Problèmes de compilation spécifiques à certains paquets