Existem três usos não relacionados @aqui.
Em $@, o caractere @é o nome de uma variável automática que pode ser usada em uma regra. O valor dessa variável é o destino que a regra está construindo.
Quando @é usado no início de uma linha de receita (comando), logo após o caractere de tabulação, faz com que o comando não seja impresso quando estiver prestes a ser executado.
O personagem em @outro lugar não é especial.
Assim, no seu exemplo, para criar program:
- A
filefunção é chamada. Ele grava as dependências do destino ( $^variável automática) no arquivo program.in.
Qualquer comando armazenado na variável CMDé executado, com os parâmetros armazenados na variável CMDFLAGS, mais o parâmetro extra @program.in. O que isso faz depende do que CMDé.
O comando rm program.iné executado, sem imprimi-lo primeiro.
Alguns comandos tratam um parâmetro começando com @como indicando um arquivo para ler mais parâmetros. Essa é uma convenção do DOS que surgiu porque o DOS tinha um limite estrito no comprimento da linha de comando e não havia como interpolar a saída de um comando em uma linha de comando. É incomum no mundo Unix, pois o Unix não possui essas limitações. O efeito da receita é provavelmente o mesmo que
$(CMD) $(CMDFLAGS) $(OBJECTS)
>$@.iné usado como um modo de arquivo ... mas é útil em sua própria maneira .. obrigado cuonglm ...