make: variable expansion in .for/.endfor
Roman Neuhauser
neuhauser at bellavista.cz
Tue Apr 29 06:01:50 PDT 2003
# roam at ringlet.net / 2003-04-29 13:34:04 +0300:
> On Sun, Apr 27, 2003 at 02:48:12PM +0200, Roman Neuhauser wrote:
> > # roam at ringlet.net / 2003-04-26 14:53:36 +0300:
> > > On Fri, Apr 25, 2003 at 08:44:00PM +0200, Roman Neuhauser wrote:
> > > > Try the following makefile: it works if called with -DONE, but does not
> > > > if called with -DTWO. Should I treat it as a bug and file a PR?
> > > >
> > > > LIST= foo bar baz
> > > >
> > > > .if defined(ONE)
> > > > . for v in ${LIST}
> > > > . if !defined(WITHOUT_${v:U})
> > > > WITH_${v:U}=yes
> > > > . endif
> > > > . endfor
> > > > .endif
> > > >
> > > > .if defined(TWO)
> > > > . for v in ${LIST}
> > > > V=${v:U}
> > > > . if !defined(WITHOUT_${V})
> > > > WITH_${V}=yes
> > > > . endif
> > > > . endfor
> > > > .endif
> > > >
> > > > a:
> > > > @echo \$${WITH_FOO}: ${WITH_FOO}
> > > > @echo \$${WITH_BAR}: ${WITH_BAR}
> > > > @echo \$${WITH_BAZ}: ${WITH_BAZ}
> > > >
> > > > .PHONY: a
> > >
> > > I think this is a known bug, and it seems to even be documented
> > > in the BUGS section of -STABLE's make(1) manual page.
> >
> > I don't think this is covered. Can you point out the relevant text?
>
> Looking at:
> $FreeBSD: src/usr.bin/make/make.1,v 1.29.2.15 2002/12/17 19:01:18 seanc Exp $
>
> The rendered version reads, right at the end of the BUGS section:
>
> For loops are expanded before tests, so a fragment such as:
>
> .for TMACHINE in ${SHARED_ARCHS}
> .if ${TMACHINE} = ${MACHINE}
> ...
> .endif
> .endfor
> won't work, and should be rewritten the other way around.
>
> This particular part of the manual page seems to have been there
> for the past three years, since Tim Vanderhoek's merge from OpenBSD
> in rev. 1.23.
>
> At least, I think that this is similar (actually, nearly identical) to
> your Makefile fragment.
both fragments are "nearly identical", and the first one works. it's
the assignment (V=${v:U}) that breaks. so, where's the similarity
(or identity), given that the snippet from the make man page is
unrelated to assignments?
again, the first version (wrapped in ifdef ONE) works just fine.
--
If you cc me or remove the list(s) completely I'll most likely ignore
your message. see http://www.eyrie.org./~eagle/faqs/questions.html
More information about the freebsd-hackers
mailing list