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.

[...]

Reply via email to