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.