| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] | 
Here are some functions that operate on strings:
$(subst from,to,text)
| $(subst ee,EE,feet on the street) | 
substitutes the string `fEEt on the strEEt'.
$(patsubst pattern,replacement,text)
`%' characters in patsubst function invocations can be
quoted with preceding backslashes (`\').  Backslashes that would
otherwise quote `%' characters can be quoted with more backslashes.
Backslashes that quote `%' characters or other backslashes are
removed from the pattern before it is compared file names or has a stem
substituted into it.  Backslashes that are not in danger of quoting
`%' characters go unmolested.  For example, the pattern
`the\%weird\\%pattern\\' has `the%weird\' preceding the
operative `%' character, and `pattern\\' following it.  The
final two backslashes are left alone because they cannot affect any
`%' character.
Whitespace between words is folded into single space characters; leading and trailing whitespace is discarded.
For example,
| $(patsubst %.c,%.o,x.c.c bar.c) | 
produces the value `x.c.o bar.o'.
Substitution references (see section Substitution References) are a simpler way to get the effect of the patsubst
function:
| $(var:pattern=replacement) | 
is equivalent to
| $(patsubst pattern,replacement,$(var)) | 
The second shorthand simplifies one of the most common uses of
patsubst: replacing the suffix at the end of file names.
| $(var:suffix=replacement) | 
is equivalent to
| $(patsubst %suffix,%replacement,$(var)) | 
For example, you might have a list of object files:
| objects = foo.o bar.o baz.o | 
To get the list of corresponding source files, you could simply write:
| $(objects:.o=.c) | 
instead of using the general form:
| $(patsubst %.o,%.c,$(objects)) | 
$(strip string)
The function strip can be very useful when used in conjunction
with conditionals.  When comparing something with the empty string
`' using ifeq or ifneq, you usually want a string of
just whitespace to match the empty string (see section 7. Conditional Parts of Makefiles).
Thus, the following may fail to have the desired results:
| .PHONY: all ifneq "$(needs_made)" "" all: $(needs_made) else all:;@echo 'Nothing to make!' endif | 
Replacing the variable reference `$(needs_made)' with the
function call `$(strip $(needs_made))' in the ifneq
directive would make it more robust.
$(findstring find,in)
| $(findstring a,a b c) $(findstring a,b c) | 
produce the values `a' and `' (the empty string),
respectively.  See section 7.3 Conditionals that Test Flags, for a practical application of
findstring.
$(filter pattern...,text)
patsubst function above.
The filter function can be used to separate out different types
of strings (such as file names) in a variable.  For example:
| sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
        cc $(filter %.c %.s,$(sources)) -o foo
 | 
says that `foo' depends of `foo.c', `bar.c', `baz.s' and `ugh.h' but only `foo.c', `bar.c' and `baz.s' should be specified in the command to the compiler.
$(filter-out pattern...,text)
filter
function.For example, given:
| objects=main1.o foo.o main2.o bar.o mains=main1.o main2.o | 
the following generates a list which contains all the object files not in `mains':
| $(filter-out $(mains),$(objects)) | 
$(sort list)
| $(sort foo bar lose) | 
returns the value `bar foo lose'.
Incidentally, since sort removes duplicate words, you can use
it for this purpose even if you don't care about the sort order.
$(word n,text)
| $(word 2, foo bar baz) | 
returns `bar'.
$(wordlist s,e,text)
| $(wordlist 2, 3, foo bar baz) | 
returns `bar baz'.
$(words text)
$(word $(words text),text).
$(firstword names...)
For example,
| $(firstword foo bar) | 
produces the result `foo'.  Although $(firstword
text) is the same as $(word 1,text), the
firstword function is retained for its simplicity.
Here is a realistic example of the use of subst and
patsubst.  Suppose that a makefile uses the VPATH variable
to specify a list of directories that make should search for
prerequisite files
(see section VPATH Search Path for All Prerequisites).
This example shows how to
tell the C compiler to search for header files in the same list of
directories.
The value of VPATH is a list of directories separated by colons,
such as `src:../headers'.  First, the subst function is used to
change the colons to spaces:
| $(subst :, ,$(VPATH)) | 
This produces `src ../headers'.  Then patsubst is used to turn
each directory name into a `-I' flag.  These can be added to the
value of the variable CFLAGS, which is passed automatically to the C
compiler, like this:
| override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) | 
The effect is to append the text `-Isrc -I../headers' to the
previously given value of CFLAGS.  The override directive is
used so that the new value is assigned even if the previous value of
CFLAGS was specified with a command argument (see section The override Directive).
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |