help-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 2 level dependencies in Makefiles


From: Henrik Carlqvist
Subject: Re: 2 level dependencies in Makefiles
Date: Thu, 25 Oct 2007 23:24:38 +0200
User-agent: Pan/0.14.2 (This is not a psychotic episode. It's a cleansing moment of clarity.)

"bocadillodeatun@gmail.com" <bocadillodeatun@gmail.com> wrote:

> Imagine the following Makefile:
> 
> ***********BEGIN
> all: 1.a
> 
> 1.a: 1.o
>         cat 1.o >> 1.a
> 
> 1.o: 1.c
>         cat 1.c >> 1.o
> ***********END

You probably want this Makefile:

***********BEGIN
all: 1.a
 
1.a: 1.o
        cat 1.o >> 1.a
 
1.o: 1.c
        cat 1.c >> 1.o
 
.INTERMEDIATE: 1.o
***********END
 
> However I don't want everything to be rebuilt. Even if the intermediate
> "1.o" file has changed, the final result is going to be the same one.
> 
> Is there anyway I can tell gmake about this ?

>From http://www.gnu.org/software/make/manual/make.html#Chained-Rules

-8<--------------------------
Intermediate files are remade using their rules just like all other files.
But intermediate files are treated differently in two ways.

The first difference is what happens if the intermediate file does not
exist. If an ordinary file b does not exist, and make considers a target
that depends on b, it invariably creates b and then updates the target
from b. But if b is an intermediate file, then make can leave well enough
alone. It won't bother updating b, or the ultimate target, unless some
prerequisite of b is newer than that target or there is some other reason
to update that target.

The second difference is that if make does create b in order to update
something else, it deletes b later on after it is no longer needed.
Therefore, an intermediate file which did not exist before make also does
not exist after make. make reports the deletion to you by printing a `rm
-f' command showing which file it is deleting.

Ordinarily, a file cannot be intermediate if it is mentioned in the
makefile as a target or prerequisite. However, you can explicitly mark a
file as intermediate by listing it as a prerequisite of the special target
.INTERMEDIATE. This takes effect even if the file is mentioned explicitly
in some other way.

You can prevent automatic deletion of an intermediate file by marking it
as a secondary file. To do this, list it as a prerequisite of the special
target .SECONDARY. When a file is secondary, make will not create the file
merely because it does not already exist, but make does not automatically
delete the file. Marking a file as secondary also marks it as
intermediate. 
-8<--------------------------


> The idea is to keep ".a" libraries in the CVS together with the source
> code (but NOT the object files also) and only compile source files when
> at least one of them is newer than the CVS library.

Yep, .INTERMEDIATE will do that for you.

regards Henrik
-- 
The address in the header is only to prevent spam. My real address is:
hc1(at)poolhem.se Examples of addresses which go to spammers:
root@localhost postmaster@localhost



reply via email to

[Prev in Thread] Current Thread [Next in Thread]