[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: mixed implicit rules problem
From: |
Paul D. Smith |
Subject: |
Re: mixed implicit rules problem |
Date: |
Wed, 29 Mar 2006 16:37:56 -0500 |
%% Yaroslav Halchenko <address@hidden> writes:
yh> > cat Makefile
yh> SO=1
yh> T=2
yh> VER=$(SO).$(T)
yh> lib%.so:lib%.so.$(SO)
yh> ln -snf $$(basename $<) $@
yh> lib%.so.$(SO):lib%.so.$(VER)
yh> ln -snf $$(basename $<) $@
yh> a/b/c/lib%.so.1.2: a/b/c/libz%.so
yh> cat $< >| $@
yh> > rm a/b/c/* -f
yh> > /var/tmp/test# echo 1 > a/b/c/libzz.so.1.2
yh> > /var/tmp/test# make a/b/c/libz.so
yh> make: *** No rule to make target `a/b/c/libz.so'. Stop.
yh> As you can see, make could not figure out full graph of implicit
yh> rules on how to derive libz.so from libzz.so.1.2.
If you use the -d option make will show you what it's doing. You are
expecting the implicit rule creation to proceed like this:
a/b/c/libz.so -> a/b/c/libz.so.1 -> a/b/c/libz.so.1.2 \
-> a/b/c/libzz.so -> a/b/c/libzz.so.1 -> a/b/c/libzz.so.1.2
However, this cannot work. See the GNU make Manual, section "Chains of
Implicit Rules" in the chapter "Implicit Rules":
No single implicit rule can appear more than once in a chain. This
means that `make' will not even consider such a ridiculous thing as
making `foo' from `foo.o.o' by running the linker twice. This
constraint has the added benefit of preventing any infinite loop in the
search for an implicit rule chain.
If you examine the -d output you'll see this in action:
...
Looking for a rule with intermediate file `a/b/c/libzz.so'.
Avoiding implicit rule recursion.
Avoiding implicit rule recursion.
Avoiding implicit rule recursion.
No implicit rule found for `a/b/c/libz.so'.
--
-------------------------------------------------------------------------------
Paul D. Smith <address@hidden> Find some GNU make tips at:
http://www.gnu.org http://make.paulandlesley.org
"Please remain calm...I may be mad, but I am a professional." --Mad Scientist