Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Mar 2012 17:28:20 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        Chris Rees <utisoft@gmail.com>
Cc:        Doug Barton <dougb@freebsd.org>, svn-src-all@freebsd.org, Dimitry Andric <dim@freebsd.org>, src-committers@freebsd.org, Bruce Evans <brde@optusnet.com.au>, svn-src-head@freebsd.org
Subject:   Re: svn commit: r233052 - head/share/mk
Message-ID:  <201203201728.21049.jhb@freebsd.org>
In-Reply-To: <CADLo839Ef3bu_14AdexOWapOacFLk3MM9HK-oNLmtA52Cc9C6w@mail.gmail.com>
References:  <201203162319.q2GNJjx5039482@svn.freebsd.org> <201203201019.40486.jhb@freebsd.org> <CADLo839Ef3bu_14AdexOWapOacFLk3MM9HK-oNLmtA52Cc9C6w@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday, March 20, 2012 5:20:04 pm Chris Rees wrote:
> On 20 March 2012 14:19, John Baldwin <jhb@freebsd.org> wrote:
> > On Monday, March 19, 2012 5:39:53 pm Doug Barton wrote:
> >> On 3/19/2012 12:37 PM, Dimitry Andric wrote:
> >> > It would be much nicer to be able to write:
> >> >
> >> > .if defined(FOO)
> >> >   .if defined(BAR)
> >> >     CFLAGS+=        -DFOO_BAR
> >> >   .endif
> >> > .endif
> >>
> >> Take a look at /usr/ports/Mk/bsd.port.mk for how this can be done.
> >
> > Hmm, do yoo have a specific example?  The bits in I see in bsd.port.mk 
suffer
> > from the limitation Dimitry raises, e.g.:
> >
> > .if defined(OPTIONS)
> > # include OPTIONSFILE first if exists
> > .       if exists(${OPTIONSFILE}) && !make(rmconfig)
> > .       include "${OPTIONSFILE}"
> > .       endif
> > .       if exists(${OPTIONSFILE}.local)
> > .       include "${OPTIONSFILE}.local"
> > .       endif
> > WITHOUT:=
> > WITH:=
> > .       if defined(OPTIONS)
> > REALOPTIONS=${OPTIONS:C/".*"//g}
> > .       for O in ${REALOPTIONS}
> > RO:=${O}
> > .       if ${RO:L} == off
> > WITHOUT:=       ${WITHOUT} ${OPT}
> > .       endif
> > .       if ${RO:L} == on
> > WITH:=          ${WITH} ${OPT}
> > .       endif
> > OPT:=${RO}
> > .       endfor
> > .       endif
> >
> > That is, all the lines that don't start with a . are not indented, and
> > even this indentation is rather horrible (it doesn't nest, and it
> > has the odd structure of 'if defined(OPTIONS) { if defined(OPTIONS) {} }'.
> 
> I don't see how it's any more horrible than the kernel style's rules
> on indented #ifs (though I can see the reasoning for that)
> 
> It's an unfortunate consequence of the fact that any line starting
> with whitespace must be a shell command-- from before Makefiles were
> allowed conditionals etc.
> 
> It's got to be an improvement on:
> 
> .if defined(ONE)
> .if !defined(TWO)
> .for one in two three four
> .if ${VAR} == ${one}
> .if defined(VERBOSE)
> .warning VAR = one
> .endif
> .endif
> .endfor
> .elif ${VAR} == four
> .if defined(VERBOSE)
> .warning VAR = four
> .endif
> .else
> .warning VAR is not four, and VERBOSE is ignored
> .endif    # XXXX Which one is this for??
> .endif
> 
> which is what a lot of the Makefiles look like... debugging if-less
> endifs etc is infinitely easier if we indent, however horrible it
> looks.
> 
> We shouldn't be *trying* to make Makefiles hard to read ;)

Oh, it may be that I was reading it in less or some such and that bsd.port.mk 
requires 4 space tabs, so when viewed in things like less the indentation 
doesn't actually look like indentation.  In that respect, this is no better 
than the above (and is what bsd.ports.mk looks like to me at least):

.      if defined(ONE)
.      if !defined(TWO)
.      for one in two three four

etc.  To be worthwhile the spacing has to actually look like indentation:

.if defined(ONE)
.  if !defined(TWO)
.    for one in two three four

etc.

Regardless, the

.if defined(OPTIONS)
.    if defined(OPTIONS)
.    endif
.endif

is lame.  You have to admit that at least. :)

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203201728.21049.jhb>