2011-12-22 18 views

risposta

120

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

Ovviamente il comando shell : è un no-op, quindi questo è dire" non fare niente e non dirlo ".

Perché?

il trucco è che hai un oscuro combinazione di due sintassi differenti. il make (1) sintassi è l'uso di un'azione inizia con @, che è semplicemente non per echeggiare il comando, quindi una regola come

always: 
     @echo this always happens 

non emette

echo this always happens 
    this always happens 

Ora, la parte azione di una regola può essere qualsiasi comando shell, tra cui :. Bash aiuto spiega questo così come da nessuna parte:

$ help : 
:: : 
    Null command. 

    No effect; the command does nothing. 

    Exit Status: 
    Always succeeds. 
+0

grazie, è lì da qualche parte che descrive più in dettaglio? Non sono sicuro di cosa sia l'out-ut. – cdwilson

+9

Non prendere in giro la mia battitura, anche tu sarai vecchio un giorno. –

+0

Grazie, è stato davvero utile! Fino a quando ho letto la tua risposta, stavo pensando che '@:' era un divertente makeism (non avevo capito che era una combinazione di due cose ...) – cdwilson

28

Per quelli curiosi di sapere il motivo per cui si potrebbe fare questo, è utile se si desidera far finta come se qualcosa è stato fatto, in modo che la rendono non emette "Niente di essere fatto per "il tuo obiettivo.

Un esempio è se si dispone di una destinazione fasulla che si esegue sempre, e in essa si dispone di un gruppo di condizionali nel comando. Vuoi avere almeno qualcosa nel caso in cui quelle condizioni si rivelino false e non viene fatto nulla.

Per esempio (da 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 
    @: 
+0

Ah ah, ecco fatto! –

Problemi correlati