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