tech-toolchain archive

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

Re: make :Q breakage



On May 26,  8:32pm, uwe%stderr.spb.ru@localhost (Valery Ushakov) wrote:
-- Subject: Re: make :Q breakage

| > When you want to pass e.g. variable reference to be interpreted by the
| > submake?  I.e.
| > 
| > # FOO and BAR are defined in the submake, you can select which one you
| > # want to use
| > #DEFVAR=$${FOO}
| > DEFVAR=$${BAR}
| > 
| > 	make -f other.mk VAR=${DEFVAR:Q}
| > 
| > Which is like setting VAR=${BAR} in the submake.  You want :Q for the
| > shell, but you do mean to pass single $ here that you need to express
| > with $$ in the caller.
| > 
| > Actually, the variable can be a shell variable too and not necessarily
| > quoted to pass to a submake.  The use case your change broke with
| > pkgsrc tools is exactly that for shell's $@
| 
| It can also be literal input to something with a dollar in it, e.g.
| 
| EDCMD=	3,$$d
| all:
| 	seq 5 > seq.txt
| 	(echo ${EDCMD:Q}; echo wq ) | ed seq.txt
| 	cat seq.txt
| 
| where you want shell-quoting but not make-quoting.
| 
| To reiterate - there are two distinct operations here.  One is quoting
| of meta-characters interpreted by shell, the other is quoting the
| meta-characters interpreted by make.  In the latter case the character
| is just '$' and to "quote" it, you need to change it to $$, which you
| can do with :S.  Since it's only one character, the :S expression is
| not that unwieldy, so may be we don't necessarily want to introduce a
| brand new modifier just for that. Even if we do, it's still
| conceptually a separate operation from :Q
| 
| OTOH, since we will almost always want to apply shell-quoting after
| make-quoting anyway, it might be convenient to introduce a version of
| :Q that first applies make-quoting, so that you can write ${VAR:QM}
| instead of ${VAR:S/\$/&&/g:Q} or ${VAR:${MAKEQUOTE}}.  If you need
| just the make-quoting you can still use :S

Ok, I will use :Qm, so that it is not confused with :M and follow the
current convention, but I will note that the manual page says now:

    :Q   Quotes every shell meta-character in the variable, so that it can be
	 passed safely through recursive invocations of make.

so the original intention was to pass safely variables to sub-makes (I would
know since I wrote it) and I should have realized that '$' needs to be doubled
too. But that is water under the bridge now.

So the man page will say when I change it:

    :Q   Quotes every shell meta-character in the variable, so that it can be
	 passed safely to the shell.

    :Qm   Quotes every shell meta-character in the variable and `$', so that
	 it can be passed safely through recursive invocations of make.

Also the common use of :Q right now is to quote for recursive invocations
of make, so I am going to have to go and change all the :Q's to :Qm's in
the tree.

Ok?

christos


Home | Main Index | Thread Index | Old Index