BSD make -- Malformed conditional

Matthew Seaman m.seaman at infracaninophile.co.uk
Fri Jan 27 16:05:54 UTC 2012


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
THIS_FOUND=1
.endif
.endfor

but have to assign the text "this" to a variable somewhere, and use the
second form.

Yes, you can use ${LIST:Mthis} instead, but using this construct can be
a bit tricky in itself...

% cat Makefile

LIST=	foo bar baz blurfl

THING=	baz

all:
	@echo "OK     \$${LIST:Mfoo} = ${LIST:Mfoo}"
	@echo "Not OK \$${LIST:M\$${THING}} = ${LIST:M${THING}}"
% make
OK     ${LIST:Mfoo} = foo
Not OK ${LIST:M${THING}} = }

	Cheers,

	Matthew

-- 
Dr Matthew J Seaman MA, D.Phil.                   7 Priory Courtyard
                                                  Flat 3
PGP: http://www.infracaninophile.co.uk/pgpkey     Ramsgate
JID: matthew at infracaninophile.co.uk               Kent, CT11 9PW

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 267 bytes
Desc: OpenPGP digital signature
Url : http://lists.freebsd.org/pipermail/freebsd-ports/attachments/20120127/2011645c/signature.pgp


More information about the freebsd-ports mailing list