Am 08.07.2026 03:22:35 schrieb Kogule Ryo :
> Hi forks,
>
> Make's empty() does not catch outer .for iterators.
>
>> .for i in yes no
>> . if !empty(i:M[Yy][Ee][Ss])
>> output+= yes
>> . endif
>> .endfor
>
> defined() and .ifdef do the same. Is this behavior intentional?
Is rather say accepted than intended. It is a consequence of how the .for loops
are implemented. When evaluating a .for loop, text that looks like an
expression of the form ${i:…} is expanded textually before processing the lines
of the body of the .for loop.
This limitation is not documented in the manual page, though. It would even be
possible to fix it by creating temporary variables during iteration. Up to now,
the pressure to do this was not high enough to get this edge case fixed.
The usual workaround is to write this instead:
.if ${i:M[Yy][Ee][Ss]}
Or, even shorter:
.if ${i:tl} == "yes"
See usr.bin/make/unit-tests/directive-for-empty.mk for a more detailed
explanation.
Roland