A função de arquivo no makefile usa args prefixados pelo símbolo '@'

10

Este trecho de código é do capítulo 8.6 do manual de makefile do GNU.

O que @ $ @. In para a função de arquivo arg em um makefile significa? e por que comandos de shell como rm são prefixados pelo símbolo '@'

program: $(OBJECTS)
     $(file >[email protected],$^)
     $(CMD) $(CMDFLAGS) @[email protected]
     @rm [email protected]

A sintaxe da função de arquivo é

$(file op filename[,text])

fonte

Respostas:

9

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:

  1. A filefunção é chamada. Ele grava as dependências do destino ( $^variável automática) no arquivo program.in.
  2. 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é.

  3. 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)
Gilles 'SO- parar de ser mau'
fonte
2

@ prefixo na linha suprime o eco da linha.

Por padrão, makeimprime cada linha Makefileantes de ser executada. Quando as linhas começam @, essas linhas não serão impressas.

Sem @:

$ cat > Makefile
hello:                                                                          
    echo hello world
$ make hello
echo hello world
hello world

Com @:

$ cat > Makefile
hello:                                                                          
    @echo hello world
$ make hello
hello world

Uma observação que somente @no início da linha causa eco na supressão . >[email protected]ou @[email protected]são apenas strings normais, e $@nele será expandido:

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in
cuonglm
fonte
esta resposta não diz, por que >[email protected]é usado como um modo de arquivo ... mas é útil em sua própria maneira .. obrigado cuonglm ...