bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: New conditional assignment facility


From: Alejandro Colomar
Subject: Re: New conditional assignment facility
Date: Thu, 11 Jan 2024 14:28:26 +0100

On Thu, Jan 11, 2024 at 02:25:25PM +0100, Alejandro Colomar wrote:
> On Thu, Jan 11, 2024 at 02:22:19PM +0100, Alejandro Colomar wrote:
> > Hi Paul!
> > 
> > On Thu, Jan 11, 2024 at 01:44:19AM -0500, Paul Smith wrote:
> > > I've implemented a new capability for conditional assignments (not
> > > pushed yet).
> > > 
> > > After these changes, a "?" can precede any type of assignment
> > > operation, not just "=", and make it conditional (that is, it only
> > > takes effect if the variable is not already set).
> > > 
> > > So for example, in addition to "?=" which creates a recursive variable
> > > if the variable is not set yet, GNU Make will support "?:=" which
> > > creates a simple variable if the variable is not set yet.
> > 
> > Thanks!!
> > 
> > >  Of course if
> > > it's already set then the right-hand side of the assignment is not
> > > expanded.
> > > 
> > > Similarly the assignments "?::=" and "?:::=" are also supported.
> > > 
> > > 
> > > There is one question I wanted to ask for opinions on: what should we
> > > do with the "?+=" operator?
> > 
> > There's a use for it:  appending to a variable if it wasn't set in the
> > environment (ignoring what happened in the Makefile).
> > 
> > Here's what += does:
> > 
> >     alx@debian:~/tmp$ cat Makefile 
> >     var ?= foo
> >     var += bar
> >     $(info $(var))
> >     alx@debian:~/tmp$ make
> >     foo bar
> >     make: *** No targets.  Stop.
> >     alx@debian:~/tmp$ make var=foo
> >     foo
> >     make: *** No targets.  Stop.
> >     alx@debian:~/tmp$ var=foo make
> >     foo bar
> >     make: *** No targets.  Stop.
> 
> Sorry for reusing "foo".  I'll rewrite with quux, which will be clearer.
> 
>       alx@debian:~/tmp$ cat Makefile 
>       var ?= foo
>       var += bar
>       $(info $(var))
>       alx@debian:~/tmp$ make 
>       foo bar
>       make: *** No targets.  Stop.
>       alx@debian:~/tmp$ make var=quux
>       quux
>       make: *** No targets.  Stop.
>       alx@debian:~/tmp$ var=quux make
>       quux bar
>       make: *** No targets.  Stop.
> 
> > 
> > And here's what ?+= could do:
> 
>       alx@debian:~/tmp$ cat Makefile 
>       var ?= foo
>       var += bar

D'oh!  I can't write an email without typos.

        var ?+= bar

>       $(info $(var))
>       alx@debian:~/tmp$ make 
>       foo bar
>       make: *** No targets.  Stop.
>       alx@debian:~/tmp$ make var=quux
>       quux
>       make: *** No targets.  Stop.
>       alx@debian:~/tmp$ var=quux make
>       quux
>       make: *** No targets.  Stop.
> 
> >     alx@debian:~/tmp$ cat Makefile 
> >     var ?= foo
> >     var ?+= bar
> >     $(info $(var))
> >     alx@debian:~/tmp$ make-9000
> >     foo bar
> >     make: *** No targets.  Stop.
> >     alx@debian:~/tmp$ make-9000 var=foo
> >     foo
> >     make: *** No targets.  Stop.
> >     alx@debian:~/tmp$ var=foo make-9000
> >     foo
> >     make: *** No targets.  Stop.
> > 
> > In the last case (environment variable), since var was set, ?+= would do
> > nothing, unlike +=.
> > 
> 
> -- 
> <https://www.alejandro-colomar.es/>
> Looking for a remote C programming job at the moment.



-- 
<https://www.alejandro-colomar.es/>
Looking for a remote C programming job at the moment.

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]