What do @, - and + do as prefixes to recipe lines in Make?

MakefileGnu Make

Makefile Problem Overview


In the GNU Makefile manual, it mentions these prefixes.

> If .ONESHELL is provided, then only the first line of the recipe will be checked for the special prefix characters (‘@’, ‘-’, and ‘+’).

What do these prefixes do, and where are they mentioned?

Makefile Solutions


Solution 1 - Makefile

They control the behaviour of make for the tagged command lines:

  • @ suppresses the normal 'echo' of the command that is executed.

  • - means ignore the exit status of the command that is executed (normally, a non-zero exit status would stop that part of the build).

  • + means 'execute this command under make -n' (or 'make -t' or 'make -q') when commands are not normally executed. See also the POSIX specification for make and also §9.3 of the GNU Make manual.

The + notation is a (POSIX-standardized) generalization of the de facto (non-standardized) mechanism whereby a command line containing ${MAKE} or $(MAKE) is executed under make -n.

(@ is discussed in §5.2 of the GNU Make manual; - is described in §5.5; and §5.7.1 mentions the use of +.)

Solution 2 - Makefile

@ prevents the command line from echoing out to the console. You can do it globally with -s or --keep-silent

- tells make to keep going, even if the command fails for some reason. You can do it globally via the -i flag (or --ignore-errors).

+ I was not familar with before you asked. As near as I can tell, it negates the effect of -n, -t, and -q, all of which basically tell make to not actually run the commands. So a line with a + at the front would get run anyway.

If you read the official Gnu Make manual, they are all mentioned in Chapter 5. In my old copy of the manual that was the chapter on "commands", but term du jour now seems to be "recipes".

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
QuestionMatt JoinerView Question on Stackoverflow
Solution 1 - MakefileJonathan LefflerView Answer on Stackoverflow
Solution 2 - MakefileT.E.D.View Answer on Stackoverflow