[Buildroot] [PATCHv2] core: enhance printvars

Yann E. MORIN yann.morin.1998 at free.fr
Wed Mar 29 09:47:39 UTC 2017


Arnout, All,

On 2017-03-28 22:52 +0200, Arnout Vandecappelle spake thusly:
> On 28-03-17 19:40, Yann E. MORIN wrote:
> > Currently, the output of printvars copntains the name of the variable,
> > its expanded value and its un-expanded value.
> > 
> > However, most of the time, we need the actual, expanded value, so it can
> > be re-used from a (non-Buildroot) infrastructure script, like a
> > post-build script, or a build-farm driver (e.g. a Jenkins job...)
> > 
> > Add two options that a user may set to change the output of printvars:
> >   - QUOTED_VARS, if set, will quote the value
> >   - RAW_VARS, if set, will print the unexpanded value
> > 
> > The new output by default only prints the expanded value now.
> > 
> > So that it can be used as such:
> > 
> >     $ make -s printvars VARS=BUSYBOX_VERSION
> >     BUSYBOX_VERSION=1.26.2
> > 
> >     $ make -s printvars VARS=BUSYBOX_RDEPENDENCIES QUOTED_VARS=YES
> >     BUSYBOX_RDEPENDENCIES='ncurses util-linux'
> > 
> >     $ make -s printvars VARS=BUSYBOX_FINAL_PATCH_DEPENDENCIES RAW_VARS=YES
> >     BUSYBOX_FINAL_PATCH_DEPENDENCIES=$(sort $(BUSYBOX_PATCH_DEPENDENCIES))
> > 
> > And it is even possible to directly evaluate it in a shell script:
> > 
> >     eval $(make -s printvars VARS=BUSYBOX_VERSION QUOTED_VARS=YES)
> > 
> > Backward compatibility of the output is not maintained. It is believed
> > that scripts that depended on the previous output were very fragile to
> > begin with, because they had to filter the non-formatted output
> > (splitting on spaces or braces was not really possible, because values
> > could contain either).
> > 
> > Document printvars and its options in the output of 'make help' and in
> > the manual.
> > 
> > Signed-off-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
> > Cc: Thomas De Schampheleire <patrickdepinguin at gmail.com>
> > Cc: Arnout Vandecappelle <arnout at mind.be>
> 
>  Two nits, one which can be fixed while applying, the other that is probably
> better in a follow-up patch. So

Seeing the issue you poiinted at, this means the quoting feature is
barely usefull. So I repsun the patch with your suggestion to subst the
single quotes. In the end it was not too complex, at the cost of a bit
of duplication.

> Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>

Thanks. But I did not carry it in v3 of the patch, because too much has
changed.

> > ---
> > Changes v1 -> v2:
> >   - add the documentation  (Thomas, Arnout)
> >   - change the meaning of conmfig variables  (Thomas, Arnout)
> >   - don't maintain backward compatibility  (Thomas, Arnout)
> > ---
> >  Makefile                  |  3 ++-
> >  docs/manual/make-tips.txt | 53 +++++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 55 insertions(+), 1 deletion(-)
> > 
> > diff --git a/Makefile b/Makefile
> > index cceae92..d3530ad 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -940,7 +940,7 @@ printvars:
> >  		$(sort $(if $(VARS),$(filter $(VARS),$(.VARIABLES)),$(.VARIABLES))), \
> >  		$(if $(filter-out environment% default automatic, \
> >  				$(origin $V)), \
> > -		$(info $V=$($V) ($(value $V)))))
> > +		$(info $V=$(if $(QUOTED_VARS),')$(if $(RAW_VARS),$(value $V),$($V))$(if $(QUOTED_VARS),'))))
> 
>  Unfortunately, this doesn't fully protect the variable for shell evaluation,
> because the value may contain quotes. Try e.g. 'make VARS=BMON_CONF_ENV
> QUOTED_VARS=YES'.

Damned, good catch.

>  The solution is to add $(subst ','\'',...). But of course only in case of
> QUOTED_VARS. Which makes it a little annoying... Probably best to use
> $(eval value := $(if $(RAW_VARS),$(value $V),$($V))) \
> $(info $V=$(if $(QUOTED_VARS),'$(value)',$(value))
> 
>  Since that's pretty complicated, it's better in a separate patch. Anyway a
> value that has quotes probably doesn't work well in the shell eval (because the
> quotes will normally *not* be interpreted when the variable is used later on).
> 
> [snip]
> > +
> > +The output of quoited raw variables can be reused in shell scripts,
>                     ^

What, you do not like typoes? ;-)

Regards,
Yann E. MORIN.

>  Regards,
>  Arnout
> 
> > +for example:
> > +
> > +----
> > + eval $(make -s printvars VARS=BUSYBOX_VERSION RAW_VARS=YES QUOTED_VARS=YES)
> > +----
> > 
> 
> -- 
> Arnout Vandecappelle                          arnout at mind be
> Senior Embedded Software Architect            +32-16-286500
> Essensium/Mind                                http://www.mind.be
> G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
> LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
> GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'


More information about the buildroot mailing list