Recursive #includes

Jim Shankland jas at ernie.Berkeley.EDU
Thu Mar 2 08:51:59 AEST 1989


In article <9752 at smoke.BRL.MIL> gwyn at brl.arpa (Doug Gwyn (VLD/VMB) <gwyn>) writes:
>In article <2538 at goofy.megatest.UUCP> djones at megatest.UUCP (Dave Jones) writes:
>>By what rationale can the first .h be said to depend on the second?
>
>The first .h depends on the second, because for all X, if X depends on
>the first .h, then X depends on the second.

This sounds a little funny (well, wrong).  Dependency is a binary,
transitive relation D(a, b).  It means:  "a is functionally dependent
on b.  If the value of b changes, the value of a is likely to change as
a consequence."  You can't conclude that because for all X, D(X, h1)
implies D(X, h2), therefore D(h1, h2) is the case.  You might come up
with some new relation I, and *define* it as follows:  if and only if,
for all X, D(X, h1) implies D(X, h2), then I(h1, h2).  Such a relation
may be useful; but it's not the dependency relation D.

>As I remarked in another posting, the problem is that there are logical
>dependencies, with crisp mathematical properties, and physical dependencies,
>which require some actions to update the targets.  "make" unfortunately
>does not distinguish between these, causing lots of grief over the years.

I don't understand the distinction you're trying to draw.  What
make cares about, and should care about, is the D relation.
Providing support for the user to specify the I relation might be
useful, but only as a notational shorthand:  make could derive D
relationships from the given I relationships, relieving the programmer
of the burden of enumerating those D relationships herself.  But
they're not equivalent, and treating them as such leads you into
the "touch hdr1.h" morass.

A better approach, I think, is to automate as much dependency determination
as possible.  Various makefile generators and "new makes" do this,
modulo a few snags involving conditional inclusion.  More could be done.

>One of the reasons I don't normally show all the dependencies on headers
>in my Makefiles is that "make" simply cannot really get it "right", and
>a "dependency" on a header really is a "might depend" on the header
>anyway, so letting "make" do its thing without manual intervention can
>result in a lot of unnecessary recompilations.

Ah, you like to live dangerously :-).  Most of the time, it's better to
do a little extra recompilation than to discover that the "bug" you've
been tearing your hair out over for the last day and a half is really
caused by an out-of-date module.

You're right, make and the makefile generators are overly conservative
in determining the D relation.  They could do better by doing syntactic
analysis of the changes to a source file.  That is probably the way of
the future for environments supporting large software projects.
Determining the minimal correct D relation is, in general,
undecidable:  if I add some code to a source file, it is undecidable
whether that code will ever be executed, hence whether the source file
needs to be recompiled.  No matter.  I think syntactic analysis will
get us close enough for practical purposes.

Jim Shankland
jas at ernie.berkeley.edu



More information about the Comp.lang.c mailing list