Node:Archive Update, Next:Archive Pitfalls, Previous:Archive Members, Up:Archives

### 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 Chains of Implicit Rules.

Implicit rules such as this one are written using the automatic variable `$%`. See 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:

         ar r foo.a dir/file.o

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.