make: variable expansion in .for/.endfor

Roman Neuhauser neuhauser at bellavista.cz
Thu Jun 12 01:24:44 PDT 2003


# ru at freebsd.org / 2003-05-16 15:30:01 +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?

> Yes, BUGS section talks about a different problem (...)

> FWIW, the code snippet above works perfectly under 5.x make(1).
> I recall this problem was fixed (perhaps, it was even me, not
> sure).  Sorry, but I don't have enough time to invest into
> backporting the bugfix into RELENG_4, the latter is becoming
> less priority for me as 5.x evolves.
> 
> If you'll be able to extract it from HEAD (there is a huge
> backlog of non-backported fixes for make(1) there), I will
> happily commit it for you.
> 
> $ uname -r
> 5.1-BETA
> $ make -DONE
> ${WITH_FOO}: yes
> ${WITH_BAR}: yes
> ${WITH_BAZ}: yes
> $ make -DTWO
> ${WITH_FOO}: yes
> ${WITH_BAR}: yes
> ${WITH_BAZ}: yes

    I've spent two hours in cvsweb but haven't noticed a commit message
    that would indicate a relation to this problem, and the source code
    is obviously over my head.

    But it looks like the problem is in the order of processing loops,
    and applying modifiers... or something:

    roman at freepuppy ~ 1024:0 > cat tmp/scratch4
    LIST=	foo bar baz

    .for v in ${LIST}
    V=	${v:U}
    V_${v}=	${V}
    v_${v}=	${v}
    .endfor

    all:
    .for v in ${LIST}
        @echo \$${V_${v}}: ${V_${v}}
    .endfor
    .for v in ${LIST}
        @echo \$${v_${v}}: ${v_${v}}
    .endfor

    .PHONY: all 
    roman at freepuppy ~ 1025:0 > make -f tmp/scratch4
    ${V_foo}: BAZ
    ${V_bar}: BAZ
    ${V_baz}: BAZ
    ${v_foo}: foo
    ${v_bar}: bar
    ${v_baz}: baz
    roman at freepuppy ~ 1026:0 > uname -a
    FreeBSD freepuppy.bellavista.cz 4.8-STABLE FreeBSD 4.8-STABLE #2: Thu Jun  5 12:57:47 CEST 2003     root at freepuppy.bellavista.cz:/usr/obj/usr/src/sys/FREEPUPPY2_5  i386

    Does this help identifying the responsible code? I'd really like to
    continue using 4.x for some time, and this bitrot in make is quite
    unfortunate for me.

-- 
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