La funzione del file in makefile accetta arg con il prefisso '@'


10

Questo estratto di codice è tratto dal capitolo 8.6 del manuale del makefile di GNU.

Cosa significa @ $ @. In per la funzione file arg in un makefile? e perché i comandi di shell come rm hanno come prefisso il simbolo '@'

program: $(OBJECTS)
     $(file >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

La sintassi della funzione file è

$(file op filename[,text])
make 

Risposte:


9

Ci sono tre usi non correlati di @qui.

In $@, il carattere @è il nome di una variabile automatica che può essere utilizzata in una regola. Il valore di quella variabile è l'obiettivo che la regola sta costruendo.

Quando @viene usato all'inizio di una riga di ricetta (comando), subito dopo il carattere di tabulazione, fa sì che il comando non venga stampato quando sta per essere eseguito.

Il personaggio @altrove non è speciale.

Quindi, nel tuo esempio, per costruire program:

  1. La filefunzione è invocata. Scrive le dipendenze della destinazione ( $^variabile automatica) nel file program.in.
  2. Qualunque comando sia memorizzato nella variabile CMDviene eseguito, con i parametri memorizzati nella variabile CMDFLAGS, oltre al parametro aggiuntivo @program.in. Ciò che fa dipende da ciò che CMDè.

  3. Il comando rm program.inviene eseguito, senza prima stamparlo.

Alcuni comandi trattano un parametro che inizia @come un file dal quale leggere più parametri. Questa è una convenzione DOS nata perché DOS aveva un limite rigoroso sulla lunghezza della riga di comando e non c'era modo di interpolare l'output di un comando in una riga di comando. È raro nel mondo Unix poiché Unix non ha questi limiti. L'effetto della ricetta è quindi probabilmente lo stesso di

$(CMD) $(CMDFLAGS) $(OBJECTS)

2

@ prefisso in linea sopprime l' eco della linea.

Per impostazione predefinita, makestampa ogni riga Makefileprima che venga eseguita. Quando le linee iniziano con @, quelle linee non verranno stampate.

Senza @:

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

Con @:

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

Una nota che solo @all'inizio della riga causa la soppressione dell'eco . >$@.ino @$@.insono solo stringhe normali e $@in essa verranno espanse:

$ cat hello
hello:
    @echo @$@.in
$make hello
@hello.in

questa risposta non dice, perché >$@.inviene utilizzata come modalità file ... ma è utile a modo suo .. grazie grazie ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.