it-swarm-es.tech

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

¿Qué hace lo siguiente en un Makefile?

rule: $(deps)
    @:

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

130
cdwilson

Significa "no haga eco de este comando en la salida". Así que esta regla dice "ejecute el comando de Shell : y no haga eco de la salida.

Por supuesto, el comando de Shell : es un no-op, así que esto dice "no hagas nada y no digas nada".

¿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 es simplemente no hacer eco del comando. Así que 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.
168
Charlie Martin

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

Un ejemplo es si tiene un objetivo falso que siempre ejecuta, y en él tiene un montón de condicionales en el comando. Desea tener al menos algo en caso de que esas condiciones surjan como 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
    @:
31
Guestolio