8.2 Functions for String Substitution and Analysis
Here are some functions that operate on strings:
Performs a textual replacement on the text text: each occurrence
of from is replaced by to. The result is substituted for
the function call. For example,
$(subst ee,EE,feet on the street)
substitutes the string `fEEt on the strEEt'.
Finds whitespace-separated words in text that match
pattern and replaces them with replacement. Here
pattern may contain a `%' which acts as a wildcard,
matching any number of any characters within a word. If
replacement also contains a `%', the `%' is replaced
by the text that matched the `%' in pattern. Only the first
`%' in the pattern and replacement is treated this
way; any subsequent `%' is unchanged.
`%' 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
Whitespace between words is folded into single space characters;
leading and trailing whitespace is discarded.
$(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
is equivalent to
The second shorthand simplifies one of the most common uses of
patsubst: replacing the suffix at the end of file names.
is equivalent to
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:
instead of using the general form:
Removes leading and trailing whitespace from string and replaces
each internal sequence of one or more whitespace characters with a
single space. Thus, `$(strip a b c )' results in `a b c'.
strip can be very useful when used in conjunction
with conditionals. When comparing something with the empty string
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:
ifneq "$(needs_made)" ""
all:;@echo 'Nothing to make!'
Replacing the variable reference `$(needs_made)' with the
function call `$(strip $(needs_made))' in the
directive would make it more robust.
Searches in for an occurrence of find. If it occurs, the
value is find; otherwise, the value is empty. You can use this
function in a conditional to test for the presence of a specific
substring in a given string. Thus, the two examples,
$(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
- Returns all whitespace-separated words in text that do match
any of the pattern words, removing any words that do not
match. The patterns are written using `%', just like the patterns
used in the
patsubst function above.
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
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
Returns all whitespace-separated words in text that do not
match any of the pattern words, removing the words that do
match one or more. This is the exact opposite of the
For example, given:
objects=main1.o foo.o main2.o bar.o
the following generates a list which contains all the object files not
- Sorts the words of list in lexical order, removing duplicate
words. The output is a list of words separated by single spaces.
returns the value `bar foo lose'.
sort removes duplicate words, you can use
it for this purpose even if you don't care about the sort order.
Returns the nth word of text. The legitimate values of
n start from 1. If n is bigger than the number of words
in text, the value is empty. For example,
Returns the list of words in text starting with word s and
ending with word e (inclusive). The legitimate values of s
and e start from 1. If s is bigger than the number of words
in text, the value is empty. If e is bigger than the number
of words in text, words up to the end of text are returned.
If s is greater than e, nothing is returned. For example,
$(wordlist 2, 3, foo bar baz)
returns `bar baz'.
Returns the number of words in text.
Thus, the last word of text is
$(word $(words text),text).
The argument names is regarded as a series of names, separated
by whitespace. The value is the first name in the series. The rest
of the names are ignored.
produces the result `foo'. Although
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
patsubst. Suppose that a makefile uses the
to specify a list of directories that
make should search for
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
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:
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
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