From owner-freebsd-ports@FreeBSD.ORG Fri Feb 3 21:51:28 2012 Return-Path: Delivered-To: freebsd-ports@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A195D1065672; Fri, 3 Feb 2012 21:51:28 +0000 (UTC) (envelope-from conrads@cox.net) Received: from eastrmfepo202.cox.net (eastrmfepo202.cox.net [68.230.241.217]) by mx1.freebsd.org (Postfix) with ESMTP id 1F1A28FC16; Fri, 3 Feb 2012 21:51:27 +0000 (UTC) Received: from eastrmimpo109.cox.net ([68.230.241.222]) by eastrmfepo202.cox.net (InterMail vM.8.01.04.00 201-2260-137-20101110) with ESMTP id <20120203215120.SRGZ2803.eastrmfepo202.cox.net@eastrmimpo109.cox.net>; Fri, 3 Feb 2012 16:51:20 -0500 Received: from serene.no-ip.org ([98.164.86.55]) by eastrmimpo109.cox.net with bizsmtp id VZrL1i0051BeFqy02ZrLtd; Fri, 03 Feb 2012 16:51:20 -0500 X-CT-Class: Clean X-CT-Score: 0.00 X-CT-RefID: str=0001.0A020208.4F2C56D8.00C7,ss=1,re=0.000,fgs=0 X-CT-Spam: 0 X-Authority-Analysis: v=1.1 cv=EYzcOfuzocFB4Uh5a8S+SAtfBMCIXs4UTLohtyR2Crs= c=1 sm=1 a=Al37l13H2jYA:10 a=G8Uczd0VNMoA:10 a=8nJEP1OIZ-IA:10 a=fdHYxQQoAueMHNSmXppgDg==:17 a=6I5d2MoRAAAA:8 a=kviXuzpPAAAA:8 a=WF2pI21SAAAA:8 a=AzIHr2k5Jv3PmvsJB1YA:9 a=JYPxIq17qWwfic00km4A:7 a=wPNLvfGTeEIA:10 a=SV7veod9ZcQA:10 a=4vB-4DCPJfMA:10 a=MHmzl5aOqcYA:10 a=lVY4v3P51c-ZeTEa:21 a=ZzsSSF4H2PEtjjHw:21 a=fdHYxQQoAueMHNSmXppgDg==:117 X-CM-Score: 0.00 Authentication-Results: cox.net; none Received: from cox.net (localhost [127.0.0.1]) by serene.no-ip.org (8.14.5/8.14.5) with ESMTP id q13LpJxF087193; Fri, 3 Feb 2012 15:51:19 -0600 (CST) (envelope-from conrads@cox.net) Date: Fri, 3 Feb 2012 15:51:14 -0600 From: "Conrad J. Sabatier" To: Chris Rees Message-ID: <20120203155114.6d2ec9bb@cox.net> In-Reply-To: References: <4F22CB51.6070507@infracaninophile.co.uk> <20120203152010.3b4d0588@cox.net> X-Mailer: Claws Mail 3.8.0 (GTK+ 2.24.6; amd64-portbld-freebsd10.0) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: freebsd-ports Subject: Re: BSD make -- Malformed conditional X-BeenThere: freebsd-ports@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting software to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 21:51:28 -0000 On Fri, 3 Feb 2012 21:29:15 +0000 Chris Rees wrote: > On 3 February 2012 21:20, Conrad J. Sabatier wrote: > > On Fri, 27 Jan 2012 16:05:37 +0000 > > Matthew Seaman 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} =3D=3D ${THING} =A0# Ooops! > >> THING_FOUND=3D =A01 > >> .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 =3D=3D ${THING}) > >> "Makefile", line 9: if-less endif > >> "Makefile", line 7: Malformed conditional (bar =3D=3D ${THING}) > >> "Makefile", line 9: if-less endif > >> "Makefile", line 7: Malformed conditional (baz =3D=3D ${THING}) > >> "Makefile", line 9: if-less endif > >> "Makefile", line 7: Malformed conditional (blurfl =3D=3D ${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} =3D=3D ${item} > >> THING_FOUND=3D =A0 =A01 > >> .endif > >> .endfor > >> > >> As the make(1) manual page says on the subject of string > >> comparisons using =3D=3D or !=3D : > >> > >> =A0 =A0 =A0An 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} =3D=3D "this" =A0# Ooops > >> THIS_FOUND=3D1 > >> .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=3D foo bar baz blurfl > >> > >> THING=3D =A0 =A0 =A0 =A0baz > >> > >> all: > >> =A0 =A0 =A0 @echo "OK =A0 =A0 \$${LIST:Mfoo} =3D ${LIST:Mfoo}" > >> =A0 =A0 =A0 @echo "Not OK \$${LIST:M\$${THING}} =3D ${LIST:M${THING}}" > >> % make > >> OK =A0 =A0 ${LIST:Mfoo} =3D foo > >> Not OK ${LIST:M${THING}} =3D } > >> > >> =A0 =A0 =A0 Cheers, > >> > >> =A0 =A0 =A0 Matthew > >> > > > > Wow, that is a pretty obscure bit of an oddity, isn't it? =A0How'd you > > ever discover that? > > > > Looking at the man page, it seems more than a little misleading, as > > it does call the iterator in .for loops a "variable" (which for all > > intents and purposes, I'd say that it is, in fact). =A0One could > > easily lose one's marbles trying to "debug" something like this! > > > > Looks like a bug, smells like a bug to me. =A0Or at least, some *very* > > quirky behavior/a serious design flaw that surely wouldn't be > > missed, were someone to take the initiative to change it. > > =A0No language should require you to jump through this > > sort of torturous, totally anti-intuitive hoop to accomplish what > > you want to do. =A0Talk about your POLA! =A0:-) >=20 > Judging by the sheer volume of Makefiles out there that quite possibly > rely on this 'bug' for some things, it's not worth fixing ;) >=20 > Just think of it as yet another quirk of make. >=20 > Chris >=20 Yeah, doggone it. Isn't that so often the case (some anomaly that could really use changing not being changed because it's already so deeply entrenched)? I can just imagine, though, the poor unsuspecting souls who've run head-on into something like this, never to be seen or heard from again, until they one day quietly turn up in bathrobe and slippers in places with names like "Sunny Valley" or "Pleasant Pastures", muttering endlessly to themselves about l-values and expansions and the like, while tirelessly performing the Thorazine Shuffle. Oh, the humanity! --=20 Conrad J. Sabatier conrads@cox.net