Node:MAKE Variable, Next:Variables/Recursion, Previous:Recursion, Up:Recursion

#### How the `MAKE` Variable Works

Recursive `make` commands should always use the variable `MAKE`, not the explicit command name `make`, as shown here:

         subsystem:
                 cd subdir && $(MAKE)

The value of this variable is the file name with which `make` was invoked. If this file name was `/bin/make`, then the command executed is `cd subdir && /bin/make`. If you use a special version of `make` to run the top-level makefile, the same special version will be executed for recursive invocations.

As a special feature, using the variable `MAKE` in the commands of a rule alters the effects of the `-t` (`--touch`), `-n` (`--just-print`), or `-q` (`--question`) option. Using the `MAKE` variable has the same effect as using a `+` character at the beginning of the command line. See Instead of Executing the Commands.

Consider the command `make -t` in the above example. (The `-t` option marks targets as up to date without actually running any commands; see Instead of Execution.) Following the usual definition of `-t`, a `make -t` command in the example would create a file named `subsystem` and do nothing else. What you really want it to do is run `cd subdir && make -t`; but that would require executing the command, and `-t` says not to execute commands.

The special feature makes this do what you want: whenever a command line of a rule contains the variable `MAKE`, the flags `-t`, `-n` and `-q` do not apply to that line. Command lines containing `MAKE` are executed normally despite the presence of a flag that causes most commands not to be run. The usual `MAKEFLAGS` mechanism passes the flags to the sub-`make` (see Communicating Options to a Sub-`make`), so your request to touch the files, or print the commands, is propagated to the subsystem.