[PATCH] emacs: Avoid rebuilding .eldeps even when there's nothing to do

Tomi Ollila tomi.ollila at iki.fi
Thu Feb 20 09:00:39 PST 2014


On Thu, Feb 20 2014, Austin Clements <amdragon at MIT.EDU> wrote:

> Previously, we updated .eldeps only if the file contents actually
> needed to change.  This was done to avoid unnecessary make restarts
> (if the .eldeps rule changes the mtime of .eldeps, make has to restart
> to collect the new dependencies).  However, this meant that, after a
> modification to any .el file that did not change dependencies, .eldeps
> would always be out of date, so every make invocation would run the
> .eldeps rule, which is both expensive because it starts up Emacs and
> noisy.  This was true even when there was nothing to do.  E.g.,
>
> $ make clean && make
> ...
> $ touch emacs/notmuch-lib.el && make
> ...
> $ make
> Use "make V=1" to see the verbose compile lines.
> EMACS emacs/.eldeps
> make: Nothing to be done for `all'.
> $ make
> Use "make V=1" to see the verbose compile lines.
> EMACS emacs/.eldeps
> make: Nothing to be done for `all'.
>
> Fix this by replacing .eldeps with two files with identical content.
> One tracks the mtime of the dependency information and triggers the
> Emacs call to rebuild dependencies only when it may be necessary.  The
> other tracks the content only; this rule over-triggers in the same way
> the old rule did, but this rule is cheap and quiet.
> ---

LGTM. Works as expected.

Tomi

>  emacs/Makefile.local | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/emacs/Makefile.local b/emacs/Makefile.local
> index 42bfbd9..6a39b32 100644
> --- a/emacs/Makefile.local
> +++ b/emacs/Makefile.local
> @@ -33,10 +33,19 @@ ifeq ($(HAVE_EMACS),1)
>  $(dir)/.eldeps: $(dir)/Makefile.local $(dir)/make-deps.el $(emacs_sources)
>  	$(call quiet,EMACS) --directory emacs -batch -l make-deps.el \
>  		-f batch-make-deps $(emacs_sources) > $@.tmp && \
> -		(cmp -s $@.tmp $@ || mv $@.tmp $@)
> --include $(dir)/.eldeps
> +		mv $@.tmp $@
> +# We could include .eldeps directly, but that would cause a make
> +# restart whenever any .el file was modified, even if dependencies
> +# didn't change, because the mtime of .eldeps will change.  Instead,
> +# we include a second file, .eldeps.x, which we ensure always has the
> +# same content as .eldeps, but its mtime only changes when dependency
> +# information changes, in which case a make restart is necessary
> +# anyway.
> +$(dir)/.eldeps.x: $(dir)/.eldeps
> +	@cmp -s $^ $@ || cp $^ $@
> +-include $(dir)/.eldeps.x
>  endif
> -CLEAN+=$(dir)/.eldeps $(dir)/.eldeps.tmp
> +CLEAN+=$(dir)/.eldeps $(dir)/.eldeps.tmp $(dir)/.eldeps.x
>  
>  ifeq ($(HAVE_EMACS),1)
>  %.elc: %.el $(global_deps)
> -- 
> 1.8.4.rc3
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list