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
file
function é 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)