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


¿Qué hace lo siguiente en un Makefile?

rule: $(deps)
    @:

Parece que no puedo encontrar esto en el manual make.

Author: cdwilson, 2011-12-23

2 answers

Significa "no hacer eco de este comando en la salida."Así que esta regla está diciendo" ejecutar el comando shell : y no hacer eco de la salida.

Por supuesto, el comando shell : es un no-op, así que esto está diciendo "no hagas nada, y no digas."

por Qué?

El truco aquí es que tienes una oscura combinación de dos sintaxis diferentes. La sintaxis make(1) es el uso de una acción que comienza con @, que simplemente no hace eco al 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, incluyendo :. Bash help explica esto así como en cualquier lugar:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
 144
Author: Charlie Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-22 23:50:33

Para aquellos curiosos acerca de por qué podrías hacer esto, es útil si quieres fingir que algo se hizo, para que Make no genere "Nada que hacer por" tu objetivo.

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

Por ejemplo (de scripts/Makefile de Linux.limpio):

__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
Author: Guestolio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-29 16:04:58