BSD make -- Malformed conditional

Chris Rees utisoft at gmail.com
Fri Jan 27 16:51:28 UTC 2012


On 27 Jan 2012 16:06, "Matthew Seaman" <m.seaman at infracaninophile.co.uk>
wrote:
>
>
> Dear all,
>
> Posting this mostly for the archives, but it's probably relevant to some
> people here too.
>
> When hacking on Makefiles, should you wish to match an item in a list,
> you might write something like this:
>
> .for item in ${LIST}
> .if ${item} == ${THING}  # Ooops!
> THING_FOUND=    1
> .endif
> .endfor
>
> This however is a snare and a delusion, and will lead to much weeping
> and wailing, and error messages like so:
>
> % make
> "Makefile", line 7: Malformed conditional (foo == ${THING})
> "Makefile", line 9: if-less endif
> "Makefile", line 7: Malformed conditional (bar == ${THING})
> "Makefile", line 9: if-less endif
> "Makefile", line 7: Malformed conditional (baz == ${THING})
> "Makefile", line 9: if-less endif
> "Makefile", line 7: Malformed conditional (blurfl == ${THING})
> "Makefile", line 9: if-less endif
> make: fatal errors encountered -- cannot continue
>
> Instead you should write your loops like this:
>
> .for item in ${LIST}
> .if ${THING} == ${item}
> THING_FOUND=    1
> .endif
> .endfor
>
> As the make(1) manual page says on the subject of string comparisons
> using == or != :
>
>     An expression may also be a numeric or string comparison: in this
case,
>     the left-hand side must be a variable expansion, whereas the
right-hand
>     side can be a constant or a variable expansion.
>
> So it seems that despite appearing and behaving almost exactly like one,
> the iterator in a .for loop is not actually a variable as such.  It also
> means that to match a constant string, you can't just write:
>
> .for item in ${LIST}
> .if ${item} == "this"  # Ooops

You shouldn't use quotes either.

Chris


More information about the freebsd-ports mailing list