Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

People also ask

What does backslash do in makefile?

Special characters in a makefile In macros, a backslash ( \ ) followed by a newline character is replaced by a space. In commands, a percent symbol ( % ) is a file specifier. To represent % literally in a command, specify a double percent sign ( %% ) in place of a single one.

How do you comment multiple lines in makefile?

' # ' in a line of a makefile starts a comment. It and the rest of the line are ignored, except that a trailing backslash not escaped by another backslash will continue the comment across multiple lines.

How do I use Ifdef in makefile?

The ifdef directive begins the conditional, and specifies the condition. It contains single argument. If the given argument is true then condition becomes true. The ifndef directive begins the conditional, and specifies the condition.

What is .oneshell in makefile?

ONESHELL is mentioned as a target, then when a target is built all lines of the recipe will be given to a single invocation of the shell rather than each line being invoked separately (*note Recipe Execution: Execution.). So, a makefile, like: .ONESHELL : all :: echo 'foo bar'


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 +.)


@ 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".