Aqui está uma lista dos erros mais comuns que você pode ver gerados pelo make, com algumas informações sobre o que eles significam e como corrigi-los.
Às vezes os erros do make não são fatais, em especial quando há um prefixo - em uma linha de receita (recipe) ou quando se usa a opção de linha de comando -k. Os erros que são fatais vêm prefixados com a string ***.
As mensagens de erro são todas prefixadas com o nome do programa (geralmente «make»), ou, se o erro for encontrado em um makefile, com o nome do arquivo e o número da linha que contém o problema.
Na tabela abaixo, esses prefixos comuns são omitidos.
Na verdade, esses erros não são erros do make. Eles significam que um programa que o make invocou como parte de uma receita retornou um código de erro diferente de 0 («Error NN»), o que o make interpreta como falha, ou que ele terminou de alguma outra forma anormal (com um sinal de algum tipo). Veja Erros em receitas.
Se nenhum *** estiver anexado à mensagem, então o subprocesso falhou, mas a regra no makefile foi prefixada com o caractere especial -, de modo que o make ignorou o erro.
Isso significa que o make não conseguiu entender quase nada sobre a linha do makefile que acabou de ler. O GNU make procura vários separadores (:, =, caracteres de prefixo de receita etc.) para indicar que tipo de linha está analisando. Esta mensagem significa que ele não encontrou um separador válido.
Uma das causas mais comuns dessa mensagem é que você (ou talvez seu editor tão prestativo, como acontece com muitos editores do MS-Windows) tentou indentar as linhas de receita com espaços em vez de um caractere de tabulação. Nesse caso, o make usará a segunda forma do erro acima. Lembre-se de que toda linha da receita deve começar com um caractere de tabulação (a menos que você defina .RECIPEPREFIX; veja Outras variáveis especiais). Oito espaços não contam. Veja Sintaxe das regras.
Isso significa que a primeira coisa no makefile parece fazer parte de uma receita: ela começa com um caractere de prefixo de receita e não parece ser uma diretiva (directive) make válida (como uma atribuição de variável). As receitas devem sempre estar associadas a um alvo.
A segunda forma é gerada se a linha tiver um ponto e vírgula como primeiro caractere não branco; o make interpreta isso como se você tivesse omitido a parte «target: prerequisite» de uma regra. Veja Sintaxe das regras.
Isso significa que o make decidiu que precisava construir um alvo, mas não conseguiu encontrar nenhuma instrução no makefile sobre como fazer isso, nem explícita nem implícita (incluindo na base de dados de regras padrão).
Se você quer que esse arquivo seja construído, será necessário adicionar ao seu makefile uma regra que descreva como esse alvo pode ser construído. Outras possíveis causas desse problema são erros de digitação no makefile (se o nome do arquivo estiver errado) ou uma árvore de fontes corrompida (se esse arquivo não deveria ser construído, mas sim ser apenas um pré-requisito (prerequisite)).
A primeira significa que você não forneceu nenhum alvo a ser construído na linha de comando e o make não conseguiu encontrar nenhum makefile para ler. A segunda significa que algum makefile foi encontrado, mas não continha nenhuma meta padrão e nenhuma foi indicada na linha de comando. O GNU make não tem nada a fazer nessas situações. Veja Argumentos para especificar o makefile.
Um makefile especificado na linha de comando (primeira forma) ou incluído (segunda forma) não foi encontrado.
O GNU make permite que apenas uma receita seja especificada por alvo (exceto nas regras de dois-pontos duplo). Se você fornecer uma receita para um alvo que já foi definido com uma, este aviso é emitido e a segunda receita sobrescreverá a primeira. Veja Várias regras para um alvo.
Isso significa que o make detectou um laço no grafo de dependências: depois de rastrear o pré-requisito yyy do alvo xxx, e os pré-requisitos deste etc., um deles dependia novamente de xxx.
Isso significa que você definiu uma variável make normal (de expansão recursiva) xxx que, ao ser expandida, se referirá a si mesma (xxx). Isso não é permitido; use variáveis de expansão simples («:=» ou «::=») ou use o operador de acréscimo (append) («+=»). Veja Como usar variáveis.
Isso significa que você esqueceu de fornecer o parêntese ou a chave de fechamento correta na sua referência de variável ou de função.
Isso significa que você não forneceu o número necessário de argumentos para esta função. Veja a documentação da função para uma descrição de seus argumentos. Veja Funções para transformar texto.
Esses erros são gerados para regras de padrão estáticas malformadas (veja Sintaxe das regras de padrão estáticas). O primeiro significa que a parte do padrão-alvo da regra está vazia; o segundo significa que há vários caracteres de padrão (%) na parte do padrão-alvo; o terceiro significa que não há nenhum caractere de padrão na parte do padrão-alvo; e o quarto significa que todas as três partes da regra de padrão estática contêm caracteres de padrão (%) — sendo que a primeira parte não deveria conter caracteres de padrão.
Se você vir esses erros e não estiver tentando criar uma regra de padrão estática, verifique o valor de quaisquer variáveis nas suas listas de alvos e de pré-requisitos para garantir que não contenham dois-pontos.
Este aviso e o próximo são gerados se o make detectar condições de erro relacionadas ao processamento paralelo em sistemas onde os sub-makes podem se comunicar (veja Comunicando opções a um sub-make). Este aviso é gerado se uma invocação recursiva de um processo make for forçada a ter «-jN» em sua lista de argumentos (onde N é maior que um). Isso poderia acontecer, por exemplo, se você definisse a variável de ambiente MAKE como «make -j2». Nesse caso, o sub-make não se comunica com outros processos make e simplesmente fingirá ter duas tarefas (job) próprias.
Para que os processos make se comuniquem, o pai passa informações ao filho. Como isso poderia gerar problemas se o processo filho não fosse de fato um make, o pai só faz isso se achar que o filho é um make. O pai usa os algoritmos normais para determinar isso (veja Como funciona a variável MAKE). Se o makefile for construído de tal forma que o pai não saiba que o filho é um processo make, então o filho receberá apenas parte das informações necessárias. Nesse caso, o filho gerará esta mensagem de aviso e prosseguirá com sua construção de maneira sequencial.
De acordo com o POSIX, uma regra de sufixo não pode conter pré-requisitos. Se uma regra que poderia ser uma regra de sufixo tiver pré-requisitos, ela é interpretada como uma regra explícita simples, com um nome de alvo estranho. Esse requisito é obedecido quando o modo de conformidade com POSIX está ativado (o alvo .POSIX está definido). Nas versões do GNU make anteriores à 4.3, nenhum aviso era emitido e uma regra de sufixo era criada; no entanto, todos os pré-requisitos eram ignorados e não faziam parte da regra de sufixo. A partir do GNU make 4.3, o comportamento é o mesmo e, além disso, este aviso é gerado. Em uma versão futura, o comportamento em conformidade com POSIX será o único: nenhuma regra com pré-requisito poderá ser uma regra de sufixo e este aviso será removido.