make: Shell Function
8.13 The 'shell' Function
=========================
The 'shell' function is unlike any other function other than the
'wildcard' function (The Function 'wildcard' Wildcard Function.)
in that it communicates with the world outside of 'make'.
The 'shell' function performs the same function that backquotes ('`')
perform in most shells: it does "command expansion". This means that it
takes as an argument a shell command and evaluates to the output of the
command. The only processing 'make' does on the result is to convert
each newline (or carriage-return / newline pair) to a single space. If
there is a trailing (carriage-return and) newline it will simply be
removed.
The commands run by calls to the 'shell' function are run when the
function calls are expanded (How 'make' Reads a Makefile Reading
Makefiles.). Because this function involves spawning a new shell, you
should carefully consider the performance implications of using the
'shell' function within recursively expanded variables vs. simply
expanded variables (The Two Flavors of Variables Flavors.).
After the 'shell' function or '!=' assignment operator is used, its
exit status is placed in the '.SHELLSTATUS' variable.
Here are some examples of the use of the 'shell' function:
contents := $(shell cat foo)
sets 'contents' to the contents of the file 'foo', with a space (rather
than a newline) separating each line.
files := $(shell echo *.c)
sets 'files' to the expansion of '*.c'. Unless 'make' is using a very
strange shell, this has the same result as '$(wildcard *.c)' (as long as
at least one '.c' file exists).