make: Shell Function

 
 8.13 The 'shell' Function
 =========================
 
 The 'shell' function is unlike any other function other than the
 'wildcard' function (SeeThe 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 (SeeHow '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 (SeeThe 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).