Subject: Re: bug in handling of != in make?
To: None <tech-userlevel@NetBSD.org>
From: Alan Barrett <apb@cequrux.com>
List: tech-userlevel
Date: 06/09/2006 14:28:42
On Fri, 09 Jun 2006, Roland Illig wrote:
> VERSION_cmd= echo '$$NetBSD$$'
> VERSION= ${VERSION_cmd:sh}
>
> all:
> echo ${VERSION:Q}
>
> This is the BSD Make equivalent to using $(shell echo '$$NetBSD$$') in
> GNU Make. They both do not further expand '$' characters from the output.
But the above will execute the shell command every time ${VERSION} is
expanded. To avoid that, try this:
VERSION_cmd= echo '$$NetBSD$$'
VERSION:= ${VERSION_cmd:sh:Q}
# The above sets VERSION=\$NetBSD\$
all:
echo ${VERSION}
> The question whether someone might rely on the current behaviour of the
> != operator to mangle the output remains valid though.
!= is not mangling the output; "VERSION != cat file" will set
VERSION=$NetBSD$ as expected. However, != is also not protecting the
result from being mangled later.
Subsequent expansion of ${VERSION} will recursively try to expand
$N at the beginning and $<nothing> at the end. AFAIK, there's no
way to suppress this recursive expansion. Using ${VERSION:Q} after
VERSION!=... doesn't help because the recursive expansion happens before
the :Q modifier is applied.
The only way around it, AFAIK, is to apply a :Q modifier after the
shell expansion but before saving the result into a variable, as in
${VERSION_CMD:sh:Q}.
--apb (Alan Barrett)