Subject: Re: pkglint -Wall
To: Iain Hibbert <plunky@rya-online.net>
From: Roland Illig <rillig@NetBSD.org>
List: tech-pkg
Date: 02/11/2006 21:40:34
Iain Hibbert wrote:
> On Sun, 5 Feb 2006, Roland Illig wrote:
>
>
>>In general, use the :Q operator. But pay attention if the variable appears in
>>'single quotes', "double quotes" or `backticks`. There are subtle differences
>>in the way the shell interprets those strings, and I'm not sure yet how to do
>>it right. One popular example where pkglint could issue a warning but
>>suppresses it are sed(1) replacements:
>>
>>SUBST_SED.foo+= -e 's,@PREFIX@,${PREFIX},g'
>
>
> btw in the package I was twiddling, I used something akin to
>
> SUBST_SED.foo+= s,@PREFIX@,${PREFIX},g
>
> as I determined that in this case (a single editing command) the -e is not
> needed, which makes the quotes not needed either.
>
[...]
>
> since the place where the command line is built is in fact in subst.mk,
> can this construct not be included there rather than in the package
> Makefile?
No, at that point it's too late. Imagine what would happen if ${PREFIX}
contained some whitespace:
PREFIX= C:/Program Files/pkgsrc
Then, the code in subst.mk gets the following arguments. Here I have put
them each in a line of its own for better visibility.
${SED}
s,@PREFIX@,C:/Program
Files/pkgsrc,g
./Makefile.in
It is obvious that there is something wrong, and at this point, it is
not possible to know whether there had been one space between the
"Program" and the "Files", or a tab, or maybe even five spaces. That's
why escaping is needed in the definition of SUBST_SED.
The other thing, omitting the "-e" if there is only one expression, will
lead to problems as soon as someone adds another line. It will then be
necessary to change the current line unnecessarily.
Roland