make commands should always use the variable
not the explicit command name ‘make’, as shown here:
subsystem: cd subdir && $(MAKE)
The value of this variable is the file name with which
invoked. If this file name was /bin/make, then the recipe 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 recipe of
a rule alters the effects of the ‘-t’ (‘--touch’), ‘-n’
(‘--just-print’), or ‘-q’ (‘--question’) option.
MAKE variable has the same effect as using a ‘+’
character at the beginning of the recipe line. See Instead of Executing the Recipes. This special feature
is only enabled if the
MAKE variable appears directly in the
recipe: it does not apply if the
MAKE variable is referenced
through expansion of another variable. In the latter case you must
use the ‘+’ token to get these special effects.
Consider the command ‘make -t’ in the above example. (The ‘-t’ option marks targets as up to date without actually running any recipes; 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 recipe, and ‘-t’ says not to execute recipes.
The special feature makes this do what you want: whenever a recipe
line of a rule contains the variable
MAKE, the flags ‘-t’,
‘-n’ and ‘-q’ do not apply to that line. Recipe lines
MAKE are executed normally despite the presence of a
flag that causes most recipes not to be run. The usual
MAKEFLAGS mechanism passes the flags to the sub-
(see Communicating Options to a
make), so your request to touch the files, or print the
recipes, is propagated to the subsystem.