Os programas make que acompanham vários outros sistemas oferecem alguns recursos que não estão implementados no GNU make. Ainda assim, o padrão POSIX.2 (IEEE Standard 1003.2-1992), que especifica o make, não exige nenhum desses recursos.
Um alvo na forma ‘file((entry))’ representa um membro do arquivo de arquivo (archive) file. Esse membro, porém, não é escolhido pelo nome, mas sim por ser o arquivo objeto que define o símbolo de linker entry.
Esse recurso não foi incorporado ao GNU make porque dar ao make conhecimento do formato interno das tabelas de símbolos dos arquivos de arquivo prejudicaria a modularidade. Consulte Atualizando os diretórios de símbolos de arquivos de arquivo.
Os sufixos (usados em regras de sufixo) que terminam com o caractere ‘~’ têm um significado especial para o make do System V; eles se referem ao arquivo SCCS que corresponde ao arquivo obtido sem o ‘~’. Por exemplo, a regra de sufixo ‘.c~.o’ geraria o arquivo n.o a partir do arquivo SCCS s.n.c. Para uma cobertura completa, é preciso dispor de toda uma série dessas regras de sufixo. Consulte Regras de sufixo antiquadas.
No GNU make, toda essa série de casos é tratada por duas regras de padrão para extração a partir do SCCS, combinadas com o recurso geral de encadeamento de regras. Consulte Cadeias de regras implícitas.
No make do System V e do 4.3 BSD, os arquivos encontrados pela busca VPATH (consulte Busca em diretórios por pré-requisitos (prerequisite)) têm seus nomes alterados dentro das receitas. Consideramos muito mais limpo sempre usar variáveis automáticas, o que torna esse recurso desnecessário.
Em alguns make de Unix, a variável automática $* que aparece nos pré-requisitos de uma regra tem o “recurso” surpreendentemente estranho de se expandir para o nome completo do alvo daquela regra. Não conseguimos imaginar o que se passava na cabeça dos desenvolvedores do make de Unix para fazerem isso; é totalmente incoerente com a definição normal de $*.
Em alguns make de Unix, a busca por regras implícitas (consulte Usando regras implícitas) é aparentemente feita para todos os alvos, e não apenas para aqueles sem receita. Isso significa que é possível escrever:
foo.o:
cc -c foo.c
e o make de Unix vai deduzir, por conta própria, que foo.o depende de foo.c.
Consideramos esse tipo de uso defeituoso. As propriedades de pré-requisito do make são bem definidas (pelo menos no GNU make), e fazer algo assim simplesmente não se encaixa no modelo.
O GNU make não inclui nenhuma regra implícita embutida para compilar ou pré-processar programas EFL. Se soubermos de alguém que esteja usando EFL, teremos prazer em adicioná-las.
Parece que no make do SVR4 uma regra de sufixo pode ser especificada sem receita, sendo tratada como se tivesse uma receita vazia (consulte Usando receitas vazias). Por exemplo, ao escrever:
.c.a:
é possível sobrepor a regra de sufixo .c.a embutida.
Consideramos mais limpo que uma regra sem receita simplesmente acrescente à lista de pré-requisitos do alvo. Para obter no GNU make o mesmo comportamento do exemplo acima, basta reescrevê-lo assim:
.c.a: ;
Algumas versões do make invocam o shell com o sinalizador ‘-e’, exceto sob ‘-k’ (consulte Testando a compilação de um programa). O sinalizador ‘-e’ instrui o shell a encerrar assim que qualquer programa executado por ele retorne um status diferente de zero. Consideramos mais limpo escrever cada linha da receita de modo que ela se sustente por si só, sem exigir esse tratamento especial.