Date: Fri, 26 Jul 2002 15:59:23 +0200 From: Cyrille Lefevre <cyrille.lefevre@laposte.net> To: Ruslan Ermilov <ru@FreeBSD.ORG> Cc: Bruce Evans <bde@zeta.org.au>, Doug Barton <DougB@FreeBSD.ORG>, Mike Barcroft <mike@FreeBSD.ORG>, arch@FreeBSD.ORG, Juli Mallett <jmallett@FreeBSD.ORG> Subject: Re: Standardized make options (or no doesn't always mean no) Message-ID: <20020726135923.GA89959@gits.dyndns.org> In-Reply-To: <20020725170940.GA40574@sunbay.com> References: <3D02AB11.F373AB4@FreeBSD.org> <20020609123557.X21758-100000@gamplex.bde.org> <20020725070145.GE56367@sunbay.com> <20020725165940.GF58642@gits.dyndns.org> <20020725170940.GA40574@sunbay.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jul 25, 2002 at 08:09:40PM +0300, Ruslan Ermilov wrote:
> On Thu, Jul 25, 2002 at 06:59:40PM +0200, Cyrille Lefevre wrote:
> > On Thu, Jul 25, 2002 at 10:01:45AM +0300, Ruslan Ermilov wrote:
[snip]
> > > We'd provide the compatibility knobs that would also trigger a warning
> > > (a .warning to be added to make(1)) that NO_FOO should now be used
> > > instead of NOFOO (or vice versa, if we decide to go that way).
> >
> > .warning isn't needed, let's try w/ .BEGIN :)
well, il fact, a .warning is needed for the newer knob because
it seems you can't do something like this :
.for something
.BEGIN:
something
.endfor
nor
.for something
targets+= ${something}
pseudo_target:
something
.endfor
.BEGIN: ${something}
nor
.for something
pseudo_target: .USE
something
.endfor
.BEGIN: pseudo_target
[snip]
> > I'll try to make another knob for variable conversion such as :
> > NOALIAS -> PPP_NO_ALIAS, etc.
here is the newer knob which is more universal than the first one +
some patches to make... also, a set of command to help the transition :)
OLDBAD= true
NEWGOOD=true
OLDWARN=true
NEWWARN=true
OLDERR= true
NEWERR= false
NOBAD= true
NO_GOOD=true
NOWARN= true
NO_WARN=true
NOERR= true
NO_ERR= false
_ASSOC_VARS= OLDBAD NEWBAD OLDGOOD NEWGOOD OLDWARN NEWWARN OLDERR NEWERR
_NO_VARS= BAD GOOD WARN ERR
.for _var in ${_NO_VARS}
_ASSOC_VARS+= NO${_var} NO_${_var}
.endfor
_old=
.for _new in ${_ASSOC_VARS}
. if empty(_old)
_old= ${_new}
. else
. if defined(${_old})
. if defined(${_new})
. if ${${_old}} != ${${_new}}
. warning both ${_new} and ${_old} are defined with a different value --\
using ${_new} and unsetting ${_old}.
. else
. warning both ${_new} and ${_old} are defined with the same value --\
using ${_new} and unsetting ${_old}.
. endif
. else
. warning ${_new} should be defined in place of ${_old} --\
using ${_new} with the value of ${_old} and unsetting ${_old}.
${_new}:=${${_old}}
. endif
. undef ${_old}
. endif
_old=
. endif
.endfor
all:
@${ECHO_CMD} renamed variables
@${ECHO_CMD} BAD=${OLDBAD}:${NEWBAD}
@${ECHO_CMD} GOOD=${OLDGOOD}:${NEWGOOD}
@${ECHO_CMD} WARN=${OLDWARN}:${NEWWARN}
@${ECHO_CMD} ERR=${OLDERR}:${NEWERR}
@${ECHO_CMD} no variables
@${ECHO_CMD} BAD=${NOBAD}:${NO_BAD}
@${ECHO_CMD} GOOD=${NOGOOD}:${NO_GOOD}
@${ECHO_CMD} WARN=${NOWARN}:${NO_WARN}
@${ECHO_CMD} ERR=${NOERR}:${NO_ERR}
parce.c
saveline added to make lineno happy in `.for' loops.
ParseDoWarning added
Var_Subst added in `.undef' to avoid inconsistencies such as :
.for var in ${vars}
.undef ${var}
.endfor
vs.
.for var in ${vars}
tmp=${var}
.undef ${tmp}
.endfor
Index: parse.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/parse.c,v
retrieving revision 1.22
diff -u -r1.22 parse.c
--- parse.c 28 Aug 1999 01:03:35 -0000 1.22
+++ parse.c 26 Jul 2002 02:12:52 -0000
@@ -120,6 +120,7 @@
static char *fname; /* name of current file (for errors) */
static int lineno; /* line number in current file */
+static int savedlineno; /* saved line number */
static FILE *curFILE = NULL; /* current makefile */
static PTR *curPTR = NULL; /* current makefile */
@@ -252,6 +253,7 @@
static void ParseUnreadc __P((int));
static void ParseHasCommands __P((ClientData));
static void ParseDoInclude __P((char *));
+static void ParseDoWarning __P((char *));
static void ParseDoError __P((char *));
#ifdef SYSVINCLUDE
static void ParseTraditionalInclude __P((char *));
@@ -1557,6 +1559,33 @@
}
/*---------------------------------------------------------------------
+ * ParseDoWarning --
+ * Handle warning directive
+ *
+ * The input is the line minus the ".warning". We substitute variables
+ * and the message or print a warning if the ".warning" directive is
+ * malformed.
+ *
+ *---------------------------------------------------------------------
+ */
+static void
+ParseDoWarning(errmsg)
+ char *errmsg; /* error message */
+{
+ if (!isspace(*errmsg)) {
+ Parse_Error(PARSE_WARNING, "invalid syntax: .warning%s", errmsg);
+ return;
+ }
+
+ while (isspace(*errmsg))
+ errmsg++;
+
+ errmsg = Var_Subst(NULL, errmsg, VAR_GLOBAL, FALSE);
+
+ Parse_Error(PARSE_WARNING, "%s", errmsg);
+}
+
+/*---------------------------------------------------------------------
* ParseDoError --
* Handle error directive
*
@@ -1580,8 +1609,7 @@
errmsg = Var_Subst(NULL, errmsg, VAR_GLOBAL, FALSE);
- /* use fprintf/exit instead of Parse_Error to terminate immediately */
- fprintf(stderr, "\"%s\", line %d: %s\n", fname, lineno, errmsg);
+ Parse_Error(PARSE_FATAL, "%s", errmsg);
exit(1);
}
@@ -1801,7 +1829,7 @@
curFILE = NULL;
curPTR = (PTR *) emalloc (sizeof (PTR));
curPTR->str = curPTR->ptr = str;
- lineno = 0;
+ lineno = savedlineno;
fname = estrdup(fname);
}
@@ -2321,6 +2349,7 @@
if (For_Eval(line)) {
int ok;
free(line);
+ savedlineno = lineno;
do {
/*
* Skip after the matching end
@@ -2421,7 +2450,10 @@
goto nextLine;
} else if (strncmp (cp, "error", 5) == 0) {
ParseDoError(cp + 5);
- goto nextLine;
+ /* NOTREACHED */
+ } else if (strncmp (cp, "warning", 7) == 0) {
+ ParseDoWarning(cp + 7);
+ goto nextLine;
} else if (strncmp(cp, "undef", 5) == 0) {
char *cp2;
for (cp += 5; isspace((unsigned char) *cp); cp++) {
@@ -2434,6 +2466,8 @@
}
*cp2 = '\0';
+
+ cp = Var_Subst(NULL, cp, VAR_GLOBAL, FALSE);
Var_Delete(cp, VAR_GLOBAL);
goto nextLine;
find . -name 'Makefile*' -o -name 'bsd.*.mk' |
egrep -v '[./](new|old)[/:]' |
xargs egrep '(^\. *if(n?def)|defined) *\(?NO[^_]' /dev/null >| /tmp/no1
sed -E -e 's/\.if(n?def)? //;s/exists *([^)]+)//g;s/ *[|&=][|&=] *//g' \
-e 's/!? *defined//g;s/[()\\"]/ /g;s/\${MACHINE_ARCH}//g' \
-e 's/ i386//g;s/alpha//g;s/:/ /g;s/ +/ /g;s|^\./||' /tmp/no1 >| /tmp/no2
awk '{for(i=2;i<=NF;i++)if($i~/^NO[^_]/)print $1,$i}' /tmp/no2 |
sort -u >| /tmp/no3
awk '{for(i=2;i<=NF;i++)if($i~/^NO[^_]/)print $i,$1}' /tmp/no2 |
sort -u >| /tmp/no4
awk '$1!=f{if(f)print f;f=$1;printf "sed -E -i.bak"}
{v=$2;sub("NO","&_",v);
printf " -e %cs/%s([^A-Z_]|$)/%s\\1/g%c ", 39, $2, v, 39}
END{print f}' /tmp/no3 >| /tmp/no5
awk '$1!=v{if(v){sub("NO","",v);print "_NO_VARS+=\t"v};v=$1}
{print "#", $2}
END{sub("NO","",v);print "_NO_VARS+=\t"v}' /tmp/no4 >| /tmp/no6
sed -E -e 's/([^A-Z_])(ALIAS|I4B|KLDLOAD|NAT|NETGRAPH|RADIUS|SUID)([^A-Z_]|$)/\1NO\2 PPP_NO\2\3/' \
-e 't e' -e b -e :e -e 's/_NO_VARS/_ASSOC_VARS/' /tmp/no6 >| /tmp/no7
no5 contains the sed commands to replace every occurences of NOFOO
to NO_FOO in every files
no6 contains the list (_NO_VARS) of NO variables for the above knob
no7 same a no6 except that NOFOO ppp variables have been renamed to PPP_NOFOO
and put in _ASSOC_VARS
hope this help :)
PS : about the make patch, I could submit a PR if you prefer ?
CC -jmallett
Cyrille.
--
Cyrille Lefevre mailto:cyrille.lefevre@laposte.net
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020726135923.GA89959>
