bin/41070: added .warning in make(1) + two fixes
Cyrille Lefevre
cyrille.lefevre at laposte.net
Thu Mar 4 08:00:35 PST 2004
The following reply was made to PR bin/41070; it has been noted by GNATS.
From: Cyrille Lefevre <cyrille.lefevre at laposte.net>
To: freebsd gnats <freebsd-gnats-submit at freebsd.org>,
Juli Mallett <jmallett at freebsd.org>
Cc:
Subject: Re: bin/41070: added .warning in make(1) + two fixes
Date: Thu, 4 Mar 2004 16:53:18 +0100
Hi Juli,
could you commit this PR ?
thanks in advance.
cvs diff against -current (FreeBSD 5.2-CURRENT #1: Sat Jan 31 15:17:05 CET 2004)
added feature : error messages output the current directory a la gnumake
which help a lot to find errors in buildworld parallel make.
ex.:
$ echo 'all:;@false' > Makefile
$ make
*** Error code 1 in /tmp
Stop in /tmp.
Index: compat.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/compat.c,v
retrieving revision 1.36
diff -u -I$Id.*$ -I$.+BSD.*$ -r1.36 compat.c
--- compat.c 3 Oct 2003 21:33:39 -0000 1.36
+++ compat.c 29 Oct 2003 23:44:59 -0000
@@ -356,13 +356,12 @@
} else if (WIFEXITED(reason)) {
status = WEXITSTATUS(reason); /* exited */
if (status != 0) {
- printf ("*** Error code %d", status);
+ printf ("*** Error code %d in %s", status, curdir);
}
} else {
status = WTERMSIG(reason); /* signaled */
- printf ("*** Signal %d", status);
+ printf ("*** Signal %d in %s", status, curdir);
}
-
if (!WIFEXITED(reason) || (status != 0)) {
if (errCheck) {
Index: job.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/job.c,v
retrieving revision 1.48
diff -u -I$Id.*$ -I$.+BSD.*$ -r1.48 job.c
--- job.c 1 Dec 2002 13:38:25 -0000 1.48
+++ job.c 29 Oct 2003 22:54:04 -0000
@@ -808,8 +808,8 @@
MESSAGE(out, job->node);
lastNode = job->node;
}
- (void) fprintf(out, "*** Error code %d%s\n",
- WEXITSTATUS(*status),
+ (void) fprintf(out, "*** Error code %d in %s%s\n",
+ WEXITSTATUS(*status), curdir,
(job->flags & JOB_IGNERR) ? "(ignored)" : "");
if (job->flags & JOB_IGNERR) {
@@ -883,7 +883,8 @@
MESSAGE(out, job->node);
lastNode = job->node;
}
- (void) fprintf(out, "*** Signal %d\n", WTERMSIG(*status));
+ (void) fprintf(out, "*** Signal %d in %s\n",
+ WTERMSIG(*status), curdir);
}
(void) fflush(out);
Index: main.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/main.c,v
retrieving revision 1.86
diff -u -I$Id.*$ -I$.+BSD.*$ -r1.86 main.c
--- main.c 13 Dec 2003 15:26:27 -0000 1.86
+++ main.c 27 Jan 2004 23:30:31 -0000
@@ -127,7 +127,7 @@
static int ReadMakefile(void *, void *);
static void usage(void);
-static char *curdir; /* startup directory */
+char *curdir; /* startup directory */
static char *objdir; /* where we chdir'ed to */
/*-
Index: make.h
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/make.h,v
retrieving revision 1.23
diff -u -I$Id.*$ -I$.+BSD.*$ -r1.23 make.h
--- make.h 10 Oct 2002 19:27:48 -0000 1.23
+++ make.h 29 Oct 2003 22:25:01 -0000
@@ -301,6 +301,7 @@
extern Lst envFirstVars; /* List of specific variables for which the
* environment should be searched before the
* global context */
+extern char *curdir; /* startup directory */
extern GNode *DEFAULT; /* .DEFAULT rule */
Index: parse.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/parse.c,v
retrieving revision 1.50
diff -u -I$Id.*$ -I$.+BSD.*$ -r1.50 parse.c
--- parse.c 28 Nov 2002 12:47:56 -0000 1.50
+++ parse.c 5 Feb 2003 22:34:23 -0000
@@ -112,6 +112,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 */
@@ -244,6 +245,7 @@
static void ParseUnreadc(int);
static void ParseHasCommands(void *);
static void ParseDoInclude(char *);
+static void ParseDoWarning(char *);
static void ParseDoError(char *);
#ifdef SYSVINCLUDE
static void ParseTraditionalInclude(char *);
@@ -1552,6 +1554,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
*
@@ -1574,8 +1603,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);
}
@@ -1792,7 +1820,7 @@
curFILE = NULL;
curPTR = (PTR *) emalloc (sizeof (PTR));
curPTR->str = curPTR->ptr = str;
- lineno = 0;
+ lineno = savedlineno;
fname = estrdup(fname);
}
@@ -2277,6 +2305,7 @@
if (For_Eval(line)) {
int ok;
free(line);
+ savedlineno = lineno;
do {
/*
* Skip after the matching end
@@ -2377,7 +2406,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++) {
@@ -2390,6 +2422,8 @@
}
*cp2 = '\0';
+
+ cp = Var_Subst(NULL, cp, VAR_GLOBAL, FALSE);
Var_Delete(cp, VAR_GLOBAL);
goto nextLine;
Cyrille Lefevre
--
mailto:cyrille.lefevre at laposte.net
More information about the freebsd-bugs
mailing list