[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: prerequisite staleness criteria
From: |
John Graham-Cumming |
Subject: |
Re: prerequisite staleness criteria |
Date: |
Tue, 18 Apr 2006 10:42:53 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040208 Thunderbird/0.5 Mnenhy/0.6.0.104 |
Lawrence, Lynne wrote:
Is this possible?
You can hack this into GNU Make using md5sum (I'm assuming you're on a
system with Unix-like commands). Here's a little example that builds
foo.o from foo.c but only updates foo.o when foo.h has changed... and
changed means that its checksum has changed:
.PHONY: all
to-md5 = $(patsubst %,%.md5,$1)
from-md5 = $(patsubst %.md5,%,$1)
all: foo.o
foo.o: foo.c
foo.o: $(call to-md5,foo.h)
%.md5: FORCE
@$(if $(filter-out $(shell cat $@ 2>/dev/null),$(shell md5sum
$*)),md5sum $* > $@)
FORCE:
This works because when foo.h was mentioned in the prereq list of foo.o
it was changed to foo.h.md5 by the to-md5 function. So GNU Make sees
that prereqs of foo.o to be foo.c and foo.h.md5.
Then there's a pattern rule to build foo.h.md5 (the %.md5 rule) that
will only update the .md5 file if the checksum has changed. In thus if
and only if the checksum has changed does the md5 file get changed and
hence foo.o rebuilt.
The %.md5 rule is forced to run by having a dummy prereq called FORCE so
that every MD5 hash is checked for every prereq that GNU Make needs to
examine. First the rule uses a filter-out/if combination to check to
see if the MD5 hash has changed. If it has then the %.md5 rule will run
md5sum $* > $@ (in the example md5sum foo.h > foo.h.md5). This will
both update the hash in the file and changed the .md5 file's timestamp
and force foo.o to build.
If within the rule for foo.o you were using $?, $^ or other automatics
that work on the prereq list these need to be passed through from-md5 to
remove the .md5 extension so that the real prereq is used in the
commands to build foo.o. In the example I gave this isn't necessary.
If the foo.h.md5 file does not exist then the %.md5 rule will create it
and force foo.o to get built.
John.
--
John Graham-Cumming
address@hidden
Home: http://www.jgc.org/
Blog: http://www.jgc.org/blog/
POPFile: http://getpopfile.org/
GNU Make Standard Library: http://gmsl.sf.net/
GNU Make Debugger: http://gmd.sf.net/
Fast, Parallel Builds: http://www.electric-cloud.com/
Sign up for my Spam and Anti-spam Newsletter
at http://www.jgc.org/