Subject: Re: [PATCH v2 4/5] Makefile: respect build info declared in "config.mak"

From: Patrick Steinhardt <[email-masked]>
Date: Fri, 20 Dec 2024 19:02:09 +0100

On Fri, Dec 20, 2024 at 12:51:36PM -0500, Jeff King wrote:
> On Fri, Dec 20, 2024 at 05:47:14PM +0100, Patrick Steinhardt wrote:
> 
> > > This looks good. It fixes the issue, and I am happy that:
> > > 
> > > >  asciidoctor-extensions.rb: asciidoctor-extensions.rb.in FORCE
> > > > -	$(QUIET_GEN)GIT_USER_AGENT="$(GIT_USER_AGENT)" $(SHELL_PATH) ../GIT-VERSION-GEN "$(shell pwd)/.." $< $@
> > > > +	$(QUIET_GEN)$(SHELL_PATH) ../GIT-VERSION-GEN "$(shell pwd)/.." $< $@
> > > 
> > > ...these spots get even simpler.
> > 
> > Meh. I just noticed that this doesn't work: we include GIT-VERSION-FILE
> > and export its value, and consequently any subsequent invocation of
> > GIT-VERSION-GEN will continue to use the value that we have in
> > GIT-VERSION-FILE. So it's effectively only computed the first time.
> 
> I'm not sure what you mean.
> 
> I wondered earlier if we might into a chicken-and-egg problem like that,
> but I tested and it seemed to work fine. The rule for GIT-VERSION-FILE
> means we'll build it before make reads it, so that first run of it will
> get the updated value. And:
> 
>   make GIT_VERSION=foo && bin-wrappers/git version
>   make GIT_VERSION=bar && bin-wrappers/git version
> 
> does what you'd expect. And the docs work the same way:
> 
>   cd Documentation
>   make GIT_VERSION=foo git.1 && man -l git.1
>   make GIT_VERSION=bar git.1 && man -l git.1
> 
> Is there a case you found that doesn't work?

Yes:

    $ make GIT-VERSION-FILE GIT_VERSION=foo
    GIT_VERSION=foo
    make: 'GIT-VERSION-FILE' is up to date.
    $ cat GIT-VERSION-FILE
    GIT_VERSION=foo

    # And now run without GIT_VERSION set.
    make: 'GIT-VERSION-FILE' is up to date.
    GIT_VERSION=foo

So the value remains "sticky" in this case. And that is true whenever
you don't set GIT_VERSION at all, we always stick with what is currently
in that file.

I've got a version now that works for all cases, but I had to use
Makefile templates and some shuffling to make it work.

Patrick