From: Austin Clements Date: Fri, 14 Feb 2014 21:58:07 +0000 (+1900) Subject: Re: [PATCH 1/1] emacs: always write emacs/.eldeps when the target is remade X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=23e3a0111a391cde2266c89d9dfa40cfb3751a3e;p=notmuch-archives.git Re: [PATCH 1/1] emacs: always write emacs/.eldeps when the target is remade --- diff --git a/27/ea1a1014fc12c6f1072216679292384d85292c b/27/ea1a1014fc12c6f1072216679292384d85292c new file mode 100644 index 000000000..7801bf325 --- /dev/null +++ b/27/ea1a1014fc12c6f1072216679292384d85292c @@ -0,0 +1,226 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 0FBBC431FBC + for ; Fri, 14 Feb 2014 13:58:22 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -0.7 +X-Spam-Level: +X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id gjpk8IRjrILt for ; + Fri, 14 Feb 2014 13:58:15 -0800 (PST) +Received: from dmz-mailsec-scanner-8.mit.edu (dmz-mailsec-scanner-8.mit.edu + [18.7.68.37]) + (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id 89002431FB6 + for ; Fri, 14 Feb 2014 13:58:15 -0800 (PST) +X-AuditID: 12074425-f79906d000000cf9-f0-52fe91760f11 +Received: from mailhub-auth-2.mit.edu ( [18.7.62.36]) + (using TLS with cipher AES256-SHA (256/256 bits)) + (Client did not present a certificate) + by dmz-mailsec-scanner-8.mit.edu (Symantec Messaging Gateway) with SMTP + id A0.64.03321.6719EF25; Fri, 14 Feb 2014 16:58:14 -0500 (EST) +Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11]) + by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id s1ELwD5D020593; + Fri, 14 Feb 2014 16:58:14 -0500 +Received: from awakening.csail.mit.edu (awakening.csail.mit.edu [18.26.4.91]) + (authenticated bits=0) + (User authenticated as amdragon@ATHENA.MIT.EDU) + by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id s1ELwAsw022503 + (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NOT); + Fri, 14 Feb 2014 16:58:12 -0500 +Received: from amthrax by awakening.csail.mit.edu with local (Exim 4.80) + (envelope-from ) + id 1WEQlr-0007tC-LY; Fri, 14 Feb 2014 16:58:09 -0500 +Date: Fri, 14 Feb 2014 16:58:07 -0500 +From: Austin Clements +To: Tomi Ollila +Subject: Re: [PATCH 1/1] emacs: always write emacs/.eldeps when the target is + remade +Message-ID: <20140214215736.GD4375@mit.edu> +References: <1390645309-2326-1-git-send-email-tomi.ollila@iki.fi> + <20140213071026.GX4375@mit.edu> + <20140213074944.GY4375@mit.edu> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +In-Reply-To: +User-Agent: Mutt/1.5.21 (2010-09-15) +X-Brightmail-Tracker: + H4sIAAAAAAAAA+NgFmphleLIzCtJLcpLzFFi42IRYrdT0S2b+C/IoOGTssX1mzOZLd6snMfq + wORx+OtCFo9nq24xBzBFcdmkpOZklqUW6dslcGWc2D+LqeCHfsW0hyuYGxh71boYOTkkBEwk + ur+dZ4SwxSQu3FvP1sXIxSEkMJtJYv3tNawQzkZGic/7TzNDOKeZJHZf/8sE4SxhlOidPRes + n0VAVeJ220J2EJtNQENi2/7lYHERARWJB23rWUFsZgFpiW+/m5lAbGGBMImZi0CmcnDwCmhL + bFjuCjHzItDMn5PYQGp4BQQlTs58wgLRqyVx499LJpB6kDnL/3GAhDkFDCSuHr8OtkoUaNWU + k9vYJjAKzULSPQtJ9yyE7gWMzKsYZVNyq3RzEzNzilOTdYuTE/PyUot0LfRyM0v0UlNKNzGC + A9tFdQfjhENKhxgFOBiVeHgldP8FCbEmlhVX5h5ilORgUhLllewCCvEl5adUZiQWZ8QXleak + Fh9ilOBgVhLh7ckFyvGmJFZWpRblw6SkOViUxHlrLX4FCQmkJ5akZqemFqQWwWRlODiUJHgd + JgA1ChalpqdWpGXmlCCkmTg4QYbzAA2f3w8yvLggMbc4Mx0if4pRUUqc1wEkIQCSyCjNg+uF + JZ5XjOJArwjzxoKs4AEmLbjuV0CDmYAGrzr9F2RwSSJCSqqB8ajcw99/Lnpm/V0rNGGZ/vNJ + Z43ZEtr6rT8dcip+zas0cwbf7MtVHanrZH48lpzZtEyCYYf7veLT+57/7ml/s9byfvZeuf2N + Ox6VnMvObDA/N13AdcNCodePjlcnXPss8njF1XVJM3TD3fcwXosWC7BZcu/GX7e9yxd6vW1o + yus73aO+7JrFd0klluKMREMt5qLiRAAE+IpuFwMAAA== +Cc: notmuch@notmuchmail.org +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Fri, 14 Feb 2014 21:58:22 -0000 + +Quoth Tomi Ollila on Feb 14 at 9:24 pm: +> On Thu, Feb 13 2014, Austin Clements wrote: +> +> > Quoth Tomi Ollila on Feb 13 at 9:26 am: +> >> On Thu, Feb 13 2014, Austin Clements wrote: +> >> +> >> > Quoth Tomi Ollila on Jan 25 at 12:21 pm: +> >> >> So that the target is newer than its prerequisites. +> >> >> --- +> >> >> emacs/Makefile.local | 3 +-- +> >> >> 1 file changed, 1 insertion(+), 2 deletions(-) +> >> >> +> >> >> diff --git a/emacs/Makefile.local b/emacs/Makefile.local +> >> >> index 42bfbd9..d5d402e 100644 +> >> >> --- a/emacs/Makefile.local +> >> >> +++ b/emacs/Makefile.local +> >> >> @@ -32,8 +32,7 @@ emacs_bytecode = $(emacs_sources:.el=.elc) +> >> >> 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 $@) +> >> >> + -f batch-make-deps $(emacs_sources) > $@.tmp && mv $@.tmp $@ +> >> >> -include $(dir)/.eldeps +> >> >> endif +> >> >> CLEAN+=$(dir)/.eldeps $(dir)/.eldeps.tmp +> >> > +> >> > Is this just so the rule doesn't get run again on the next make +> >> > invocation (unless, of course, a dependent changed)? +> >> +> >> Basically yes. I did multiple builds in rapid succession when developing +> >> something and this thing confused me quite a lot in the beginning... +> >> +> >> > Interestingly, if any of the dependents have changed, but in ways that +> >> > don't affect .eldeps, this change will make the build more expensive +> >> > because it will trigger a make restart after .eldeps is updated. +> >> +> >> I wondered what was the reason for the recipe you've chosen here, has +> >> it something to do with inodes or something ;) (and were going to ask +> >> an alternative to touch (or even : > $@) the target... +> >> +> >> ... but now I understand. E.g. change in notmuch-lib.el will cause *all* +> >> .el files to be re-bytecompiled after this change. +> > +> > This is unrelated to the cmp in the recipe. A change in +> > notmuch-lib.el *must* cause almost all .el files to be recompiled +> > because they almost all require it and may use macros from it. If you +> > touch, e.g., notmuch-hello.el, you'll see that very little is rebuilt +> > (with or without this patch). +> > +> >> An alternative to this patch would be adding a message to the rule +> >> which informs user to touch .eldeps to avoid re-doing .eldeps if +> >> that irritates one :D +> >> +> >> something like: +> >> +> >> (cmp -s $@.tmp $@ && \ +> >> echo "touch $@ to avoid redoing this target" || mv $@.tmp $@) +> > +> > I think this patch is good as it is; I was just pointing out that the +> > change also has a performance drawback in some situations. (Knowing +> > make, there's probably *some* way to get the best of both worlds and +> > it's probably really ugly.) +> +> Ah, now I understand, because emacs/Makefile.local includes emacs/.eldeps +> when it notices mtime of emacs/.eldeps changes it restarts itself... +> +> ... to compare with current behaviour: +> +> $ make +> ... +> $ touch emacs/notmuch.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'. +> $ make +> Use "make V=1" to see the verbose compile lines. +> EMACS emacs/.eldeps +> make: Nothing to be done for `all'. +> +> It will rerun emacs -L emacs -batch -l make-deps.el -f batch-make-deps ... +> over and over again... +> +> I thought I figured out a solution involving .eldeps.stamp file but +> that turned out to be no-go... (circular dependency netween .eldeps.stamp +> and Makefile.local). +> +> So, with this if one edits emacs/* files and keeps building byte-compiled +> versions often, make will both run EMACS emacs/.eldeps and restarting +> -- and when moving to edit other files both of the above stops. Without +> this change after editing emacs/* files EMACS emacs/.eldeps will be +> executed until it is touched or make clean executed (I wonder how make +> handles rebuilding emacs/.eldeps while doing make clean ;) +> +> +> Tomi + +Here's a way that works, but it's more complicated than your patch and +doesn't seem to perform any better: + +diff --git a/emacs/Makefile.local b/emacs/Makefile.local +index 42bfbd9..8a1f1c2 100644 +--- a/emacs/Makefile.local ++++ b/emacs/Makefile.local +@@ -29,14 +29,28 @@ emacs_bytecode = $(emacs_sources:.el=.elc) + # the byte compiler may load an old .elc file when processing a + # "require" or we may fail to rebuild a .elc that depended on a macro + # from an updated file. ++# ++# We do this in two rules. .eldeps is the "real" dependencies file ++# and will be rebuilt if and only if a .el source file changes. We ++# could include this directly, but then whenever a .el file changed ++# (and .eldeps's mtime changed), make would restart immediately after ++# the include below. To avoid this, we create a second file, ++# .eldeps.x, that we only update when its *contents* differ from ++# .eldeps. .eldeps will often have an mtime older than .eldeps.x (any ++# .el file change that does not change dependencies will cause this), ++# so the .eldeps.x rule will often run, but it executes quickly and ++# quietly and will not trigger a make restart unless the dependencies ++# actually change. + 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 $@ ++$(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)