[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Make 3.82: weird "circular dependency" and missing $< expansion
From: |
Paul Smith |
Subject: |
Re: Make 3.82: weird "circular dependency" and missing $< expansion |
Date: |
Tue, 03 May 2011 12:04:52 -0400 |
On Tue, 2011-05-03 at 17:39 +0200, Akim Demaille wrote:
> Le 2 mai 2011 à 16:07, Paul Smith a écrit :
>
> Hi Paul!
>
> > So, the circular dependency issue is because of this:
> >
> >> %.eps: %.pdf
> >>
> >> %.eps %.pdf: %.dat
> >
> > In the second rule you say that BOTH %.eps and %.pdf can be built from
> > %.dat, and in the first rule you say that %.eps can be built from %.pdf.
> > So make has two different ways to build %.eps, and one of them lists as
> > a prerequisite a co-target in the other rule. Make is rightly confused
> > here.
>
> I'm confused in understanding why it's rightly confused :/ But maybe
> my confusion is, as Edward pointed out, because I am misled by the
> term "circular dependency", as really, I can't see any here.
Maybe circular is not the best term; as Edward says maybe a better term
in this case is ambiguous. However the same code checking is used for
circular dependencies so that's the output you get.
In order to understand make's dilemma I need to be sure you understand
what the "%.eps %.pdf: %.dat" syntax means; some people think it means
the same thing as:
%.eps: %.dat
command
%.pdf: %.dat
command
But that's not what it means (if these was an explicit rule, instead of
a pattern rule, it would mean that). What it means instead is that one
invocation of <command> will create BOTH %.eps and %.pdf. That is, make
has no way of building %.pdf, except for a rule that ALSO builds %.eps.
So, you ask to build accel.eps. Make finds the first rule, "%.eps :
%.pdf". Now make wants to know how to build accel.pdf. Looking around
make sees that it can be build by the rule "%.eps %.pdf: %.dat". This
rule works because there is an accel.dat.
But wait! When make builds accel.pdf using that pattern rule, it will
ALSO build accel.eps... but make already has a different rule to build
accel.eps.
Now make has two different rules that both will build the same target
file, so it gives up with an error.
--
-------------------------------------------------------------------------------
Paul D. Smith <address@hidden> Find some GNU make tips at:
http://www.gnu.org http://make.mad-scientist.net
"Please remain calm...I may be mad, but I am a professional." --Mad Scientist