Blue Swirl <blauwir...@gmail.com> writes: > Add logic to detect changes in generated files. If the old > and new files are identical, don't touch the generated file. > This avoids a lot of churn since many files depend on trace.h. > > Signed-off-by: Blue Swirl <blauwir...@gmail.com> > --- > Makefile | 18 ++++++++++++++++-- > 1 files changed, 16 insertions(+), 2 deletions(-) > > diff --git a/Makefile b/Makefile > index ff39025..085e8ed 100644 > --- a/Makefile > +++ b/Makefile > @@ -107,10 +107,24 @@ ui/vnc.o: QEMU_CFLAGS += $(VNC_TLS_CFLAGS) > bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS) > > trace.h: $(SRC_PATH)/trace-events config-host.mak > - $(call quiet-command,sh $(SRC_PATH)/tracetool --$(TRACE_BACKEND) -h > < $< > $@," GEN $@") > + $(call quiet-command,sh $(SRC_PATH)/tracetool --$(TRACE_BACKEND) -h > < $< > $...@.tmp," GEN $@") > + @if test -f $@; then \ > + if ! cmp -s $@ $...@.tmp; then \ > + mv $...@.tmp $@; \ > + fi; \ > + else \ > + mv $...@.tmp $@; \ > + fi
Why the conditional? cmp -s fails fine when argument files don't exist. Note that common versions of make including GNU Make do not stat a rule's target to check whether the rule changed it. Instead, they assume it changed, and remake everything depending on it. arm...@blackfin:~/tmp$ cat Makefile foo: bar echo "Remaking foo" bar: [ -f $@ ] || touch $@ && echo "Touched bar" arm...@blackfin:~/tmp$ rm -f foo arm...@blackfin:~/tmp$ make [ -f bar ] || touch bar && echo "Touched bar" Touched bar echo "Remaking foo" Remaking foo arm...@blackfin:~/tmp$ make echo "Remaking foo" Remaking foo I doubt your patch avoids churn as advertized with such makes. [...]