Erro ao compilar o Perl 5.12.1 (RHEL 5.5)

2

Eu estou tentando compilar o Perl 5.12.1 no meu diretório home no Red Hat Enterprise Linux 5.5. No entanto, quando tento fazer, acabo recebendo o seguinte erro:

    Making IO (all)
make[1]: Entering directory '/users/rmi1/build/perl-5.12.0/dist/IO'
make[1]: Leaving directory '/users/rmi1/build/perl-5.12.0/dist/IO'
Making all in dist/IO
 make all PERL_CORE=1 LIBPERL_A=libperl.a LINKTYPE=dynamic
make[1]: Entering directory '/users/rmi1/build/perl-5.12.0/dist/IO'
cc -c   -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2   -DVERSION=\"1.25_02\" -DXS_VERSION=\"1.25_02\" -fPIC "-I../.."   IO.c
IO.xs: In function ‘XS_IO__Poll__poll’:
IO.xs:249: error: invalid application of ‘sizeof’ to incomplete type ‘struct pollfd’ 
IO.xs:253: error: invalid use of undefined type ‘struct pollfd’
IO.xs:253: error: dereferencing pointer to incomplete type
IO.xs:255: error: invalid use of undefined type ‘struct pollfd’
IO.xs:255: error: dereferencing pointer to incomplete type
IO.xs:257: error: invalid use of undefined type ‘struct pollfd’
IO.xs:257: error: dereferencing pointer to incomplete type
IO.xs:261: error: invalid use of undefined type ‘struct pollfd’
IO.xs:261: error: dereferencing pointer to incomplete type
IO.xs:262: error: invalid use of undefined type ‘struct pollfd’
IO.xs:262: error: dereferencing pointer to incomplete type
make[1]: *** [IO.o] Error 1
make[1]: Leaving directory '/users/rmi1/build/perl-5.12.0/dist/IO'
Unsuccessful make(dist/IO): code=512 at make_ext.pl line 449.
make: *** [lib/auto/IO/IO.so] Error 2

O que poderia estar causando isso?

    
por telotortium 26.05.2010 / 01:28

3 respostas

7

Acabei de me deparar com o mesmo problema e localizei a causa raiz: a variável de ambiente C_INCLUDE_PATH . O meu aconteceu por ser definido da seguinte forma:

% printenv C_INCLUDE_PATH
C_INCLUDE_PATH=/home/me/REDACTED/include:

Isso veio de um script de login em algum lugar que estava fazendo algo como

export C_INCLUDE_PATH=$HOME/REDACTED/include:$C_INCLUDE_PATH

durante a configuração do meu ambiente. Isso parece correto à primeira vista; infelizmente, parece ser o caso que foo: é equivalente a foo:. neste contexto - isto é, a cadeia vazia nessa lista separada por dois itens parece ser implicitamente tratada da mesma forma que . . O que efetivamente adiciona o diretório atual ao caminho de inclusão do sistema, o que faz com que #include <poll.h> faça o mesmo que #include "poll.h" , o que é ruim.

No caso do Perl, o caminho de invasão não autorizado faz com que o poll.h de Perl seja incluído em vez de /usr/include/poll.h . Como o poll.h do Perl tem uma proteção contra inclusão múltipla, o segundo inclui silenciosamente nada, e você acaba sem poll.h , o que leva rapidamente ao erro do compilador que ambos vimos. Isso também explica por que seu patch faz o problema desaparecer: não há ./sys/poll.h no diretório de construção, então o compilador acaba encontrando /usr/include/sys/poll.h , que acaba sendo o que você queria.

Minha solução foi livrar-me do cólon perdido em C_INCLUDE_PATH . No meu caso, encontrei o script que estava configurando-o incorretamente e corrigi-lo para que ele verifique explicitamente o caso em que o C_INCLUDE_PATH anterior estava vazio e não adicione dois pontos nesse caso. É claro que, como uma correção rápida e única, eu também poderia executar manualmente export C_INCLUDE_PATH=/home/me/REDACTED/include ou apenas unset C_INCLUDE_PATH antes de criar o Perl.

    
por 23.07.2011 / 01:35
1

Eu descobri que o perl vem com um poll.h local que tenta emular a funcionalidade de poll () se você não tiver os cabeçalhos certos; isto está localizado em /dist/IO/poll.h (a raiz está localizada na raiz do tarball). Como o RHEL 5.5 tem o comando poll.h, o / Configure detectou sua presença e se definiu para usar o sistema poll.h em vez do próprio. O seguinte diff em /dist/IO/poll.h deu certo:

14c14
< #  include <poll.h>
---
> #  include <sys/poll.h>

Eu realmente não sei porque <poll.h> não funciona mesmo que <sys/poll.h> faça. Meu <poll.h> (localizado em /usr/include/poll.h) é o seguinte:

#include <sys/poll.h>
    
por 26.05.2010 / 02:43
0

Meu palpite é que você está perdendo poll.h.

Por que não usar o rpm para instalar o Perl? Seria mais fácil.

Espero que isso ajude.

    
por 26.05.2010 / 02:30

Tags