10.1 Using Implicit Rules
To allow make
to find a customary method for updating a target file,
all you have to do is refrain from specifying commands yourself. Either
write a rule with no command lines, or don't write a rule at all. Then
make
will figure out which implicit rule to use based on which
kind of source file exists or can be made.
For example, suppose the makefile looks like this:
| foo : foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
|
Because you mention `foo.o' but do not give a rule for it, make
will automatically look for an implicit rule that tells how to update it.
This happens whether or not the file `foo.o' currently exists.
If an implicit rule is found, it can supply both commands and one or
more prerequisites (the source files). You would want to write a rule
for `foo.o' with no command lines if you need to specify additional
prerequisites, such as header files, that the implicit rule cannot
supply.
Each implicit rule has a target pattern and prerequisite patterns. There may
be many implicit rules with the same target pattern. For example, numerous
rules make `.o' files: one, from a `.c' file with the C compiler;
another, from a `.p' file with the Pascal compiler; and so on. The rule
that actually applies is the one whose prerequisites exist or can be made.
So, if you have a file `foo.c', make
will run the C compiler;
otherwise, if you have a file `foo.p', make
will run the Pascal
compiler; and so on.
Of course, when you write the makefile, you know which implicit rule you
want make
to use, and you know it will choose that one because you
know which possible prerequisite files are supposed to exist.
See section Catalogue of Implicit Rules,
for a catalogue of all the predefined implicit rules.
Above, we said an implicit rule applies if the required prerequisites "exist
or can be made". A file "can be made" if it is mentioned explicitly in
the makefile as a target or a prerequisite, or if an implicit rule can be
recursively found for how to make it. When an implicit prerequisite is the
result of another implicit rule, we say that chaining is occurring.
See section Chains of Implicit Rules.
In general, make
searches for an implicit rule for each target, and
for each double-colon rule, that has no commands. A file that is mentioned
only as a prerequisite is considered a target whose rule specifies nothing,
so implicit rule search happens for it. See section Implicit Rule Search Algorithm, for the
details of how the search is done.
Note that explicit prerequisites do not influence implicit rule search.
For example, consider this explicit rule:
The prerequisite on `foo.p' does not necessarily mean that
make
will remake `foo.o' according to the implicit rule to
make an object file, a `.o' file, from a Pascal source file, a
`.p' file. For example, if `foo.c' also exists, the implicit
rule to make an object file from a C source file is used instead,
because it appears before the Pascal rule in the list of predefined
implicit rules (see section Catalogue of Implicit Rules).
If you do not want an implicit rule to be used for a target that has no
commands, you can give that target empty commands by writing a semicolon
(see section Defining Empty Commands).