Next: Comments in Make Rules, Previous: The Make Macro MAKEFLAGS, Up: Portable Make
SHELL
Posix-compliant make internally uses the $(SHELL)
macro to spawn shell processes and execute Make rules. This
is a builtin macro supplied by make, but it can be modified
by a makefile or by a command-line argument.
Not all make implementations define this SHELL
macro.
Tru64
make is an example; this implementation always uses
/bin/sh
. So it's a good idea to always define SHELL
in
your makefiles. If you use Autoconf, do
SHELL = @SHELL@
Do not force SHELL = /bin/sh
because that is not correct
everywhere. For instance DJGPP lacks /bin/sh
, and when
its GNU make
port sees such a setting it enters a special
emulation mode where features like pipes and redirections are emulated
on top of DOS's command.com. Unfortunately this emulation is
incomplete; for instance it does not handle command substitutions.
On DJGPP SHELL
should point to Bash.
Posix-compliant make should never acquire the value of
$(SHELL) from the environment, even when make -e
is used
(otherwise, think about what would happen to your rules if
SHELL=/bin/tcsh
).
However not all make implementations have this exception.
For instance it's not surprising that Tru64 make doesn't
protect SHELL
, since it doesn't use it.
$ cat Makefile SHELL = /bin/sh FOO = foo all: @echo $(SHELL) @echo $(FOO) $ env SHELL=/bin/tcsh FOO=bar make -e # Tru64 Make /bin/tcsh bar $ env SHELL=/bin/tcsh FOO=bar gmake -e # GNU make /bin/sh bar