Existem três usos não relacionados de @ aqui.
Em $@ , o caractere @ é o nome de uma variável automática que pode ser usado em uma regra. O valor dessa variável é o destino que a regra está criando.
Quando @ é usado no início de uma linha de receita (comando), logo após o caractere de tabulação, ele faz com que o comando a não ser impresso quando estiver prestes a ser executado.
O caractere @ em outro lugar não é especial.
Assim, no seu exemplo, para criar program :
- O
filefunction é invocado. Ele grava as dependências do destino ($^automatic variable) no arquivoprogram.in. -
Qualquer comando armazenado na variável
CMDé executado, com os parâmetros armazenados na variávelCMDFLAGS, mais o parâmetro extra@program.in. O que isso faz depende de qualCMDé. -
O comando
rm program.iné executado, sem ser impresso primeiro.
Alguns comandos tratam um parâmetro que começa com @ , indicando um arquivo do qual ler mais parâmetros. Esta é uma convenção do DOS que surgiu porque o DOS tinha um limite rigoroso no comprimento da linha de comando e nenhuma maneira de interpolar a saída de um comando em uma linha de comando. É incomum no mundo Unix, já que o Unix não tem essas limitações. O efeito da receita é, portanto, provavelmente o mesmo que
$(CMD) $(CMDFLAGS) $(OBJECTS)