¿Qué significa @: (en el símbolo de dos puntos) en un Makefile?

155

¿Qué hace lo siguiente en un Makefile?

rule: $(deps)
    @:

Parece que no puedo encontrar esto en el manual de make.

cdwilson
fuente

Respuestas:

206

Significa "no repetir este comando en la salida". Entonces, esta regla dice "ejecutar el comando de shell :y no hacer eco de la salida.

Por supuesto, el comando de shell :no funciona, por lo que esto dice "no hacer nada y no decir".

¿Por qué?

El truco aquí es que tienes una combinación oscura de dos sintaxis diferentes. La sintaxis de make (1) es el uso de una acción que comienza con @, que simplemente no hace eco del comando. Entonces una regla como

always:
       @echo this always happens

no emitirá

   echo this always happens
   this always happens

Ahora, la parte de acción de una regla puede ser cualquier comando de shell, incluido :. La ayuda de Bash explica esto así como en cualquier lugar:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
Charlie Martin
fuente
21
No te burles de mi escritura, serás viejo algún día también.
Charlie Martin
44
Esta es una excelente explicación de lo que esto hace, pero ¿sabe por casualidad por qué haría esto en un archivo MAKE?
Charles Keepax
8
No es el más nebuloso.
Charlie Martin
2
Puede ser útil en archivos MAKE que requieren una gran cantidad de programas externos, y en los que desea utilizar mucho eco para que se vea bien, como este
dwcoder
1
@ charles-keepax si está preguntando específicamente en referencia a @:(no solo @), además de la respuesta de @ guestolio, también podría ser un trozo sobrante del desarrollo. Es como escribir una función en Python que solo contiene pass. Puede ser útil para copiar bloques de código para copiar / pegar, pero generalmente no deberían existir por mucho tiempo. De la brasa de esta manera el archivo todavía compilar, pelusa pase, etc.
boweeb
40

Para aquellos curiosos acerca de por qué podría hacer esto, es útil si quiere fingir que algo se hizo, para que Make no muestre "Nada que hacer por" su objetivo.

Un ejemplo es si tienes un objetivo falso que siempre ejecutas, y en él tienes un montón de condicionales en el comando. Desea tener al menos algo en caso de que esas condiciones sean falsas y no se haga nada.

Por ejemplo (de los scripts de 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
    @:
Guestolio
fuente