A função File no makefile recebe argumentos prefixados pelo símbolo '@'

8

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

O que significa @ $ @. in para função de arquivo arg em um arquivo makefile? e por que os comandos shell como rm 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])
    
por Madhavan Kumar 24.03.2015 / 17:07

2 respostas

8

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 :

  1. O file function é invocado. Ele grava as dependências do destino ( $^ automatic variable) 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 de qual CMD é.

  3. 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)
    
por 25.03.2015 / 02:14
3

@ prefixo na linha suprimir ecoando da linha.

Por padrão, make imprime cada linha de Makefile antes de ser executada. Quando as linhas começarem com @ , 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 de que apenas @ no início da linha causa a supressão do ecoar . >[email protected] ou @[email protected] são apenas strings normais e $@ serão expandidas:

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in
    
por 24.03.2015 / 17:24

Tags