Next: Variables/Recursion, Previous: Recursion, Up: Recursion
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. This special feature
is only enabled if the MAKE
variable appears directly in the
command script: 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 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.