Fink

Perguntas frequentes - 6. Problemas de Compilação - Geral

P.6.1: Um script de configuração reclama que não consegue encontrar um "acceptable cc". O que é isso?

R.: Leia a documentação! Para compilar pacotes a partir do código fonte, você precisa instalar o Xcode que, dentre outros, contém o compilador C, cc.

P.6.2: Quando tento executar o comando fink selfupdate-cvs eu recebo esta mensagem: "cvs: Command not found." ("cvs: Comando não encontrado").

R.: Você precisa instalar o Xcode.

P.6.3: Estou recebendo uma mensagem de erro envolvendo o make.

R.: Caso sua mensagem seja do formato

make: command not found
(make: comando não encontrado)

ou

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

Isso significa que você precisa instalar o Xcode.

Por outro lado, se sua mensagem de erro se parece com

make: illegal option -- C
(make: opção ilegal -- C)

então você substituiu a versão GNU do utilitário make que veio com o Xcode por uma versão BSD do make. Vários pacotes dependem de características especiais que são suportadas apenas pelo GNU make. Assegure-se de que /usr/bin/make é um link simbólico para gnumake e não bsdmake. Além disso, assegure-se de que /usr/local/bin não contenha outra cópia do make.

P.6.4: Estou recebendo do comando head uma mensagem estranha. O que está errado?

R.: Caso esteja vendo isto:

