Makefiles have the unusual property that there are really two distinct
syntaxes in one file. Most of the makefile uses
(see Writing Makefiles). However, commands are meant to be
interpreted by the shell and so they are written using shell syntax.
make program does not try to understand shell syntax: it
performs only a very few specific translations on the content of the
command before handing it to the shell.
Each command line must start with a tab, except that the first command 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 a command line for that rule. Blank lines and lines of just comments may appear among the command 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 a command line and be passed to the shell.