On Thu, Oct 31, 2002 at 04:37:32AM -0500, AlanE wrote:
> On Thu, Oct 31, 2002 at 11:20:26AM +0200, Ruslan Ermilov wrote:
> >On Thu, Oct 31, 2002 at 01:12:46AM -0500, AlanE wrote:
> >> On Wed, Oct 30, 2002 at 10:08:20PM -0800, David O'Brien wrote:
> >> >On Thu, Oct 31, 2002 at 01:03:20AM -0500, AlanE wrote:
> >> >> There is also an expression parser bug that I would like to fix; it is
> >> >> a confusing error that causes make(1) to reject perfectly legitimate
> >> >> conditional expressions. We'll see about that one when I get to it; I
> >> >> suspect it should wait until after 5.0-RELEASE.
> >> >
> >> >If "make release" isn't broken, it should 100% wait until after
> >> >5.0-RELEASE.
> >> 
> >> I tend to agree here. No existing Makefiles are broken, so it can 
> >> wait. (Besides, I haven't even begun to investigate the problem...)
> >> 
> >What is this problem you're talking about?  I might have already
> >looked at it recently.
> 
> This code works correctly.
> 
> .if ${PERL_MAJOR} < 5 || ${PERL_MAJOR} == 5 && ${PERL_MINOR} < 8
> ${ECHO_CMD} This port might need the p5-File-Spec port.
> .endif # ${PERL_MAJOR} < 5 || ${PERL_MAJOR} == 5 && ${PERL_MINOR} < 8
> 
> This code, differing only in the use of ()'s to group the expressions,
> causes make(1) to think it is doing *string* comparisons, and then
> complain very loudly about only using == and != in said comparison.
> 
> .if (${PERL_MAJOR} < 5) || (${PERL_MAJOR} == 5 && ${PERL_MINOR} < 8)
> ${ECHO_CMD} This port might need the p5-File-Spec port.
> .endif # (${PERL_MAJOR} < 5) || (${PERL_MAJOR} == 5 && ${PERL_MINOR} < 8)
> 
Heh, I wondered about that too when I first these strange lines in
bsd.port.mk with spaces surronding parentheses -- it also works if
you insert spaces after digits before right parentheses:

.if (${PERL_MAJOR} < 5 ) || (${PERL_MAJOR} == 5 && ${PERL_MINOR} < 8 )

Here is the fix:

%%%
Index: cond.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/cond.c,v
retrieving revision 1.25
diff -u -p -r1.25 cond.c
--- cond.c      23 Oct 2002 23:16:42 -0000      1.25
+++ cond.c      31 Oct 2002 13:10:13 -0000
@@ -688,14 +688,15 @@ do_string_compare:
                        }
                    } else {
                        char *c = CondCvtArg(rhs, &right);
-                       if (*c != '\0' && !isspace((unsigned char) *c))
+                       if (*c != '\0' && *c != ')' &&
+                           !isspace((unsigned char) *c))
                            goto do_string_compare;
                        if (rhs == condExpr) {
                            /*
                             * Skip over the right-hand side
                             */
                            while(!isspace((unsigned char) *condExpr) &&
-                                 (*condExpr != '\0')) {
+                                 *condExpr != ')' && *condExpr != '\0') {
                                condExpr++;
                            }
                        }
%%%

ports/devel/pmake is also vulnerable to this (even the latest beta),
and unless I'm dreadfully mistaken, OpenBSD's make(1) too.


Cheers,
-- 
Ruslan Ermilov          Sysadmin and DBA,
[EMAIL PROTECTED]           Sunbay Software AG,
[EMAIL PROTECTED]          FreeBSD committer,
+380.652.512.251        Simferopol, Ukraine

http://www.FreeBSD.org  The Power To Serve
http://www.oracle.com   Enabling The Information Age

Attachment: msg45776/pgp00000.pgp
Description: PGP signature

Reply via email to