mirror of
https://salsa.debian.org/srivasta/make-dfsg.git
synced 2025-02-06 20:42:58 +00:00
(Overriding Makefiles): Don't suggest using .DEFAULT; that loses if the
target file exists. Instead recommend the combination of a match-anything rule and a force target.
This commit is contained in:
parent
e83c7d40cd
commit
c25db14264
1 changed files with 17 additions and 9 deletions
26
make.texinfo
26
make.texinfo
|
@ -1247,13 +1247,12 @@ include one in the other, and add more targets or variable definitions.
|
|||
However, if the two makefiles give different commands for the same
|
||||
target, @code{make} will not let you just do this. But there is another way.
|
||||
|
||||
@cindex @code{.DEFAULT}, used to override
|
||||
@cindex match-anything rule, used to override
|
||||
In the containing makefile (the one that wants to include the other),
|
||||
you can use the @code{.DEFAULT} special target to say that to remake
|
||||
any target that cannot be made from the information in the containing
|
||||
makefile, @code{make} should look in another makefile.
|
||||
@xref{Last Resort, , Defining Last-Resort Default Rules},
|
||||
for more information on @code{.DEFAULT}.
|
||||
you can use a match-anything pattern rule to say that to remake any
|
||||
target that cannot be made from the information in the containing
|
||||
makefile, @code{make} should look in another makefile.
|
||||
@xref{Pattern Rules}, for more information on pattern rules.
|
||||
|
||||
For example, if you have a makefile called @file{Makefile} that says how
|
||||
to make the target @samp{foo} (and other targets), you can write a
|
||||
|
@ -1263,18 +1262,27 @@ makefile called @file{GNUmakefile} that contains:
|
|||
foo:
|
||||
frobnicate > foo
|
||||
|
||||
.DEFAULT:
|
||||
%: force
|
||||
@@$(MAKE) -f Makefile $@@
|
||||
force: ;
|
||||
@end example
|
||||
|
||||
If you say @samp{make foo}, @code{make} will find @file{GNUmakefile},
|
||||
read it, and see that to make @file{foo}, it needs to run the command
|
||||
@samp{frobnicate > foo}. If you say @samp{make bar}, @code{make} will
|
||||
find no way to make @file{bar} in @file{GNUmakefile}, so it will use the
|
||||
commands from @code{.DEFAULT}: @samp{make -f Makefile bar}. If
|
||||
commands from the pattern rule: @samp{make -f Makefile bar}. If
|
||||
@file{Makefile} provides a rule for updating @file{bar}, @code{make}
|
||||
will apply the rule. And likewise for any other target that
|
||||
@file{GNUmakefile} does not say how to make.@refill
|
||||
@file{GNUmakefile} does not say how to make.
|
||||
|
||||
The way this works is that the pattern rule has a pattern of just
|
||||
@samp{%}, so it matches any target whatever. The rule specifies a
|
||||
dependency @file{force}, to guarantee that the commands will be run even
|
||||
if the target file already exists. We give @file{force} target empty
|
||||
commands to prevent @code{make} from searching for an implicit rule to
|
||||
build it---otherwise it would apply the same match-anything rule to
|
||||
@file{force} itself and create a dependency loop!
|
||||
|
||||
@node Rules, Commands, Makefiles, Top
|
||||
@chapter Writing Rules
|
||||
|
|
Loading…
Reference in a new issue