What does @: (at symbol colon) mean in a Makefile?

MakefileGnu Make

Makefile Problem Overview


What does the following do in a Makefile?

rule: $(deps)
    @:

I can't seem to find this in the make manual.

Makefile Solutions


Solution 1 - Makefile

It means "don't echo this command on the output." So this rule is saying "execute the shell command : and don't echo the output.

Of course the shell command : is a no-op, so this is saying "do nothing, and don't tell."

Why?

The trick here is that you've got an obscure combination of two different syntaxes. The make(1) syntax is the use of an action starting with @, which is simply not to echo the command. So a rule like

always:
       @echo this always happens

won't emit

   echo this always happens
   this always happens

Now, the action part of a rule can be any shell command, including :. Bash help explains this as well as anywhere:

$ help :
:: :
    Null command.
    
    No effect; the command does nothing.
    
    Exit Status:
    Always succeeds.

Solution 2 - Makefile

For those curious about why you might do this, it is useful if you want to pretend like something was done, so that Make doesn't output "Nothing to be done for" your target.

One example is if you have a phony target that you always execute, and in it you have a bunch of conditionals in the command. You want to have at least something in case those conditions come up false and nothing gets done.

For example (from Linux's scripts/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
    @:

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncdwilsonView Question on Stackoverflow
Solution 1 - MakefileCharlie MartinView Answer on Stackoverflow
Solution 2 - MakefileGuestolioView Answer on Stackoverflow