grady@fxgrp.fx.com (Steven Grady) (09/26/89)
The make document says that it's illegal to have different commands
for the same target. If you want to include a standard makefile,
but you want to override a particular production, you have to use the
".DEFAULT" mechanism. Well, I set up some makefiles that used this
mechanism. I didn't need to test it until today. I suddenly discovered
that it has problems. For instance:
Makefile:
foo:
@echo moose
.DEFAULT:
@$(MAKE) -f GenericMakefile $@
GenericMakefile:
foo:
@echo foo
bar: foo
@echo bar
Now suppose I say "make foo". OK, fine, the default rule is not
invoked. But if I say "make bar", there is no rule to make bar in
"Makefile", so it invokes the default rule, which not only gets the
standard production for bar, but (since it's a new invocation) gets the
standard production for foo as well. (Also, of course, assuming the
majority of makefiles don't have special cases, make must be invoked an
extra time for every production, which is a problem, since make isn't
all that fast to begin with.) To get the correct behavior out of the
above set of makefiles, it would be necessary to include all the
productions that depend on the special target in the new makefile.
How bad would it be to support an alternate semantics for multiply-
defined targets? Specifically, instead of them being illegal, have
the first (or last) one take precedence. This would allow the above
Makefile to be simply:
foo:
@echo moose
include GenericMakefile
The make would execute more quickly (since it wouldn't need to re-exec
itself), and it would work correctly for the above case. Also, other
problems could be avoided -- eg, under the current scheme, saying "make
-p" will print out the rules defined in "Makefile", not
"GenericMakefile", which makes it harder to debug the generic case.
I realize this change would diverge from the exact compatibility with
standard makes, but it's already divergent (for instance, it passes all
variables into the environment), and this would be a useful feature.
Steven
...!ucbvax!grady
grady@postgres.berkeley.edu
If God had wanted us to be concerned for the plight of the toads, he would
have made them cute and furry.