Cosa significa @: (in due punti) in un Makefile?


155

Cosa fa quanto segue in un Makefile?

rule: $(deps)
    @:

Non riesco a trovarlo nel manuale di creazione.

Risposte:


206

Significa "non fare eco a questo comando sull'output". Quindi questa regola dice "esegui il comando shell :e non fare eco all'output.

Ovviamente il comando shell :è no-op, quindi questo sta dicendo "non fare nulla e non dirlo".

Perché?

Il trucco qui è che hai una combinazione oscura di due diverse sintassi. La sintassi di make (1) è l'uso di un'azione che inizia con @, che semplicemente non fa eco al comando. Quindi una regola come

always:
       @echo this always happens

non emetterà

   echo this always happens
   this always happens

Ora, la parte azione di una regola può essere qualsiasi comando shell, incluso :. Bash help spiega questo e ovunque:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

21
Non prendere in giro la mia battitura a macchina, un giorno sarai vecchio anche tu.
Charlie Martin,

4
Questa è una spiegazione eccellente di ciò che fa, ma sai per caso perché lo faresti in un makefile?
Charles Keepax,

8
Non il più nebuloso.
Charlie Martin,

2
Può essere utile nei makefile che chiamano molti programmi esterni e dove vuoi usare molto l'eco per renderlo bello, come questo
dwcoder

1
@ charles-keepax se lo stai chiedendo specificamente in riferimento a @:(non solo @), oltre alla risposta di @ guestolio potrebbe anche essere uno stub avanzato dallo sviluppo. È come scrivere una funzione in Python che contiene solo pass. Può essere utile per stubbing blocchi di codice per copia / incolla, ma generalmente non dovrebbero esistere a lungo. In questo modo il file verrebbe comunque compilato, superato la sfilacciatura, ecc.
boweeb

40

Per coloro che sono curiosi di sapere perché potresti farlo, è utile se vuoi far finta che qualcosa sia stato fatto, in modo che Make non produca "Nulla da fare per" il tuo obiettivo.

Un esempio è se hai un obiettivo falso che esegui sempre e in esso hai un sacco di condizionali nel comando. Volete avere almeno qualcosa nel caso in cui tali condizioni risultino false e nulla venga fatto.

Ad esempio (dagli script di Linux / Makefile.clean):

__clean: $(subdir-ymn)
ifneq ($(strip $(__clean-files)),)
    +$(call cmd,clean)
endif
ifneq ($(strip $(__clean-dirs)),)
    +$(call cmd,cleandir)
endif
ifneq ($(strip $(clean-rule)),)
    +$(clean-rule)
endif
    @:
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.