11.2 Implicit Rule for Archive Member Targets
Recall that a target that looks like `a(m)' stands for the
member named m in the archive file a.
When make
looks for an implicit rule for such a target, as a special
feature it considers implicit rules that match `(m)', as well as
those that match the actual target `a(m)'.
This causes one special rule whose target is `(%)' to match. This
rule updates the target `a(m)' by copying the file m
into the archive. For example, it will update the archive member target
`foo.a(bar.o)' by copying the file `bar.o' into the
archive `foo.a' as a member named `bar.o'.
When this rule is chained with others, the result is very powerful.
Thus, `make "foo.a(bar.o)"' (the quotes are needed to protect the
`(' and `)' from being interpreted specially by the shell) in
the presence of a file `bar.c' is enough to cause the following
commands to be run, even without a makefile:
| cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o
|
Here make
has envisioned the file `bar.o' as an intermediate
file. See section Chains of Implicit Rules.
Implicit rules such as this one are written using the automatic variable
`$%'. See section Automatic Variables.
An archive member name in an archive cannot contain a directory name, but
it may be useful in a makefile to pretend that it does. If you write an
archive member target `foo.a(dir/file.o)', make
will perform
automatic updating with this command:
which has the effect of copying the file `dir/file.o' into a member
named `file.o'. In connection with such usage, the automatic variables
%D
and %F
may be useful.