Next: Static versus Implicit Up: Static Pattern
Syntax of Static Pattern Rules
Here is the syntax of a static pattern rule:
TARGETS ...: TARGET-PATTERN: DEP-PATTERNS ...
The TARGETS list specifies the targets that the rule applies to. The
targets can contain wildcard characters, just like the targets of
ordinary rules (*note Using Wildcard Characters in File Names:
The TARGET-PATTERN and DEP-PATTERNS say how to compute the
dependencies of each target. Each target is matched against the
TARGET-PATTERN to extract a part of the target name, called the "stem".
This stem is substituted into each of the DEP-PATTERNS to make the
dependency names (one from each DEP-PATTERN).
Each pattern normally contains the character `%' just once. When the
TARGET-PATTERN matches a target, the `%' can match any part of the
target name; this part is called the "stem". The rest of the pattern
must match exactly. For example, the target `foo.o' matches the
pattern `%.o', with `foo' as the stem. The targets `foo.c' and
`foo.out' do not match that pattern.
The dependency names for each target are made by substituting the
stem for the `%' in each dependency pattern. For example, if one
dependency pattern is `%.c', then substitution of the stem `foo' gives
the dependency name `foo.c'. It is legitimate to write a dependency
pattern that does not contain `%'; then this dependency is the same for
`%' characters in pattern rules 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 to 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.
Here is an example, which compiles each of `foo.o' and `bar.o' from
the corresponding `.c' file:
objects = foo.o bar.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
Here `$<' is the automatic variable that holds the name of the
dependency and `$@' is the automatic variable that holds the name of
the target; see Note: Automatic Variables.
Each target specified must match the target pattern; a warning is
issued for each target that does not. If you have a list of files,
only some of which will match the pattern, you can use the `filter'
function to remove nonmatching file names (Note: Functions for String
Substitution and Analysis.):
files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<
In this example the result of `$(filter %.o,$(files))' is `bar.o
lose.o', and the first static pattern rule causes each of these object
files to be updated by compiling the corresponding C source file. The
result of `$(filter %.elc,$(files))' is `foo.elc', so that file is made
Another example shows how to use `$*' in static pattern rules:
bigoutput littleoutput : %output : text.g
generate text.g -$* > $@
When the `generate' command is run, `$*' will expand to the stem,
either `big' or `little'.
automatically generated by info2www