Next: Filename Functions Prev: Syntax of Functions Up: Functions
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.
`%' 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 (*note Substitution References:
Substitution Refs.) 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
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'.
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 (Note: Conditionals.).
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 `ifneq' 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.
Note: Testing Flags, for a practical application of `findstring'.
Removes all whitespace-separated words in TEXT that do *not* match
any of the PATTERN words, returning only matching words. The
patterns are written using `%', just like the patterns used in the
`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
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.
Removes all whitespace-separated words in TEXT that *do* match the
PATTERN words, returning only the words that *do not* match. This
is the exact opposite of the `filter' function.
For example, given:
objects=main1.o foo.o main2.o bar.o
the following generates a list which contains all the object files
not in `mains':
Sorts the words of LIST in lexical order, removing duplicate
words. The output is a list of words separated by single spaces.
$(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.
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 dependency files (*note
`VPATH' Search Path for All Dependencies: General Search.). 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,
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 (*note The `override' Directive:
automatically generated by info2www