Unknown option: 1 Usage: head [-options] <url>...
(Opção desconhecida: 1 Uso: head [-opções] <url>...

seguido por uma lista de descrições de opções, você tem um executável do head quebrado. Isto acontece quando você instala a biblioteca libwww do Perl em um volume de sistema formatado com HFS+. Ele tenta criar um novo comando /usr/bin/HEAD que sobrescreve o comando head já existente porque o sistema de arquivos não diferencia maiúsculas de minúsculas. head é um comando padrão usado em muitos scripts de shell e Makefiles. Você precisa restaurar o executável original do head caso queira usar o Fink.

O script de instalação inicial do Fink a partir do código fonte verifica isso mas ainda assim é possível caso você use a instalação binária na primeira instalação ou instale libwww depois de haver instalado o Fink.

Este problema também já foi relatado devido à instalação de /sw/bin/HEAD (mas não por um pacote do Fink). Isto é fácil de resolver: renomeie /sw/bin/HEAD.

P.6.5: Quando tento instalar um pacote, recebo uma mensagem de erro sobre tentativa de sobrescrita de um arquivo que está em outro pacote.

R.: Isto acontece ocasionalmente com pacotes múltiplos (isto é, pacotes que são divididos em -dev, -shlibs etc) quando um arquivo é movido de um pacote para outro (por exemplo, de foo para foo-shlibs). O que você pode fazer é sobrescrever o arquivo com aquele do pacote que você esteja tentando instalar (já que eles são nominalmente o mesmo arquivo):

sudo dpkg -i --force-overwrite nomedoarquivo

onde nomedoarquivo é o arquivo .deb correspondente ao pacote que você esteja tentando instalar.

P.6.6: O que significa "execution of mv failed, exit code 1" quando eu tento compilar um pacote?

R.: Se você tiver o StuffIt Pro instalado, pode ser que voce tenha o modo "Archive via Real Name" ("Arquivar pelo Nome Real") habilitado. Verifique o painel StuffIt na ferramenta Preferências do Sistema e desabilite "ArchiveViaRealName" se estiver habilitado. Ele contém uma reimplementação falha de algumas chamadas de sistema importante que causam erros estranhos e transientes, como esse.

Caso contrário, um erro no mv geralmente significa que outro erro anterior ocorreu durante a compilação mas a compilação não foi interrompiada. Para rastrear os arquivos que causaram o erro, procure na saída pela compilação de um arquivo que não exista. Por exemplo, se você tiver algo parecido com:

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

então você deve procurar por libbar em algum lugar mais acima da lista de mensagens que aparecem durante a tentativa de compilação.

P.6.7: Não consito instalar ou atualizar um pacote porque aparece uma mensagem dizendo que um nó já existe ("node already exists").

R.: Estes erros se parecem com o seguinte:

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

O problema é que o mecanismo de dependências está confuso devido a mudanças em alguns dos arquivos de descrição de pacotes. Para corrigi-lo:

  • Force a remoção do pacote causador do problema, por exemplo:

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

    para o exemplo listado acima.

  • Tente instalar ou atualizar novamente. Em algum momento uma pergunta envolvendo uma dependência virtual ("virtual dependency") aparecerá incluindo o pacote que você acabou de morever. Selecione o pacote e ele será reinstalado durante sua compilação.

P.6.8: Ouvi dizer que bibliotecas e arquivos de cabeçalho instalados sob /usr/local causam problemas eventuais de compilação no Fink. É verdade?

R.: Este é uma fonte de problemas frequente porque o script de configuração dos pacotes encontra arquivos de cabeçalho e bibliotecas em /usr/local e decide usá-los no lugar daqueles que residem no diretório do Fink. Se você estiver tendo problemas de compilação que não são cobertos por outra pergunta deste documento, você deve verificar se você tem bibliotecas em /usr/local/lib ou arquivos de cabeçalho em /usr/local/include. Em caso afirmativo, tente renomear /usr/local para algum outro nome, por exemplo

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

proceda sua compilação e então volte ao nome original de /usr/local:

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

P.6.9: Quando tento compilar um pacote, recebo uma mensagem dizendo que um sumário ("table of contents") está desatualizado ("out of date"). O que preciso fazer?

R.: A saída dá uma dica de o que fazer. A mensagem é geralmente parecida com:

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

O que você precisa fazer é executar o comando ranlib como root em qualquer biblioteca que esteja causando o problema. Por exemplo, para o caso acima, você executaria:

sudo ranlib /sw/lib/libintl.a

P.6.10: O Fink Commander trava quando tento instalar o pacote atlas.

R.: Isto acontece porque um dos passos durante a compilação do pacote atlas faz uma pergunta ao usuário que o Fink Commander não detecta. Você terá que executar o comando fink install atlas no lugar de instalá-lo pelo Fink Commander.

P.6.11: Eu recebo mensagens dizendo que os arquivos stddef.h | wchar.h | stdlib.h | crt1.o estão faltando ou que meu compilador C não consegue criar executáveis (C compiler cannot create executables).

R.: Ambos estes problemas são geralmente devidos à ausência de arquivos de cabeçalho essenciais que são providos pelo pacote DevSDK do Xcode. Verifique se /Library/Receipts/DevSDK.pkg existe no seu sistema. Em caso negativo, execute novamente o instalador do Xcode e instale o pacote DevSDK através do Custom Install (instalação customizada).

O erro cannot create executables também pode ocorrer quando sua versão do Xcode é para uma versão anterior do OS.

P.6.12: Não consigo fazer uma atualização porque o Fink não consegue resolver conflito de versão ou dependências múltiplas ("unable to resolve version conflict on multiple dependencies").

R.: Para contornar este problema, tente atualizar um único pacote e então tente usar novamente o fink update-all. Se você ainda receber a mensagem, repita o processo.

P.6.13: Não consigo instalar nada porque recebo a mensagem "dpkg: parse error, in file `/sw/var/lib/dpkg/status'"!

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.

P.6.14: Estou recebendo erros envolvendo o freetype.

R.: Existem muitas variedades desses erros. Se você receber o seguinte:

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

verifique se você tem um executável freetype-config perdido através do comando

type -a freetype-config

caso esteja usando bash ou

where freetype-config

caso esteja usando tcsh. Sabe-se que o framework Mono instala um /usr/bin/freetype-config que é um link simbólico para o arquivo que está nesse framework.

Caso seu erro se pareça com o seguinte:

/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

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

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

o problema é devido a uma confusão entre arquivos cabeçalhos de pacote freetype | freetype-hinting e os arquivos de cabeçalho do freetype2 que são parte do X11 | XFree86. O comando

fink remove freetype freetype-hinting

removerá qualquer variante que você haja instalado. Por outro lado, se seu erro é parecido com:

ld: Undefined symbols: _FT_Access_Frame

isto é normalmente devido a um arquivo residual de uma instalação prévia do X11. Reinstale o X11 SDK.

P.6.15: Estou recebendo erros de compilação envolvendo "Dl_info".

R.: Se você tem um erro parecido com

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

então o mais provável é que você tenha um arquivo de cabeçalho /usr/local/include/dlfcn.h que é incompatível com o Panther. Tire-o do caminho.

Normalmente, ele é instalado pelo OpenOffice e você deve substituir esse arquivo de cabeçalho, bem como a biblioteca /usr/local/lib/libdl.dylib, por links simbólicos aos arquivos providos pelo 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

P.6.16: O Fink diz que está faltando gcc2 ou gcc3.1 mas não consigo instalá-lo.

R.: Isto é porque gcc2 e gcc3.1 são pacotes virtuais que indicam a presença de gcc-2.95 e gcc-3.1, respectivamente, em seu sistema. Instale o pacote gcc2.95 e/ou o gcc.31 do Xcode Tools (versões anteriores do OS possuem gcc-2.95 e gcc-3.1 como parte da instalação principal do Developer Tools).

Observação: instalar o gcc2.95 ou gcc3.1 não interferirá com seu compilador gcc3.3--eles podem coexistir.

P.6.17: O Fink apresenta a mensagem Failed: Can't resolve dependency "system-java14-dev" mas esse pacote não existe.

R.: É porque é um pacote virtual. Esse tipo de erro acontece quando o Java é atualizado pelo Atualização de Software: os arquivos de cabeçalho são removidos, o que faz com que o pacote -dev não seja gerado.

Você precisa baixar o pacote Java Developer Tools apropriado do site da Apple. Neste caso específico, o pacote é Java 1.4.2 Developer Tools.

P.6.18: Quando tento instalar qualquer pacote, recebo a mensagem dpkg (subprocess): failed to exec dpkg-split to see if it's part of a multiparter: No such file or directory. Como faço para corrigir isto?

R.: Isto geralmente pode ser corrigido através da configuração correta do ambiente conforme esta pergunta.

P.6.19: Estou recebendo a seguinte mensagem: configure: error: XML::Parser perl module is required for intltool. O que preciso fazer?

R.: Caso esteja usando a árvore unstable, assegure-se de ter instalado o intltool-0.34.1 ou mais recente.

Caso contrário, você precisa assegurar-se de ter a variante correta do pacote xml-parser-pm que case com a versão do Perl em seu sistema. Por exemplo, se você estiver no Panther você deveria ter xml-parser-pm581 no lugar de xml-parser-pm560 (você também pode ter o substituto xml-parser-pm), já que você tem o Perl-5.8.1 no lugar de Perl-5.6.0 Se estiver no Jaguar e estiver usando a versão padrão do Perl para o sistema, você terá a variante pm560 e se você instalou o Perl 5.8.0 você pode ter a variante pm580.

P.6.20: Estou tentando baixar um pacote mas o Fink vai para um site estranho com distfiles no nome e o arquivo não está lá.

R.: O que aconteceu aqui é que o Fink está tentando usar um dos seus espelhos mestres. Eles foram configurados para garantir que códigos fontes dos pacotes do Fink estejam disponíveis mesmo que os sites oficiais os tenham mudado de lugar. Normalmente esses erros ocorrem quando uma nova versão oficial de um pacote é lançada mas ainda não chegou aos espelhos mestres.

Para remediar esta situação, execute o comando fink configure e defina a ordem de pesquisa para que use os espelhos mestres por último.

P.6.21: Quero que o Fink use opções diferentes na compilação de um pacote.

R.: A primeira coisa a fazer é entrar em contato com o mantenedor do pacote para solicitar uma variante. Isto pode ser relativamente fácil de ser feito. Caso você não obtenha resposta do mantenedor ou não veja os pacotes novos, ou queira tentar uma opção diferente por você mesmo, leia o Tutorial de empacotamento e o Manual de empacotamento.

Observação: o Fink é deliberadamente configurado para que todos os binários oficiais sejam idênticos independentemente da máquina em que foram compilados, portanto opções como otimização para o G5 não acontecerão com um pacote oficial. Caso as queira, você terá que fazê-las por sua própria conta.

P.6.22: Sempre que tento compilar a partir do código fonte, o Fink fica reclamando sobre versões alternadas da mesma biblioteca.

R.: É comum que, em uma árvore de compilação complicada, você descubra que alguns pacotes dependem de uma versão específica de uma biblioteca e outros dependam em uma versão diferente (por exemplo, db47 vs. db44). Consequentemente, o Fink pode tentar trocar para aquela que não estiver instalada atualmente de forma a satisfazer a dependência de compilação do pacote que você deseja atualizar.

Infelizmente, devido a limitações do mecanismo de dependências de compilação, você pode encontrar a famigerada mensagem

Fink::SysState: Could not resolve inconsistent dependencies

ao tentar um update-all suficientemente complicado. Esta situação geralmente lhe fornece um comando para tentar resolver o problema:

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

mas isto pode não funcionar para atualizações suficientemente complicadas. Você talvez precise atualizar pacotes um-a-um, ao menos por algum tempo.

P.6.23: Estou recebendo erros com relação a MACOSX_DEPLOYMENT_TARGET quando tento compilar um módulo Python.

R.: Para erros parecidos com:

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

o problema ocorre porque os pacotes python2* gravam o MACOSX_DEPLOYMENT_TARGET atual em um arquivo de configuração quando são compilados e os utilitários de compilação do python usam esse valor quando compilam módulos. Isto significa que você tem, por exemplo, um pacote python24 no OS 10.4 que foi compilado no OS 10.3, ocorrendo tanto na atualização 10.3 => 10.4, ou através da distribuição binária 10.4-transitional, na qual o python24 não foi recompilado, havendo portanto uma diferença entre o que o python acha que MACOSX_DEPLOYMENT_TARGET deveria ser (10.3) e o que realmente é (10.4).

A solução é recompilar o pacote python que esteja causando problema, por exemplo fink rebuild python24 para o caso acima.

Para erros em tempo de execução que exibem o mesmo tipo de mensagem de erro acima, recompile o módulo após recompilar o pacote python2* apropriado.

P.6.24: Eu recebo erros unrecognized option `-dynamic' da libtool.

R.: O erro

 libtool: unrecognized option `-dynamic'

normalmente significa que você substituiu a /usr/bin/libtool da Apple por uma libtool GNU. Infelizmente, as duas libtools não funcionam da mesma forma.

A única maneira de resolver este problema é obter uma libtool da Apple que funcione. Ela é instalada como parte do pacote DeveloperTools.pkg das ferramentas do Xcode e você pode reinstalar todo o pacote se primeiro limpar seu arquivo de receita em /Library/Receipts (arraste-o para a Lixeira).

Próximo: 7. Problemas de compilação - Pacotes específicos