Makefiles have the unusual property that there are really two distinct
syntaxes in one file. Most of the makefile uses
(see Writing Makefiles). However, recipes are meant
to be interpreted by the shell and so they are written using shell
make program does not try to understand shell
syntax: it performs only a very few specific translations on the
content of the recipe before handing it to the shell.
Each line in the recipe must start with a tab (or the first character
in the value of the
.RECIPEPREFIX variable; see Special Variables), except that the first recipe line may be attached to the
target-and-prerequisites line with a semicolon in between. Any
line in the makefile that begins with a tab and appears in a “rule
context” (that is, after a rule has been started until another rule
or variable definition) will be considered part of a recipe for that
rule. Blank lines and lines of just comments may appear among the
recipe lines; they are ignored.
Some consequences of these rules include:
makecomment; it will be passed to the shell as-is. Whether the shell treats it as a comment or not depends on your shell.
makevariable definition, and passed to the shell.
ifeq, etc. see Syntax of Conditionals) in a “rule context” which is indented by a tab as the first character on the line, will be considered part of a recipe and be passed to the shell.