usr.bin/make More patches except phk's MAKE_JOBS_FIFO patches

Max Okumoto okumoto at ucsd.edu
Thu Nov 25 01:59:57 PST 2004


patch-4.27      Reduce select timeout.
--------------------------------------------------------------
        PatchSet 328 Date: 2003/12/19 11:18:37 Author: scottl
                Change the select timeout from 100ms to 2 seconds
                now that SIGCHILD is handled.
patch-4.28      Standards patch.
--------------------------------------------------------------
        PatchSet 329 Date: 2004/01/10 16:30:29 Author: ru
                Moved the code for :U and :L modifiers where it
                belongs, so that the fallback for SysV (now in
                POSIX) variable substitution works for old_string
                arguments starting with 'U' or 'L'.
        PatchSet 330 Date: 2004/01/12 10:35:46 Author: harti
                Allow variable substitutions in SYSV variable
                substitutions like $(SRC:.c=$O). This brings us
                closer to other makes.  Obtained from: NetBSD
patch-4.29      NetBSD compat
--------------------------------------------------------------
        PatchSet 335 Date: 2004/03/09 17:36:55 Author: ru
                Make it possible to ``.undef ${VAR}'' (expanding
                VAR to get the variable name to undef).
patch-4.30      Better debug output
--------------------------------------------------------------
        PatchSet 334 Date: 2004/03/09 08:09:33 Author: ru
                Fixed line numbering inside the .for loops.
        PatchSet 336 Date: 2004/03/10 21:51:06 Author: ru
                Reworked the fix to print the useful line number
                on error in the .for loop:
                - Replaced four global variables in parse.c with
                  one.
                - Made Parse_FromString() accept the "lineno" as
                  an argument.
                - Fixed line numbering when there are escaped
                  newlines in the body of the .for loop.
patch-4.31      Add new functionality .warning
--------------------------------------------------------------
        PatchSet 339 Date: 2004/04/12 18:57:51 Author: ru
                Added the new .warning directive.
        PatchSet 340 Date: 2004/04/12 19:00:54 Author: ru
                Document the new .warning directive.
patch-4.32      Fix docs.
--------------------------------------------------------------
        PatchSet 343 Date: 2004/05/19 10:51:58 Author: ru
                Markup nits.
        PatchSet 347 Date: 2004/07/02 23:22:27 Author: ru
                Mechanically kill hard sentence breaks.
        PatchSet 349 Date: 2004/07/18 03:26:30 Author: keramida
                Remove the dependency of the :C/regexp/replacement/
                variable modifier from the :S modifier which follows
                a bit further below.  This way the reader can read
                each of these two descriptions without having to
                jump back and forth in the manpage.  PR: docs/26943
        PatchSet 350 Date: 2004/07/19 15:42:57 Author: harti
                Make it clearer what means 'won't work'
                for .if string == ${VAR}.
                Replace the use of '=' in conditionals in the
                examples by the more correct '=='.
                Clarify the example explaining that .for expansion
                takes place before .if handling by showing the
                correct code instead of saying 'the other way
                around'. Change a variable name there so the example
                is more parseable to the human reader.  PR: docs/65400
patch-4.33      Better diagnostic.
--------------------------------------------------------------
        PatchSet 351 Date: 2004/07/20 08:42:06 Author: harti
                Improve make's diagnostic of mistmatched .if-.endif.
                This patch is slightly different from the patch in
                the PR. The problem is, that make handles .if clauses
                inside false .if clauses simply by counting them -
                it doesn't put them onto the conditional stack, nor
                even parses them so we need an extra line number
                stack for these ifs.  PR: bin/61257
---------------------
        PatchSet 352 Date: 2004/07/22 12:12:01 Author: harti
                Fix handling of comments on .elif lines. The patch
                given in a followup to the PR failed, because the
                line skipping function is actually called from two
                places in the code to do quite different things
                (this should be two functions probably): in a false
                .if to skip to the next line beginning with a dot
                and to collect .for loops. In the seconds case we
                should not skip comments, because they are actually
                harder to handle than we need for the .if case and
                should defer this to the main code.  PR: bin/25627
patch-4.34      Add new functionality '+' flag standards
--------------------------------------------------------------
        PatchSet 353 Date: 2004/07/29 15:29:23 Author: harti
                Implement POSIX's '+' flag for command lines. This
                flag causes a line to be executed even when -n is
                given on the command line to make. This is very
                handy for calls to submakes.
                This is slightly changed from the original patch
                as obtained from NetBSD.  The NetBSD variant prints
                lines which have both '+' and '@' when -n is
                specified. The commited version always obeys '@'.
                Bump MAKE_VERSION so Makefiles can use this
                conditionally.
                PR: standards/66357 (partly)
                Obtained from: NetBSD
        PatchSet 354 Date: 2004/07/29 17:54:42 Author: harti
                Bump the date in .Dd for the recent '+' flag commit.
patch-4.35      Standards.
--------------------------------------------------------------
        PatchSet 356 Date: 2004/08/03 19:56:31 Author: harti
                Put variable assignments from the command line into
                the MAKEFLAGS variable as required by POSIX. This
                causes such variables to be pushed into all sub-makes
                called by the make (except when the MAKEFLAGS
                variable is explicitely changed in the sub-make's
                environment).  This makes them also mostly
                un-overrideable in sub-makes except on the sub-make's
                command line. Therefor specifying 'make CC=icc'
                will cause icc to be used as C compiler in all
                sub-makes no matter what the Makefiles itself try
                to do to the CC variable.
                This patch also corrects the handling of the MFLAGS
                variable. MFLAGS contains all the command line flags
                but not the command line variable assignments. The
                evaluation of the .MFLAGS or .MAKEFLAGS target now
                changes both MFLAGS and MAKEFLAGS (they used to
                change MAKEFLAGS only).  Makefiles can use MFLAGS
                for their own purposes given that they do not except
                MFLAGS to be undefined at the beginning and that
                they don't evaluate .MFLAGS or .MAKEFLAGS.  MFLAGS
                should be removed for POSIX compliance, but it is
                unfortunately heavily used by the X makefiles.
        PatchSet 357 Date: 2004/08/03 20:14:14 Author: harti
                Correct the description of the MFLAGS and .MAKEFLAGS
                variables. Add the MFLAGS target. Document that
                variable assignments from the MAKEFLAGS environment
                variable and the .MAKEFLAGS and .MFLAGS target have
                the same precedence as command line variable
                assignments.
        PatchSet 358 Date: 2004/08/04 16:10:35 Author: harti
                Correct the .Dd date. Pluralize 'assignment' in one
                place.
patch-4.36      New functionality for environment and cli variables.
--------------------------------------------------------------
        PatchSet 359 Date: 2004/08/09 17:13:54 Author: harti
                Make explicit that MAKEOBJDIRPREFIX and MAKOBJDIR
                must be set as environment variables and should not
                be set on make's command line. They happen to work
                accidentially as command line variables too when
                none of the sub-makes wants to play games with them
                (because make is putting command line variables
                into the environment and will find them there later
                on). Makefile.inc1 wants to change MAKEOBJDIRPREFIX.
                In this case one cannot set it on the command line.
        PatchSet 362 Date: 2004/09/06 16:25:07 Author: jmg
                remove XXX comment now that the kernel is fixed,
                there isn't any obvious reason to enable this as
                performance didn't significantly change...
patch-4.37
--------------------------------------------------------------
        PatchSet 360 Date: 2004/08/12 12:49:55 Author: harti
                Put variable assignments on .MAKEFLAGS and .MFLAGS
                targets into the .MAKEFLAGS variable so that these
                are also passed to sub-makes.  This makes the
                handling of variables in the command environment
                more consistent.  PR: bin/68853
        PatchSet 361 Date: 2004/08/18 14:25:46 Author: ru
                Document the effects of modifying the .MAKEFLAGS
                internal variable and using the .MAKEFLAGS special
                target, and the differences between them.
patch-4.38      Remove code for remote execution.
--------------------------------------------------------------
        PatchSet 366 Date: 2004/11/04 12:57:41 Author: harti
                Remove the remote stuff from make. This actually
                never worked in our make because the necessary files
                were not imported with the original import.  If
                somebody really needs it, there is still the
                devel/pmake port.
                This is just the first step and removes just
                everything that is ifdef'ed out.  Otherwise the
                code is unchanged.
        PatchSet 367 Date: 2004/11/05 11:41:35 Author: harti
                Now with the remote job support removed there can
                be no remote jobs and no jobs that need to be
                remigrated. Remove the flags and the associated
                code.
        PatchSet 368 Date: 2004/11/11 12:23:39 Author: phk
                Get rid of now unused maxLocal variables.
        PatchSet 369 Date: 2004/11/11 12:52:15 Author: phk
                Get rid of more local/remote leftovers
patch-4.39      Bug fix and code cleanup for POSIX
--------------------------------------------------------------
        PatchSet 370 Date: 2004/11/12 07:57:17 Author: harti
                Fix a (very) long standing bug in make (this has
                been there probably from the beginning). Make used
                to handle all its interrupt-time stuff directly
                from the signal handler, including calls to printf,
                accessing global data and so on. This is of course
                wrong and could provoke a core dump when interrupting
                make. Just set a flag in the signal handler and do
                everything else from the main thread.  PR: bin/29103
        PatchSet 374 Date: 2004/11/17 11:32:46 Author: harti
                Eliminate the define for POSIX and build with Posix
                behaviour.  Our make has been build with POSIX
                enabled from the first day and the ifdef'ed out
                code served no purpose.
patch-4.40      Code cleanup
--------------------------------------------------------------
        PatchSet 365 Date: 2004/10/23 22:36:55 Author: ru
                "unset verbose" is 13 characters, not 10.
        PatchSet 375 Date: 2004/11/22 15:45:57 Author: harti
                Get rid of the shell table sentinel. It isn't needed
                anymore because JobMatchShell returns NULL when no
                shell name matches since revision 1.51.
---------------------
PatchSet 328
Date: 2003/12/19 11:18:37
Author: scottl
Log:
Change the select timeout from 100ms to 2 seconds now that SIGCHILD is
handled.

Members: 
	job.h:1.20->1.21 

Index: job.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- job.h	9 Oct 2002 01:56:02 -0000	1.20
+++ job.h	19 Dec 2003 11:18:37 -0000	1.21
@@ -56,8 +56,8 @@
  * before coming out to see if a child has finished. SEL_SEC is the number of
  * seconds and SEL_USEC is the number of micro-seconds
  */
-#define	SEL_SEC		0
-#define	SEL_USEC	100000
+#define	SEL_SEC		2
+#define	SEL_USEC	0
 #endif /* !USE_KQUEUE */
 
 
---------------------
PatchSet 329
Date: 2004/01/10 16:30:29
Author: ru
Log:
Moved the code for :U and :L modifiers where it belongs, so that
the fallback for SysV (now in POSIX) variable substitution works
for old_string arguments starting with 'U' or 'L'.

Members: 
	var.c:1.44->1.45 

Index: var.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/var.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- var.c	6 Oct 2003 17:37:20 -0000	1.44
+++ var.c	10 Jan 2004 16:30:29 -0000	1.45
@@ -1160,38 +1160,6 @@
 
 	    DEBUGF(VAR, ("Applying :%c to \"%s\"\n", *tstr, str));
 	    switch (*tstr) {
-		case 'U':
-			if (tstr[1] == endc || tstr[1] == ':') {
-				Buffer buf;
-				buf = Buf_Init(MAKE_BSIZE);
-				for (cp = str; *cp ; cp++)
-					Buf_AddByte(buf, (Byte) toupper(*cp));
-
-				Buf_AddByte(buf, (Byte) '\0');
-				newStr = (char *) Buf_GetAll(buf, (int *) NULL);
-				Buf_Destroy(buf, FALSE);
-
-				cp = tstr + 1;
-				termc = *cp;
-				break;
-			}
-			/* FALLTHROUGH */
-		case 'L':
-			if (tstr[1] == endc || tstr[1] == ':') {
-				Buffer buf;
-				buf = Buf_Init(MAKE_BSIZE);
-				for (cp = str; *cp ; cp++)
-					Buf_AddByte(buf, (Byte) tolower(*cp));
-
-				Buf_AddByte(buf, (Byte) '\0');
-				newStr = (char *) Buf_GetAll(buf, (int *) NULL);
-				Buf_Destroy(buf, FALSE);
-
-				cp = tstr + 1;
-				termc = *cp;
-				break;
-			}
-			/* FALLTHROUGH */
 		case 'N':
 		case 'M':
 		{
@@ -1494,6 +1462,22 @@
 		    free(pattern.matches);
 		    break;
 		}
+		case 'L':
+		    if (tstr[1] == endc || tstr[1] == ':') {
+			Buffer buf;
+			buf = Buf_Init(MAKE_BSIZE);
+			for (cp = str; *cp ; cp++)
+			    Buf_AddByte(buf, (Byte) tolower(*cp));
+
+			Buf_AddByte(buf, (Byte) '\0');
+			newStr = (char *) Buf_GetAll(buf, (int *) NULL);
+			Buf_Destroy(buf, FALSE);
+
+			cp = tstr + 1;
+			termc = *cp;
+			break;
+		    }
+		    /* FALLTHROUGH */
 		case 'O':
 		    if (tstr[1] == endc || tstr[1] == ':') {
 			newStr = VarSortWords(str, SortIncreasing);
@@ -1518,6 +1502,22 @@
 			break;
 		    }
 		    /*FALLTHRU*/
+		case 'U':
+		    if (tstr[1] == endc || tstr[1] == ':') {
+			Buffer buf;
+			buf = Buf_Init(MAKE_BSIZE);
+			for (cp = str; *cp ; cp++)
+			    Buf_AddByte(buf, (Byte) toupper(*cp));
+
+			Buf_AddByte(buf, (Byte) '\0');
+			newStr = (char *) Buf_GetAll(buf, (int *) NULL);
+			Buf_Destroy(buf, FALSE);
+
+			cp = tstr + 1;
+			termc = *cp;
+			break;
+		    }
+		    /* FALLTHROUGH */
 		case 'H':
 		    if (tstr[1] == endc || tstr[1] == ':') {
 			newStr = VarModify (str, VarHead, (void *)0);
---------------------
PatchSet 330
Date: 2004/01/12 10:35:46
Author: harti
Log:
Allow variable substitutions in SYSV variable substitutions like
$(SRC:.c=$O). This brings us closer to other makes.

Reviewed by:	ru
Obtained from:	NetBSD

Members: 
	var.c:1.45->1.46 

Index: var.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/var.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- var.c	10 Jan 2004 16:30:29 -0000	1.45
+++ var.c	12 Jan 2004 10:35:46 -0000	1.46
@@ -1592,37 +1592,48 @@
 			 * Now we break this sucker into the lhs and
 			 * rhs. We must null terminate them of course.
 			 */
-			for (cp = tstr; *cp != '='; cp++)
-			    continue;
-			pattern.lhs = tstr;
-			pattern.leftLen = cp - tstr;
-			*cp++ = '\0';
+			cp = tstr;
 
-			pattern.rhs = cp;
-			cnt = 1;
-			while (cnt) {
-			    if (*cp == endc)
-				cnt--;
-			    else if (*cp == startc)
-				cnt++;
-			    if (cnt)
-				cp++;
+			delim = '=';
+			if ((pattern.lhs = VarGetPattern(ctxt,
+			    err, &cp, delim, &pattern.flags, &pattern.leftLen,
+			    NULL)) == NULL) {
+				/* was: goto cleanup */
+				*lengthPtr = cp - start + 1;
+				if (*freePtr)
+				    free(str);
+				if (delim != '\0')
+				    Fatal("Unclosed substitution for %s (%c missing)",
+					  v->name, delim);
+				return (var_Error);
+			}
+
+			delim = endc;
+			if ((pattern.rhs = VarGetPattern(ctxt,
+			    err, &cp, delim, NULL, &pattern.rightLen,
+			    &pattern)) == NULL) {
+				/* was: goto cleanup */
+				*lengthPtr = cp - start + 1;
+				if (*freePtr)
+				    free(str);
+				if (delim != '\0')
+				    Fatal("Unclosed substitution for %s (%c missing)",
+					  v->name, delim);
+				return (var_Error);
 			}
-			pattern.rightLen = cp - pattern.rhs;
-			*cp = '\0';
 
 			/*
 			 * SYSV modifications happen through the whole
 			 * string. Note the pattern is anchored at the end.
 			 */
+			termc = *--cp;
+			delim = '\0';
 			newStr = VarModify(str, VarSYSVMatch,
 					   (void *)&pattern);
 
-			/*
-			 * Restore the nulled characters
-			 */
-			pattern.lhs[pattern.leftLen] = '=';
-			pattern.rhs[pattern.rightLen] = endc;
+			free(pattern.lhs);
+			free(pattern.rhs);
+
 			termc = endc;
 		    } else
 #endif
---------------------
PatchSet 335
Date: 2004/03/09 17:36:55
Author: ru
Log:
Make it possible to ``.undef ${VAR}'' (expanding VAR to get
the variable name to undef).

Submitted by:	Cyrille Lefevre

Members: 
	parse.c:1.51->1.52 

Index: parse.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- parse.c	9 Mar 2004 08:09:33 -0000	1.51
+++ parse.c	9 Mar 2004 17:36:55 -0000	1.52
@@ -2404,6 +2404,7 @@
 	            goto nextLine;	    
 		} else if (strncmp(cp, "undef", 5) == 0) {
 		    cp = stripvarname(cp + 5);
+		    cp = Var_Subst(NULL, cp, VAR_CMD, FALSE);
 		    Var_Delete(cp, VAR_GLOBAL);
 		    goto nextLine;
 		} else if (strncmp(cp, "makeenv", 7) == 0) {
---------------------
PatchSet 334
Date: 2004/03/09 08:09:33
Author: ru
Log:
Fixed line numbering inside the .for loops.

Submitted by:	Cyrille Lefevre

Members: 
	parse.c:1.50->1.51 

Index: parse.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- parse.c	28 Nov 2002 12:47:56 -0000	1.50
+++ parse.c	9 Mar 2004 08:09:33 -0000	1.51
@@ -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 */
@@ -1792,7 +1793,7 @@
     curFILE = NULL;
     curPTR = (PTR *) emalloc (sizeof (PTR));
     curPTR->str = curPTR->ptr = str;
-    lineno = 0;
+    lineno = savedlineno;
     fname = estrdup(fname);
 }
 
@@ -2277,6 +2278,7 @@
 		if (For_Eval(line)) {
 		    int ok;
 		    free(line);
+		    savedlineno = lineno;
 		    do {
 			/*
 			 * Skip after the matching end
---------------------
PatchSet 336
Date: 2004/03/10 21:51:06
Author: ru
Log:
Reworked the fix to print the useful line number on error in
the .for loop:

- Replaced four global variables in parse.c with one.
- Made Parse_FromString() accept the "lineno" as an argument.
- Fixed line numbering when there are escaped newlines in the
  body of the .for loop.

Adopted from:	NetBSD

Members: 
	for.c:1.20->1.21 
	nonints.h:1.19->1.20 
	parse.c:1.52->1.53 

Index: for.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/for.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- for.c	8 Sep 2003 08:23:29 -0000	1.20
+++ for.c	10 Mar 2004 21:51:06 -0000	1.21
@@ -81,6 +81,7 @@
     Buffer	  buf;			/* Unexpanded buffer	*/
     char*	  var;			/* Index name		*/
     Lst  	  lst;			/* List of variables	*/
+    int  	  lineno;		/* Line #		*/
 } For;
 
 static int ForExec(void *, void *);
@@ -254,7 +255,7 @@
     Var_Set(arg->var, name, VAR_GLOBAL);
     DEBUGF(FOR, ("--- %s = %s\n", arg->var, name));
     Parse_FromString(Var_Subst(arg->var, (char *) Buf_GetAll(arg->buf, &len),
-			       VAR_GLOBAL, FALSE));
+			       VAR_GLOBAL, FALSE), arg->lineno);
     Var_Delete(arg->var, VAR_GLOBAL);
 
     return 0;
@@ -275,7 +276,7 @@
  *-----------------------------------------------------------------------
  */
 void
-For_Run(void)
+For_Run(int lineno)
 {
     For arg;
 
@@ -284,6 +285,7 @@
     arg.var = forVar;
     arg.buf = forBuf;
     arg.lst = forLst;
+    arg.lineno = lineno;
     forVar = NULL;
     forBuf = NULL;
     forLst = NULL;
Index: nonints.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/nonints.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- nonints.h	28 Oct 2002 23:33:57 -0000	1.19
+++ nonints.h	10 Mar 2004 21:51:06 -0000	1.20
@@ -59,7 +59,7 @@
 
 /* for.c */
 int For_Eval(char *);
-void For_Run (void);
+void For_Run(int);
 
 /* main.c */
 void Main_ParseArgLine(char *);
@@ -86,7 +86,7 @@
 void Parse_File(char *, FILE *);
 void Parse_Init(void);
 void Parse_End(void);
-void Parse_FromString(char *);
+void Parse_FromString(char *, int);
 Lst Parse_MainName(void);
 
 /* str.c */
Index: parse.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- parse.c	9 Mar 2004 17:36:55 -0000	1.52
+++ parse.c	10 Mar 2004 21:51:06 -0000	1.53
@@ -55,9 +55,9 @@
  *	those for the #include <...> are kept in the 'sysIncPath' Lst. The
  *	targets currently being defined are kept in the 'targets' Lst.
  *
- *	The variables 'fname' and 'lineno' are used to track the name
- *	of the current file and the line number in that file so that error
- *	messages can be more meaningful.
+ *	The variables 'curFile.fname' and 'curFile.lineno' are used to track
+ *	the name of the current file and the line number in that file so that
+ *	error messages can be more meaningful.
  *
  * Interface:
  *	Parse_Init	    	    Initialization function which must be
@@ -110,13 +110,6 @@
     char *ptr;
 } PTR;
 
-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 */
-
 static int	    fatals = 0;
 
 static GNode	    *mainNode;	/* The main target to create. This is the
@@ -132,6 +125,8 @@
     PTR *	    p;	    	    /* the char pointer */
 } IFile;
 
+static IFile	    curFile;
+
 static Lst      includes;  	/* stack of IFiles generated by
 				 * #includes */
 Lst         	parseIncPath;	/* list of directories for "..." includes */
@@ -251,7 +246,7 @@
 #endif
 static int ParseEOF(int);
 static char *ParseReadLine(void);
-static char *ParseSkipLine(int);
+static char *ParseSkipLine(int, int);
 static void ParseFinishLine(void);
 
 /*-
@@ -311,7 +306,8 @@
 	va_list ap;
 	va_start(ap, fmt);
 
-	(void)fprintf(stderr, "\"%s\", line %d: ", fname, lineno);
+	(void)fprintf(stderr, "\"%s\", line %d: ",
+	    curFile.fname, curFile.lineno);
 	if (type == PARSE_WARNING)
 		(void)fprintf(stderr, "warning: ");
 	(void)vfprintf(stderr, fmt, ap);
@@ -1576,7 +1572,8 @@
 	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);
+	fprintf(stderr, "\"%s\", line %d: %s\n",
+	    curFile.fname, curFile.lineno, errmsg);
 	exit(1);
 }
 
@@ -1594,8 +1591,8 @@
  *	None
  *
  * Side Effects:
- *	A structure is added to the includes Lst and readProc, lineno,
- *	fname and curFILE are altered for the new file
+ *	A structure is added to the includes Lst and readProc, curFile.lineno,
+ *	curFile.fname and curFile.F are altered for the new file
  *---------------------------------------------------------------------
  */
 static void
@@ -1670,7 +1667,7 @@
 	char	  *prefEnd, *Fname;
 
 	/* Make a temporary copy of this, to be safe. */
-	Fname = estrdup(fname);
+	Fname = estrdup(curFile.fname);
 
 	prefEnd = strrchr (Fname, '/');
 	if (prefEnd != (char *)NULL) {
@@ -1732,11 +1729,7 @@
      * a very nice stack to track how we got here...
      */
     oldFile = (IFile *) emalloc (sizeof (IFile));
-    oldFile->fname = fname;
-
-    oldFile->F = curFILE;
-    oldFile->p = curPTR;
-    oldFile->lineno = lineno;
+    memcpy(oldFile, &curFile, sizeof (IFile));
 
     (void) Lst_AtFront (includes, (void *)oldFile);
 
@@ -1746,12 +1739,12 @@
      * name of the include file so error messages refer to the right
      * place. Naturally enough, we start reading at line number 0.
      */
-    fname = fullname;
-    lineno = 0;
+    curFile.fname = fullname;
+    curFile.lineno = 0;
 
-    curFILE = fopen (fullname, "r");
-    curPTR = NULL;
-    if (curFILE == (FILE * ) NULL) {
+    curFile.F = fopen (fullname, "r");
+    curFile.p = NULL;
+    if (curFile.F == (FILE * ) NULL) {
 	Parse_Error (PARSE_FATAL, "Cannot open %s", fullname);
 	/*
 	 * Pop to previous file
@@ -1771,30 +1764,27 @@
  *	None
  *
  * Side Effects:
- *	A structure is added to the includes Lst and readProc, lineno,
- *	fname and curFILE are altered for the new file
+ *	A structure is added to the includes Lst and readProc, curFile.lineno,
+ *	curFile.fname and curFile.F are altered for the new file
  *---------------------------------------------------------------------
  */
 void
-Parse_FromString(char *str)
+Parse_FromString(char *str, int lineno)
 {
     IFile         *oldFile;	/* state associated with this file */
 
-    DEBUGF(FOR, ("%s\n----\n", str));
+    DEBUGF(FOR, ("%s\n---- at line %d\n", str, lineno));
 
     oldFile = (IFile *) emalloc (sizeof (IFile));
-    oldFile->lineno = lineno;
-    oldFile->fname = fname;
-    oldFile->F = curFILE;
-    oldFile->p = curPTR;
+    memcpy(oldFile, &curFile, sizeof (IFile));
 
     (void) Lst_AtFront (includes, (void *)oldFile);
 
-    curFILE = NULL;
-    curPTR = (PTR *) emalloc (sizeof (PTR));
-    curPTR->str = curPTR->ptr = str;
-    lineno = savedlineno;
-    fname = estrdup(fname);
+    curFile.F = NULL;
+    curFile.p = (PTR *) emalloc (sizeof (PTR));
+    curFile.p->str = curFile.p->ptr = str;
+    curFile.lineno = lineno;
+    curFile.fname = estrdup(curFile.fname);
 }
 
 
@@ -1811,8 +1801,8 @@
  *	None
  *
  * Side Effects:
- *	A structure is added to the includes Lst and readProc, lineno,
- *	fname and curFILE are altered for the new file
+ *	A structure is added to the includes Lst and readProc, curFile.lineno,
+ *	curFile.fname and curFile.F are altered for the new file
  *---------------------------------------------------------------------
  */
 static void
@@ -1881,11 +1871,7 @@
      * a very nice stack to track how we got here...
      */
     oldFile = (IFile *) emalloc (sizeof (IFile));
-    oldFile->fname = fname;
-
-    oldFile->F = curFILE;
-    oldFile->p = curPTR;
-    oldFile->lineno = lineno;
+    memcpy(oldFile, &curFile, sizeof (IFile));
 
     (void) Lst_AtFront (includes, (void *)oldFile);
 
@@ -1895,12 +1881,12 @@
      * name of the include file so error messages refer to the right
      * place. Naturally enough, we start reading at line number 0.
      */
-    fname = fullname;
-    lineno = 0;
+    curFile.fname = fullname;
+    curFile.lineno = 0;
 
-    curFILE = fopen (fullname, "r");
-    curPTR = NULL;
-    if (curFILE == (FILE * ) NULL) {
+    curFile.F = fopen (fullname, "r");
+    curFile.p = NULL;
+    if (curFile.F == (FILE * ) NULL) {
 	Parse_Error (PARSE_FATAL, "Cannot open %s", fullname);
 	/*
 	 * Pop to previous file
@@ -1921,8 +1907,9 @@
  *	CONTINUE if there's more to do. DONE if not.
  *
  * Side Effects:
- *	The old curFILE, is closed. The includes list is shortened.
- *	lineno, curFILE, and fname are changed if CONTINUE is returned.
+ *	The old curFile.F is closed. The includes list is shortened.
+ *	curFile.lineno, curFile.F, and curFile.fname are changed if
+ *	CONTINUE is returned.
  *---------------------------------------------------------------------
  */
 static int
@@ -1935,19 +1922,16 @@
     }
 
     ifile = (IFile *) Lst_DeQueue (includes);
-    free (fname);
-    fname = ifile->fname;
-    lineno = ifile->lineno;
-    if (opened && curFILE) {
-	(void) fclose (curFILE);
-	Var_Append(".MAKEFILE_LIST", "..", VAR_GLOBAL);
-    }
-    if (curPTR) {
-	free(curPTR->str);
-	free(curPTR);
+    free (curFile.fname);
+    if (opened && curFile.F) {
+	(void) fclose (curFile.F);
+	Var_Append(".MAKEFILE_LIST", "..", VAR_GLOBAL);
+    }
+    if (curFile.p) {
+	free(curFile.p->str);
+	free(curFile.p);
     }
-    curFILE = ifile->F;
-    curPTR = ifile->p;
+    memcpy(&curFile, ifile, sizeof (IFile));
     free (ifile);
     return (CONTINUE);
 }
@@ -1964,11 +1948,11 @@
 static int
 ParseReadc(void)
 {
-    if (curFILE)
-	return fgetc(curFILE);
+    if (curFile.F)
+	return fgetc(curFile.F);
 
-    if (curPTR && *curPTR->ptr)
-	return *curPTR->ptr++;
+    if (curFile.p && *curFile.p->ptr)
+	return *curFile.p->ptr++;
     return EOF;
 }
 
@@ -1987,12 +1971,12 @@
 static void
 ParseUnreadc(int c)
 {
-    if (curFILE) {
-	ungetc(c, curFILE);
+    if (curFile.F) {
+	ungetc(c, curFile.F);
 	return;
     }
-    if (curPTR) {
-	*--(curPTR->ptr) = c;
+    if (curFile.p) {
+	*--(curFile.p->ptr) = c;
 	return;
     }
 }
@@ -2003,7 +1987,7 @@
  *	ignore such lines.
  */
 static char *
-ParseSkipLine(int skip)
+ParseSkipLine(int skip, int keep_newline)
 {
     char *line;
     int c, lastc, lineLength = 0;
@@ -2018,8 +2002,11 @@
         while (((c = ParseReadc()) != '\n' || lastc == '\\')
                && c != EOF) {
             if (c == '\n') {
-                Buf_ReplaceLastByte(buf, (Byte)' ');
-                lineno++;
+                if (keep_newline)
+                    Buf_AddByte(buf, (Byte)c);
+                else
+                    Buf_ReplaceLastByte(buf, (Byte)' ');
+                curFile.lineno++;
 
                 while ((c = ParseReadc()) == ' ' || c == '\t')
 		    continue;
@@ -2038,7 +2025,7 @@
             return((char *)NULL);
         }
 
-        lineno++;
+        curFile.lineno++;
         Buf_AddByte(buf, (Byte)'\0');
         line = (char *)Buf_GetAll(buf, &lineLength);
     } while (skip == 1 && line[0] != '.');
@@ -2079,6 +2066,7 @@
     char 	  *line;    	/* Result */
     char          *ep;		/* to strip trailing blanks */
     int	    	  lineLength;	/* Length of result */
+    int		  lineno;	/* Saved line # */
 
     semiNL = FALSE;
     ignDepOp = FALSE;
@@ -2098,7 +2086,7 @@
 	    ignComment = ignDepOp = TRUE;
 	    break;
 	} else if (c == '\n') {
-	    lineno++;
+	    curFile.lineno++;
 	} else if (c == '#') {
 	    ParseUnreadc(c);
 	    break;
@@ -2128,7 +2116,7 @@
 		 * semi-colon and semiNL is TRUE, it will be recognized as a
 		 * newline in the code below this...
 		 */
-		lineno++;
+		curFile.lineno++;
 		lastc = ' ';
 		while ((c = ParseReadc ()) == ' ' || c == '\t') {
 		    continue;
@@ -2229,7 +2217,7 @@
 
 	}
     line_read:
-	lineno++;
+	curFile.lineno++;
 
 	if (lastc != '\0') {
 	    Buf_AddByte (buf, (Byte)lastc);
@@ -2265,7 +2253,7 @@
 		 */
 		do {
 		    free (line);
-		    line = ParseSkipLine(1);
+		    line = ParseSkipLine(1, 0);
 		} while (line && Cond_Eval(line) != COND_PARSE);
 		if (line == NULL)
 		    break;
@@ -2278,12 +2266,12 @@
 		if (For_Eval(line)) {
 		    int ok;
 		    free(line);
-		    savedlineno = lineno;
+		    lineno = curFile.lineno;
 		    do {
 			/*
 			 * Skip after the matching end
 			 */
-			line = ParseSkipLine(0);
+			line = ParseSkipLine(0, 1);
 			if (line == NULL) {
 			    Parse_Error (PARSE_FATAL,
 				     "Unexpected end of file in for loop.\n");
@@ -2294,7 +2282,7 @@
 		    }
 		    while (ok);
 		    if (line != NULL)
-			For_Run();
+			For_Run(lineno);
 		    line = ParseReadLine();
 		}
 		break;
@@ -2359,9 +2347,9 @@
                   *line;	/* the line we're working on */
 
     inLine = FALSE;
-    fname = name;
-    curFILE = stream;
-    lineno = 0;
+    curFile.fname = name;
+    curFile.F = stream;
+    curFile.lineno = 0;
     fatals = 0;
 
     do {
---------------------
PatchSet 339
Date: 2004/04/12 18:57:51
Author: ru
Log:
Added the new .warning directive.

Submitted by:	Cyrille Lefevre

Members: 
	parse.c:1.53->1.54 

Index: parse.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -r1.53 -r1.54
--- parse.c	10 Mar 2004 21:51:06 -0000	1.53
+++ parse.c	12 Apr 2004 17:57:51 -0000	1.54
@@ -241,6 +241,7 @@
 static void ParseHasCommands(void *);
 static void ParseDoInclude(char *);
 static void ParseDoError(char *);
+static void ParseDoWarning(char *);
 #ifdef SYSVINCLUDE
 static void ParseTraditionalInclude(char *);
 #endif
@@ -1571,12 +1572,38 @@
 	
 	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",
-	    curFile.fname, curFile.lineno, errmsg);
+	Parse_Error(PARSE_FATAL, "%s", errmsg);
+	/* Terminate immediately. */
 	exit(1);
 }
 
+/*---------------------------------------------------------------------
+ * ParseDoWarning  --
+ *	Handle warning directive
+ *
+ *	The input is the line minus the ".warning".  We substitute variables
+ *	and print the message or just print a warning if the ".warning"
+ *	directive is malformed.
+ *
+ *---------------------------------------------------------------------
+ */
+static void
+ParseDoWarning(char *warnmsg)
+{
+	if (!isspace((unsigned char) *warnmsg)) {
+		Parse_Error(PARSE_WARNING, "invalid syntax: .warning%s",
+		    warnmsg);
+		return;
+	}
+	
+	while (isspace((unsigned char) *warnmsg))
+		warnmsg++;
+	
+	warnmsg = Var_Subst(NULL, warnmsg, VAR_GLOBAL, FALSE);
+
+	Parse_Error(PARSE_WARNING, "%s", warnmsg);
+}
+
 /*-
  *---------------------------------------------------------------------
  * ParseDoInclude  --
@@ -2367,6 +2394,9 @@
 		    goto nextLine;
 		} else if (strncmp (cp, "error", 5) == 0) {
 		    ParseDoError(cp + 5);
+	            goto nextLine;	    
+		} else if (strncmp (cp, "warning", 7) == 0) {
+		    ParseDoWarning(cp + 7);
 	            goto nextLine;	    
 		} else if (strncmp(cp, "undef", 5) == 0) {
 		    char *cp2;
---------------------
PatchSet 340
Date: 2004/04/12 19:00:54
Author: ru
Log:
Document the new .warning directive.

Members: 
	make.1:1.66->1.67 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -r1.66 -r1.67
--- make.1	21 Jan 2004 17:58:33 -0000	1.66
+++ make.1	12 Apr 2004 18:00:54 -0000	1.67
@@ -32,7 +32,7 @@
 .\"	@(#)make.1	8.8 (Berkeley) 6/13/95
 .\" $FreeBSD$
 .\"
-.Dd July 2, 2004
+.Dd April 12, 2004
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -760,9 +760,15 @@
 Terminate processing of the makefile immediately.
 The filename of the
 makefile, the line on which the error was encountered and the specified
-message are printed to standard output and
+message are printed to the standard error output and
 .Nm
 terminates with exit code 1.
+Variables in the message are expanded.
+.It Ic \&.warning Ar message
+Emit a warning message.
+The filename of the makefile,
+the line on which the warning was encountered,
+and the specified message are printed to the standard error output.
 Variables in the message are expanded.
 .El
 .Pp
---------------------
PatchSet 343
Date: 2004/05/19 10:51:58
Author: ru
Log:
Markup nits.

Members: 
	make.1:1.67->1.68 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- make.1	12 Apr 2004 18:00:54 -0000	1.67
+++ make.1	19 May 2004 09:51:58 -0000	1.68
@@ -753,13 +753,13 @@
 .Fl I
 option are searched before the system
 makefile directory.
-.It Ic \&.undef Ar variable
+.It Ic .undef Ar variable
 Un-define the specified global variable.
 Only global variables may be un-defined.
 .It Ic \&.makeenv Ar variable
 Set the environment flag for a preexisting global variable.  The current
 and future contents of the variable will be exported to the environment.
-.It Ic \&.error Ar message
+.It Ic .error Ar message
 Terminate processing of the makefile immediately.
 The filename of the
 makefile, the line on which the error was encountered and the specified
@@ -764,7 +764,7 @@
 .Nm
 terminates with exit code 1.
 Variables in the message are expanded.
-.It Ic \&.warning Ar message
+.It Ic .warning Ar message
 Emit a warning message.
 The filename of the makefile,
 the line on which the warning was encountered,
@@ -779,7 +779,7 @@
 The following conditionals are supported:
 .Bl -tag -width Ds
 .It Xo
-.Ic \&.if
+.Ic .if
 .Oo \&! Oc Ns Ar expression
 .Op Ar operator expression ...
 .Xc
@@ -863,7 +863,7 @@
 .Ar operator
 may be any one of the following:
 .Bl -tag -width "Cm XX"
-.It Cm \&|\&|
+.It Cm ||
 logical
 .Tn OR
 .It Cm &&
@@ -972,7 +972,7 @@
 .Bl -tag -width indent -compact
 .It Ic .for Ar variable Ic in Ar expression
 .It <make-rules>
-.It Ic \&.endfor
+.It Ic .endfor
 .El
 .Pp
 After the for
@@ -986,7 +986,7 @@
 inside the body of the for loop.
 .Sh COMMENTS
 Comments begin with a hash
-.Pq Ql \&#
+.Pq Ql #
 character, anywhere but in a shell
 command line, and continue to the end of the line.
 .Sh SPECIAL SOURCES
---------------------
PatchSet 347
Date: 2004/07/02 23:22:27
Author: ru
Log:
Mechanically kill hard sentence breaks.

Members: 
	make.1:1.70->1.71 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -r1.70 -r1.71
--- make.1	2 Jul 2004 12:34:13 -0000	1.70
+++ make.1	2 Jul 2004 22:22:27 -0000	1.71
@@ -347,7 +347,7 @@
 .It Ic \&?=
 Assign the value to the variable if it is not already defined.
 .It Ic \&:=
-Assign with expansion, i.e. expand the value before assigning it
+Assign with expansion, i.e., expand the value before assigning it
 to the variable.
 Normally, expansion is not done until the variable is referenced.
 .It Ic \&!=
@@ -1058,7 +1058,7 @@
 detected and targets that form loops will be silently ignored.
 .El
 .Sh "SPECIAL TARGETS"
-Special targets may not be included with other targets, i.e. they must be
+Special targets may not be included with other targets, i.e., they must be
 the only target specified.
 .Bl -tag -width Ic
 .It Ic .BEGIN
---------------------
PatchSet 349
Date: 2004/07/18 03:26:30
Author: keramida
Log:
Remove the dependency of the :C/regexp/replacement/ variable modifier
from the :S modifier which follows a bit further below.  This way the
reader can read each of these two descriptions without having to jump
back and forth in the manpage.

PR:		docs/26943
Submitted by:	Alex Kapranoff <alex at xxxxxxxxxxxxxxxxxxxxxxxxxx>

Members: 
	make.1:1.71->1.72 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -r1.71 -r1.72
--- make.1	2 Jul 2004 22:22:27 -0000	1.71
+++ make.1	18 Jul 2004 02:26:30 -0000	1.72
@@ -618,16 +618,15 @@
 .No \&/ Op Cm 1g
 .Xc
 .Sm on
-The
-.Cm C
-modifier is just like the
-.Cm S
-modifier except that the old and new strings, instead of being
-simple strings, are an extended regular expression (see
+Modify each word of the value,
+substituting every match of the extended regular expression
+.Ar pattern
+(see
 .Xr re_format 7 )
-and an
+with the
 .Xr ed 1 Ns \-style
-replacement string.
+.Ar replacement
+string.
 Normally, the first occurrence of the pattern in
 each word of the value is changed.
 The
---------------------
PatchSet 350
Date: 2004/07/19 15:42:57
Author: harti
Log:
Make it clearer what means 'won't work' for .if string == ${VAR}.

Replace the use of '=' in conditionals in the examples
by the more correct '=='.

Clarify the example explaining that .for expansion takes place before
. if handling by showing the correct code instead of saying 'the other
way around'. Change a variable name there so the example is more parseable
to the human reader.

PR:		docs/65400
Submitted by:	Roman Neuhauser <neuhauser at xxxxxxxxx>

Members: 
	make.1:1.72->1.73 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -r1.72 -r1.73
--- make.1	18 Jul 2004 02:26:30 -0000	1.72
+++ make.1	19 Jul 2004 14:42:57 -0000	1.73
@@ -1270,19 +1270,26 @@
 Currently, the only form that works is
 .Ql .if ${VAR} op something
 For instance, you should write tests as
-.Ql .if ${VAR} = "string"
-not the other way around, which doesn't work.
+.Ql .if ${VAR} == "string"
+not the other way around, which would give you an error.
 .Pp
 For loops are expanded before tests, so a fragment such as:
 .Bd -literal -offset indent
-\&.for TMACHINE in ${SHARED_ARCHS}
-\&.if ${TMACHINE} = ${MACHINE}
+\&.for ARCH in ${SHARED_ARCHS}
+\&.if ${ARCH} == ${MACHINE}
      ...
 \&.endif
 \&.endfor
 .Ed
 .Pp
-won't work, and should be rewritten the other way around.
+won't work, and should be rewritten as:
+.Bd -literal -offset indent
+\&.for ARCH in ${SHARED_ARCHS}
+\&.if ${MACHINE} == ${ARCH} 
+     ...
+\&.endif
+\&.endfor
+.Ed
 .Pp
 The parsing code is broken with respect to handling a semicolon
 after a colon, so a fragment like this will fail:
---------------------
PatchSet 351
Date: 2004/07/20 08:42:06
Author: harti
Log:
Improve make's diagnostic of mistmatched .if-.endif. This patch is
slightly different from the patch in the PR. The problem is, that
make handles .if clauses inside false .if clauses simply by
counting them - it doesn't put them onto the conditional stack, nor even
parses them so we need an extra line number stack for these ifs.

PR:		bin/61257
Submitted by:	Mikhail Teterin <mi at xxxxxxxxxxxxxxxxx>

Members: 
	cond.c:1.27->1.28 
	make.h:1.23->1.24 
	parse.c:1.55->1.56 

Index: cond.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/cond.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- cond.c	7 Sep 2003 02:16:10 -0000	1.27
+++ cond.c	20 Jul 2004 07:42:06 -0000	1.28
@@ -133,8 +133,10 @@
 #define	MAXIF		30	  /* greatest depth of #if'ing */
 
 static Boolean	  condStack[MAXIF]; 	/* Stack of conditionals's values */
+static int	  condLineno[MAXIF];	/* Line numbers of the opening .if */
 static int  	  condTop = MAXIF;  	/* Top-most conditional */
 static int  	  skipIfLevel=0;    	/* Depth of skipped conditionals */
+static int	  skipIfLineno[MAXIF];  /* Line numbers of skipped .ifs */
 static Boolean	  skipLine = FALSE; 	/* Whether the parse module is skipping
 					 * lines */
 
@@ -1047,8 +1049,10 @@
     Boolean 	    isElse;
     Boolean 	    value = FALSE;
     int	    	    level;  	/* Level at which to report errors. */
+    int		    lineno;
 
     level = PARSE_FATAL;
+    lineno = curFile.lineno;
 
     for (line++; *line == ' ' || *line == '\t'; line++) {
 	continue;
@@ -1109,6 +1113,7 @@
 		return (COND_INVALID);
 	    } else if (skipIfLevel == 0) {
 		value = !condStack[condTop];
+		lineno = condLineno[condTop];
 	    } else {
 		return (COND_SKIP);
 	    }
@@ -1130,6 +1135,7 @@
 		 * undefined, for which there's an enclosing ifdef that
 		 * we're skipping...
 		 */
+	        skipIfLineno[skipIfLevel - 1] = lineno;
 		return(COND_SKIP);
 	    }
 	} else if (skipLine) {
@@ -1137,6 +1143,7 @@
 	     * Don't even try to evaluate a conditional that's not an else if
 	     * we're skipping things...
 	     */
+	    skipIfLineno[skipIfLevel] = lineno;
 	    skipIfLevel += 1;
 	    return(COND_SKIP);
 	}
@@ -1202,6 +1209,7 @@
 	return (COND_INVALID);
     } else {
 	condStack[condTop] = value;
+	condLineno[condTop] = lineno;
 	skipLine = !value;
 	return (value ? COND_PARSE : COND_SKIP);
     }
@@ -1223,9 +1231,20 @@
 void
 Cond_End(void)
 {
+    int level;
+
     if (condTop != MAXIF) {
-	Parse_Error(PARSE_FATAL, "%d open conditional%s", MAXIF-condTop,
-		    MAXIF-condTop == 1 ? "" : "s");
+	Parse_Error(PARSE_FATAL, "%d open conditional%s:",
+	    MAXIF - condTop + skipIfLevel,
+ 	    MAXIF - condTop + skipIfLevel== 1 ? "" : "s");
+
+	for (level = skipIfLevel; level > 0; level--)
+		Parse_Error(PARSE_FATAL, "\t%*sat line %d (skipped)",
+		    MAXIF - condTop + level + 1, "", skipIfLineno[level - 1]);
+	for (level = condTop; level < MAXIF; level++)
+		Parse_Error(PARSE_FATAL, "\t%*sat line %d "
+		    "(evaluated to %s)", MAXIF - level + skipIfLevel, "",
+		    condLineno[level], condStack[level] ? "true" : "false");
     }
     condTop = MAXIF;
 }
Index: make.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- make.h	10 Oct 2002 19:27:48 -0000	1.23
+++ make.h	20 Jul 2004 07:42:06 -0000	1.24
@@ -141,6 +141,21 @@
 				 * but the Suff module) */
 } GNode;
 
+
+/*
+ * Definitions for handling #include specifications
+ */
+typedef struct {
+    char *str;
+    char *ptr;
+} PTR;
+typedef struct IFile {
+    char            *fname;	    /* name of previous file */
+    int             lineno;	    /* saved line number */
+    FILE	    *F;		    /* the open stream */
+    PTR		    *p;	    	    /* the char pointer */
+} IFile;
+
 /*
  * The OP_ constants are used when parsing a dependency line as a way of
  * communicating to other parts of the program the way in which a target
@@ -273,6 +288,7 @@
 				 * make(...) statements */
 extern Lst     	dirSearchPath; 	/* The list of directories to search when
 				 * looking for targets */
+extern IFile	curFile;	/* current makefile */
 extern Lst	parseIncPath;	/* The list of directories to search when
 				 * looking for includes */
 
Index: parse.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- parse.c	2 Jul 2004 12:30:28 -0000	1.55
+++ parse.c	20 Jul 2004 07:42:06 -0000	1.56
@@ -105,27 +105,13 @@
 static Lst     	    targCmds;	/* command lines for targets */
 static Boolean	    inLine;	/* true if currently in a dependency
 				 * line or its commands */
-typedef struct {
-    char *str;
-    char *ptr;
-} PTR;
-
 static int	    fatals = 0;
 
 static GNode	    *mainNode;	/* The main target to create. This is the
 				 * first target on the first dependency
 				 * line in the first makefile */
-/*
- * Definitions for handling #include specifications
- */
-typedef struct IFile {
-    char           *fname;	    /* name of previous file */
-    int             lineno;	    /* saved line number */
-    FILE *          F;		    /* the open stream */
-    PTR *	    p;	    	    /* the char pointer */
-} IFile;
 
-static IFile	    curFile;
+IFile	    	curFile;	/* current makefile */
 
 static Lst      includes;  	/* stack of IFiles generated by
 				 * #includes */
---------------------
PatchSet 352
Date: 2004/07/22 12:12:01
Author: harti
Log:
Fix handling of comments on .elif lines. The patch given in a followup
to the PR failed, because the line skipping function is actually called
from two places in the code to do quite different things (this should
be two functions probably): in a false .if to skip to the next line
beginning with a dot and to collect .for loops. In the seconds case we
should not skip comments, because they are actually harder to handle than
we need for the .if case and should defer this to the main code.

PR:		bin/25627
Submitted by:	Seth Kingsley (original patch)

Members: 
	parse.c:1.56->1.57 

Index: parse.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -r1.56 -r1.57
--- parse.c	20 Jul 2004 07:42:06 -0000	1.56
+++ parse.c	22 Jul 2004 11:12:01 -0000	1.57
@@ -2021,6 +2021,13 @@
 
         while (((c = ParseReadc()) != '\n' || lastc == '\\')
                && c != EOF) {
+            if (skip && c == '#' && lastc != '\\') {
+		/* let a comment be terminated even by an escaped \n.
+		 * This is consistent to comment handling in ParseReadLine */
+                while ((c = ParseReadc()) != '\n' && c != EOF)
+		    ;
+		break;
+	    }
             if (c == '\n') {
                 if (keep_newline)
                     Buf_AddByte(buf, (Byte)c);
---------------------
PatchSet 353
Date: 2004/07/29 15:29:23
Author: harti
Log:
Implement POSIX's '+' flag for command lines. This flag causes a line
to be executed even when -n is given on the command line to make. This is
very handy for calls to submakes.

This is slightly changed from the original patch as obtained from NetBSD.
The NetBSD variant prints lines which have both '+' and '@' when -n
is specified. The commited version always obeys '@'.

Bump MAKE_VERSION so Makefiles can use this conditionally.

PR:		standards/66357 (partly)
Submitted by:	Mark Baushke <mdb at xxxxxxxxxxx>
Obtained from:	NetBSD

Members: 
	Makefile:1.30->1.31 
	compat.c:1.36->1.37 
	job.c:1.49->1.50 
	make.1:1.73->1.74 
	nonints.h:1.20->1.21 

Index: Makefile
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/Makefile,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- Makefile	28 Oct 2002 23:33:57 -0000	1.30
+++ Makefile	29 Jul 2004 14:29:23 -0000	1.31
@@ -15,3 +15,3 @@
 
 NOSHARED?=	YES
 
-CFLAGS+=-DMAKE_VERSION=\"5200208240\"
+CFLAGS+=-DMAKE_VERSION=\"5200407290\"
Index: compat.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/compat.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- compat.c	3 Oct 2003 21:33:39 -0000	1.36
+++ compat.c	29 Jul 2004 14:29:23 -0000	1.37
@@ -80,7 +80,6 @@
 static GNode	    *curTarg = NULL;
 static GNode	    *ENDNode;
 static void CompatInterrupt(int);
-static int CompatRunCommand(void *, void *);
 static int CompatMake(void *, void *);
 static int shellneed(char *);
 
@@ -88,6 +87,20 @@
 	"alias", "cd", "eval", "exec", "exit", "read", "set", "ulimit", 
 	"unalias", "umask", "unset", "wait", ":", 0};
 
+static void
+CompatInit(void)
+{
+    char    	  *cp;	    /* Pointer to string of shell meta-characters */
+
+    for (cp = "#=|^(){};&<>*?[]:$`\\\n"; *cp != '\0'; cp++) {
+	meta[(unsigned char) *cp] = 1;
+    }
+    /*
+     * The null character serves as a sentinel in the string.
+     */
+    meta[0] = 1;
+}
+
 /*-
  *-----------------------------------------------------------------------
  * CompatInterrupt --
@@ -123,7 +136,7 @@
 	if (signo == SIGINT) {
 	    gn = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
 	    if (gn != NULL) {
-		Lst_ForEach(gn->commands, CompatRunCommand, (void *)gn);
+		Lst_ForEach(gn->commands, Compat_RunCommand, (void *)gn);
 	    }
 	}
 
@@ -162,7 +175,7 @@
 
 /*-
  *-----------------------------------------------------------------------
- * CompatRunCommand --
+ * Compat_RunCommand --
  *	Execute the next command for a target. If the command returns an
  *	error, the node's made field is set to ERROR and creation stops.
  *	The node from which the command came is also given.
@@ -175,12 +188,13 @@
  *
  *-----------------------------------------------------------------------
  */
-static int
-CompatRunCommand (void *cmdp, void *gnp)
+int
+Compat_RunCommand (void *cmdp, void *gnp)
 {
     char    	  *cmdStart;	/* Start of expanded command */
     char	  *cp;
     Boolean 	  silent,   	/* Don't print command */
+		  doit,		/* Execute even in -n */
 		  errCheck; 	/* Check errors */
     int 	  reason;   	/* Reason for child's death */
     int	    	  status;   	/* Description of child's death */
@@ -204,6 +218,7 @@
 #endif
     silent = gn->type & OP_SILENT;
     errCheck = !(gn->type & OP_IGNORE);
+    doit = FALSE;
 
     cmdNode = Lst_Member (gn->commands, (void *)cmd);
     cmdStart = Var_Subst (NULL, cmd, gn, FALSE);
@@ -232,11 +247,22 @@
 	return(0);
     }
 
-    while ((*cmd == '@') || (*cmd == '-')) {
-	if (*cmd == '@') {
+    while ((*cmd == '@') || (*cmd == '-') || (*cmd == '+')) {
+	switch (*cmd) {
+
+	  case '@':
 	    silent = DEBUG(LOUD) ? FALSE : TRUE;
-	} else {
+	    break;
+
+	  case '-':
 	    errCheck = FALSE;
+	    break;
+
+	  case '+':
+	    doit = TRUE;
+	    if (!meta[0])		/* we came here from jobs */
+		CompatInit();
+	    break;
 	}
 	cmd++;
     }
@@ -255,9 +281,9 @@
 
     /*
      * Print the command before echoing if we're not supposed to be quiet for
-     * this one. We also print the command if -n given.
+     * this one. We also print the command if -n given, but not if '+'.
      */
-    if (!silent || noExecute) {
+    if (!silent || (noExecute && !doit)) {
 	printf ("%s\n", cmd);
 	fflush(stdout);
     }
@@ -266,7 +292,7 @@
      * If we're not supposed to execute any commands, this is as far as
      * we go...
      */
-    if (noExecute) {
+    if (!doit && noExecute) {
 	return (0);
     }
 
@@ -470,7 +496,7 @@
 
 	/*
 	 * Alter our type to tell if errors should be ignored or things
-	 * should not be printed so CompatRunCommand knows what to do.
+	 * should not be printed so Compat_RunCommand knows what to do.
 	 */
 	if (Targ_Ignore (gn)) {
 	    gn->type |= OP_IGNORE;
@@ -486,7 +512,7 @@
 	     */
 	    if (!touchFlag) {
 		curTarg = gn;
-		Lst_ForEach (gn->commands, CompatRunCommand, (void *)gn);
+		Lst_ForEach (gn->commands, Compat_RunCommand, (void *)gn);
 		curTarg = NULL;
 	    } else {
 		Job_Touch (gn, gn->type & OP_SILENT);
@@ -625,10 +651,11 @@
 void
 Compat_Run(Lst targs)
 {
-    char    	  *cp;	    /* Pointer to string of shell meta-characters */
     GNode   	  *gn = NULL;/* Current root target */
     int	    	  errors;   /* Number of targets not remade due to errors */
 
+    CompatInit();
+
     if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
 	signal(SIGINT, CompatInterrupt);
     }
@@ -642,14 +669,6 @@
 	signal(SIGQUIT, CompatInterrupt);
     }
 
-    for (cp = "#=|^(){};&<>*?[]:$`\\\n"; *cp != '\0'; cp++) {
-	meta[(unsigned char) *cp] = 1;
-    }
-    /*
-     * The null character serves as a sentinel in the string.
-     */
-    meta[0] = 1;
-
     ENDNode = Targ_FindNode(".END", TARG_CREATE);
     /*
      * If the user has defined a .BEGIN target, execute the commands attached
@@ -658,7 +677,7 @@
     if (!queryFlag) {
 	gn = Targ_FindNode(".BEGIN", TARG_NOCREATE);
 	if (gn != NULL) {
-	    Lst_ForEach(gn->commands, CompatRunCommand, (void *)gn);
+	    Lst_ForEach(gn->commands, Compat_RunCommand, (void *)gn);
             if (gn->made == ERROR) {
                 printf("\n\nStop.\n");
                 exit(1);
@@ -693,6 +712,6 @@
      * If the user has defined a .END target, run its commands.
      */
     if (errors == 0) {
-	Lst_ForEach(ENDNode->commands, CompatRunCommand, (void *)gn);
+	Lst_ForEach(ENDNode->commands, Compat_RunCommand, (void *)gn);
     }
 }
Index: job.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- job.c	20 Apr 2004 22:04:12 -0000	1.49
+++ job.c	29 Jul 2004 14:29:23 -0000	1.50
@@ -550,13 +550,30 @@
     cmdTemplate = "%s\n";
 
     /*
-     * Check for leading @' and -'s to control echoing and error checking.
+     * Check for leading @', -' or +'s to control echoing, error checking,
+     * and execution on -n.
      */
-    while (*cmd == '@' || *cmd == '-') {
-	if (*cmd == '@') {
+    while (*cmd == '@' || *cmd == '-' || *cmd == '+') {
+	switch (*cmd) {
+
+	  case '@':
 	    shutUp = DEBUG(LOUD) ? FALSE : TRUE;
-	} else {
+	    break;
+
+	  case '-':
 	    errOff = TRUE;
+	    break;
+
+	  case '+':
+	    if (noSpecials) {
+		/*
+		 * We're not actually exececuting anything...
+		 * but this one needs to be - use compat mode just for it.
+		 */
+		Compat_RunCommand(cmdp, job->node);
+		return (0);
+	    }
+	    break;
 	}
 	cmd++;
     }
Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -r1.73 -r1.74
--- make.1	19 Jul 2004 14:42:57 -0000	1.73
+++ make.1	29 Jul 2004 14:29:23 -0000	1.74
@@ -320,10 +320,11 @@
 .Sq Ic ::
 operator is used.
 .Pp
-If the first or first two characters of the command line are
-.Sq Ic @
-and/or
+If the first characters of the command line are
+.Sq Ic @ ,
 .Sq Ic \- ,
+and/or
+.Sq Ic + ,
 the command is treated specially.
 A
 .Sq Ic @
@@ -331,6 +332,11 @@
 A
 .Sq Ic \-
 causes any non-zero exit status of the command line to be ignored.
+A
+.Sq Ic +
+causes the command to be executed even if
+.Fl n
+is specified on the command line.
 .Sh VARIABLE ASSIGNMENTS
 Variables in
 .Nm
Index: nonints.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/nonints.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- nonints.h	10 Mar 2004 21:51:06 -0000	1.20
+++ nonints.h	29 Jul 2004 14:29:23 -0000	1.21
@@ -52,6 +52,7 @@
 
 /* compat.c */
 void Compat_Run(Lst);
+int Compat_RunCommand(void *, void *);
 
 /* cond.c */
 int Cond_Eval(char *);
---------------------
PatchSet 354
Date: 2004/07/29 17:54:42
Author: harti
Log:
Bump the date in .Dd for the recent '+' flag commit.

Requested by: ru

Members: 
	make.1:1.74->1.75 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- make.1	29 Jul 2004 14:29:23 -0000	1.74
+++ make.1	29 Jul 2004 16:54:42 -0000	1.75
@@ -32,7 +32,7 @@
 .\"	@(#)make.1	8.8 (Berkeley) 6/13/95
 .\" $FreeBSD$
 .\"
-.Dd April 12, 2004
+.Dd July 29, 2004
 .Dt MAKE 1
 .Os
 .Sh NAME
---------------------
PatchSet 356
Date: 2004/08/03 19:56:31
Author: harti
Log:
Put variable assignments from the command line into the MAKEFLAGS
variable as required by POSIX. This causes such variables to be
pushed into all sub-makes called by the make (except when the MAKEFLAGS
variable is explicitely changed in the sub-make's environment).
This makes them also mostly un-overrideable in sub-makes except on the
sub-make's command line. Therefor specifying 'make CC=icc' will cause
icc to be used as C compiler in all sub-makes no matter what the Makefiles
itself try to do to the CC variable.

This patch also corrects the handling of the MFLAGS variable. MFLAGS
contains all the command line flags but not the command line variable
assignments. The evaluation of the .MFLAGS or .MAKEFLAGS target now
changes both MFLAGS and MAKEFLAGS (they used to change MAKEFLAGS only).
Makefiles can use MFLAGS for their own purposes given that they do not
except MFLAGS to be undefined at the beginning and that they don't evaluate
. MFLAGS or .MAKEFLAGS. MFLAGS should be removed for POSIX compliance,
but it is unfortunately heavily used by the X makefiles.

This has been extensively tested by port builds (thanks to portmgr), new
worlds and kernels.

PR:		standards/57295 (1st part above)
Submitted by:	James E. Flemer <jflemer at xxxxxxxxxxxx>
Approved by:	portmgr
Obtained from:	NetBSD (1st part above)
MFC after:	4 weeks

Members: 
	Makefile:1.31->1.32 
	main.c:1.89->1.90 
	nonints.h:1.21->1.22 
	var.c:1.46->1.47 

Index: Makefile
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/Makefile,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- Makefile	29 Jul 2004 14:29:23 -0000	1.31
+++ Makefile	3 Aug 2004 18:56:31 -0000	1.32
@@ -15,4 +15,4 @@
 
 NOSHARED?=	YES
 
-CFLAGS+=-DMAKE_VERSION=\"5200407290\"
+CFLAGS+=-DMAKE_VERSION=\"5200408030\"
Index: main.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/main.c,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -r1.89 -r1.90
--- main.c	3 Aug 2004 18:43:43 -0000	1.89
+++ main.c	3 Aug 2004 18:56:31 -0000	1.90
@@ -132,6 +132,21 @@
 static char *curdir;			/* startup directory */
 static char *objdir;			/* where we chdir'ed to */
 
+/*
+ * Append a flag with an optional argument to MAKEFLAGS and MFLAGS
+ */
+static void
+MFLAGS_append(char *flag, char *arg)
+{
+	Var_Append(MAKEFLAGS, flag, VAR_GLOBAL);
+	if (arg != NULL)
+		Var_Append(MAKEFLAGS, arg, VAR_GLOBAL);
+
+	Var_Append("MFLAGS", flag, VAR_GLOBAL);
+	if (arg != NULL)
+		Var_Append("MFLAGS", arg, VAR_GLOBAL);
+}
+
 /*-
  * MainParseArgs --
  *	Parse a given argument vector. Called from main() and from
@@ -166,25 +181,22 @@
 			break;
 		case 'D':
 			Var_Set(optarg, "1", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, "-D", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-D", optarg);
 			break;
 		case 'I':
 			Parse_AddIncludeDir(optarg);
-			Var_Append(MAKEFLAGS, "-I", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-I", optarg);
 			break;
 		case 'V':
 			(void)Lst_AtEnd(variables, (void *)optarg);
-			Var_Append(MAKEFLAGS, "-V", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-V", optarg);
 			break;
 		case 'X':
 			expandVars = FALSE;
 			break;
 		case 'B':
 			compatMake = TRUE;
-			Var_Append(MAKEFLAGS, "-B", VAR_GLOBAL);
+			MFLAGS_append("-B", NULL);
 			break;
 #ifdef REMOTE
 		case 'L': {
@@ -196,18 +208,17 @@
 				    optarg);
 				usage();
 			}
-			Var_Append(MAKEFLAGS, "-L", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-L", optarg);
 			break;
 		}
 #endif
 		case 'P':
 			usePipes = FALSE;
-			Var_Append(MAKEFLAGS, "-P", VAR_GLOBAL);
+			MFLAGS_append("-P", NULL);
 			break;
 		case 'S':
 			keepgoing = FALSE;
-			Var_Append(MAKEFLAGS, "-S", VAR_GLOBAL);
+			MFLAGS_append("-S", NULL);
 			break;
 		case 'd': {
 			char *modules = optarg;
@@ -261,27 +272,25 @@
 					warnx("illegal argument to d option -- %c", *modules);
 					usage();
 				}
-			Var_Append(MAKEFLAGS, "-d", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-d", optarg);
 			break;
 		}
 		case 'E':
 			p = emalloc(strlen(optarg) + 1);
 			(void)strcpy(p, optarg);
 			(void)Lst_AtEnd(envFirstVars, (void *)p);
-			Var_Append(MAKEFLAGS, "-E", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-E", optarg);
 			break;
 		case 'e':
 			checkEnvFirst = TRUE;
-			Var_Append(MAKEFLAGS, "-e", VAR_GLOBAL);
+			MFLAGS_append("-e", NULL);
 			break;
 		case 'f':
 			(void)Lst_AtEnd(makefiles, (void *)optarg);
 			break;
 		case 'i':
 			ignoreErrors = TRUE;
-			Var_Append(MAKEFLAGS, "-i", VAR_GLOBAL);
+			MFLAGS_append("-i", NULL);
 			break;
 		case 'j': {
 			char *endptr;
@@ -296,43 +305,41 @@
 #ifndef REMOTE
 			maxLocal = maxJobs;
 #endif
-			Var_Append(MAKEFLAGS, "-j", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-j", optarg);
 			break;
 		}
 		case 'k':
 			keepgoing = TRUE;
-			Var_Append(MAKEFLAGS, "-k", VAR_GLOBAL);
+			MFLAGS_append("-k", NULL);
 			break;
 		case 'm':
 			Dir_AddDir(sysIncPath, optarg);
-			Var_Append(MAKEFLAGS, "-m", VAR_GLOBAL);
-			Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL);
+			MFLAGS_append("-m", optarg);
 			break;
 		case 'n':
 			noExecute = TRUE;
-			Var_Append(MAKEFLAGS, "-n", VAR_GLOBAL);
+			MFLAGS_append("-n", NULL);
 			break;
 		case 'q':
 			queryFlag = TRUE;
 			/* Kind of nonsensical, wot? */
-			Var_Append(MAKEFLAGS, "-q", VAR_GLOBAL);
+			MFLAGS_append("-q", NULL);
 			break;
 		case 'r':
 			noBuiltins = TRUE;
-			Var_Append(MAKEFLAGS, "-r", VAR_GLOBAL);
+			MFLAGS_append("-r", NULL);
 			break;
 		case 's':
 			beSilent = TRUE;
-			Var_Append(MAKEFLAGS, "-s", VAR_GLOBAL);
+			MFLAGS_append("-s", NULL);
 			break;
 		case 't':
 			touchFlag = TRUE;
-			Var_Append(MAKEFLAGS, "-t", VAR_GLOBAL);
+			MFLAGS_append("-t", NULL);
 			break;
 		case 'v':
 			beVerbose = TRUE;
-			Var_Append(MAKEFLAGS, "-v", VAR_GLOBAL);
+			MFLAGS_append("-v", NULL);
 			break;
 		default:
 		case '?':
@@ -638,6 +645,10 @@
 
 	MainParseArgs(argc, argv);
 
+#ifdef POSIX
+	Var_AddCmdLine(MAKEFLAGS);
+#endif
+
 	/*
 	 * Find where we are...
 	 * All this code is so that we know where we are when we start up
@@ -779,9 +790,6 @@
 		(void)ReadMakefile("Makefile", NULL);
 
 	(void)ReadMakefile(".depend", NULL);
-
-	Var_Append("MFLAGS", Var_Value(MAKEFLAGS, VAR_GLOBAL, &p1), VAR_GLOBAL);
-	free(p1);
 
 	/* Install all the flags into the MAKE envariable. */
 	if (((p = Var_Value(MAKEFLAGS, VAR_GLOBAL, &p1)) != NULL) && *p)
Index: nonints.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/nonints.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- nonints.h	29 Jul 2004 14:29:23 -0000	1.21
+++ nonints.h	3 Aug 2004 18:56:31 -0000	1.22
@@ -136,6 +136,7 @@
 void Var_Append(char *, char *, GNode *);
 Boolean Var_Exists(char *, GNode *);
 char *Var_Value(char *, GNode *, char **);
+void Var_AddCmdLine(char *);
 char *Var_Parse(char *, GNode *, Boolean, int *, Boolean *);
 char *Var_Subst(char *, char *, GNode *, Boolean);
 char *Var_GetTail(char *);
Index: var.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/var.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- var.c	12 Jan 2004 10:35:46 -0000	1.46
+++ var.c	3 Aug 2004 18:56:31 -0000	1.47
@@ -832,6 +832,44 @@
 }
 
 
+#ifdef POSIX
+
+
+/* In POSIX mode, variable assignments passed on the command line are
+ * propagated to sub makes through MAKEFLAGS.
+ */
+void
+Var_AddCmdLine(char *name)
+{
+    const Var *v;
+    LstNode ln;
+    Buffer buf;
+    static const char quotable[] = " \t\n\\'\"";
+    char *s;
+    int first = 1;
+
+    buf = Buf_Init (MAKE_BSIZE);
+
+    for (ln = Lst_First(VAR_CMD->context); ln != NULL;
+	ln = Lst_Succ(ln)) {
+	    if (!first)
+	    	Buf_AddByte(buf, ' ');
+	    first = 0;
+	    /* We assume variable names don't need quoting */
+	    v = (Var *)Lst_Datum(ln);
+	    Buf_AddBytes(buf, strlen(v->name), v->name);
+	    Buf_AddByte(buf, '=');
+	    for (s = Buf_GetAll(v->val, (int *)NULL); *s != '\0'; s++) {
+		if (strchr(quotable, *s))
+		    Buf_AddByte(buf, '\\');
+		Buf_AddByte(buf, *s);
+	    }
+    }
+    Var_Append(name, Buf_GetAll(buf, (int *)NULL), VAR_GLOBAL);
+    Buf_Destroy(buf, 1);
+}
+#endif
+
 /*-
  *-----------------------------------------------------------------------
  * Var_Parse --
---------------------
PatchSet 357
Date: 2004/08/03 20:14:14
Author: harti
Log:
Correct the description of the MFLAGS and .MAKEFLAGS variables. Add
the MFLAGS target. Document that variable assignments from the MAKEFLAGS
environment variable and the .MAKEFLAGS and .MFLAGS target have the
same precedence as command line variable assignments.

Members: 
	make.1:1.75->1.76 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -r1.75 -r1.76
--- make.1	29 Jul 2004 16:54:42 -0000	1.75
+++ make.1	3 Aug 2004 19:14:14 -0000	1.76
@@ -395,7 +395,12 @@
 .It Global variables
 Variables defined in the makefile or in included makefiles.
 .It Command line variables
-Variables defined as part of the command line.
+Variables defined as part of the command line and variables
+obtained from the
+.Ev MAKEFLAGS
+environment variable or the
+.Ic .MAKEFLAGS
+target.
 .It Local variables
 Variables that are defined specific to a certain target.
 The seven local variables are as follows:
@@ -559,9 +564,9 @@
 .Nm Ns 's
 .Va .MAKEFLAGS
 variable.
-Anything specified on
+All options and variable assignment specified on
 .Nm Ns 's
-command line is appended to the
+command line are appended to the
 .Va .MAKEFLAGS
 variable which is then
 entered into the environment as
@@ -570,9 +575,12 @@
 .Nm
 executes.
 .It Va MFLAGS
-A synonym for
-.Va .MAKEFLAGS
-provided for backward compatibility.
+is provided for backward compatibility and
+contains all the options from the
+.Ev MAKEFLAGS
+environment variable plus any options specified on
+.Nm Ns 's
+command line.
 .It Va .TARGETS
 List of targets
 .Nm
@@ -1131,6 +1139,8 @@
 .Fl f
 option will have
 no effect.
+.It Ic .MFLAGS
+Same as above, for backward compatibility.
 .\" XXX: NOT YET!!!!
 .\" .It Ic .NOTPARALLEL
 .\" The named targets are executed in non parallel mode. If no targets are
---------------------
PatchSet 358
Date: 2004/08/04 16:10:35
Author: harti
Log:
Correct the .Dd date. Pluralize 'assignment' in one place.

Requested by: ru

Members: 
	make.1:1.76->1.77 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -r1.76 -r1.77
--- make.1	3 Aug 2004 19:14:14 -0000	1.76
+++ make.1	4 Aug 2004 15:10:35 -0000	1.77
@@ -32,7 +32,7 @@
 .\"	@(#)make.1	8.8 (Berkeley) 6/13/95
 .\" $FreeBSD$
 .\"
-.Dd July 29, 2004
+.Dd August 4, 2004
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -564,7 +564,7 @@
 .Nm Ns 's
 .Va .MAKEFLAGS
 variable.
-All options and variable assignment specified on
+All options and variable assignments specified on
 .Nm Ns 's
 command line are appended to the
 .Va .MAKEFLAGS
---------------------
PatchSet 359
Date: 2004/08/09 17:13:54
Author: harti
Log:
Make explicit that MAKEOBJDIRPREFIX and MAKOBJDIR must be set
as environment variables and should not be set on make's command
line. They happen to work accidentially as command line variables
too when none of the sub-makes wants to play games with them (because
make is putting command line variables into the environment and will
find them there later on). Makefile.inc1 wants to change
MAKEOBJDIRPREFIX. In this case one cannot set it on the command line.

Members: 
	make.1:1.77->1.78 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -r1.77 -r1.78
--- make.1	4 Aug 2004 15:10:35 -0000	1.77
+++ make.1	9 Aug 2004 16:13:54 -0000	1.78
@@ -533,6 +533,13 @@
 .Nm
 is unable to change into any of the remaining three directories,
 then the current directory is used.
+Note, that
+.Ev MAKEOBJDIRPREFIX
+and
+.Ev MAKEOBJDIR
+must be environment variables and should not be set on
+.Nm Ns 's
+command line.
 .Pp
 The
 .Nm
---------------------
PatchSet 362
Date: 2004/09/06 16:25:07
Author: jmg
Log:
remove XXX comment now that the kernel is fixed, there isn't any obvious
reason to enable this as performance didn't significantly change...

MFC after:	3 days

Members: 
	Makefile:1.33->1.34 

Index: Makefile
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/Makefile,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- Makefile	12 Aug 2004 11:49:55 -0000	1.33
+++ Makefile	6 Sep 2004 15:25:07 -0000	1.34
@@ -20,7 +20,7 @@
 CFLAGS+=-D__FBSDID=__RCSID
 .endif
 
-# XXX: kernel currently broken
+# There is no obvious performance improvement currently.
 # CFLAGS+=-DUSE_KQUEUE
 
 main.o: ${MAKEFILE}
---------------------
PatchSet 360
Date: 2004/08/12 12:49:55
Author: harti
Log:
Put variable assignments on .MAKEFLAGS and .MFLAGS targets into
the .MAKEFLAGS variable so that these are also passed to sub-makes.
This makes the handling of variables in the command environment more
consistent.

PR:		bin/68853
Submitted by:	Martin Kamerhofer <data at xxxxxxxxxxxxxx>

Members: 
	Makefile:1.32->1.33 
	main.c:1.90->1.91 
	nonints.h:1.22->1.23 
	var.c:1.47->1.48 

Index: Makefile
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/Makefile,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- Makefile	3 Aug 2004 18:56:31 -0000	1.32
+++ Makefile	12 Aug 2004 11:49:55 -0000	1.33
@@ -15,4 +15,4 @@
 
 NOSHARED?=	YES
 
-CFLAGS+=-DMAKE_VERSION=\"5200408030\"
+CFLAGS+=-DMAKE_VERSION=\"5200408120\"
Index: main.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/main.c,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -r1.90 -r1.91
--- main.c	3 Aug 2004 18:56:31 -0000	1.90
+++ main.c	12 Aug 2004 11:49:55 -0000	1.91
@@ -355,9 +355,14 @@
 	 * on the end of the "create" list.
 	 */
 	for (argv += optind, argc -= optind; *argv; ++argv, --argc)
-		if (Parse_IsVar(*argv))
+		if (Parse_IsVar(*argv)) {
+			char *ptr = Var_Quote(*argv);
+
+			Var_Append(MAKEFLAGS, ptr, VAR_GLOBAL);
+			free(ptr);
+
 			Parse_DoVar(*argv, VAR_CMD);
-		else {
+		} else {
 			if (!**argv)
 				Punt("illegal (null) argument.");
 			if (**argv == '-') {
@@ -644,10 +649,6 @@
 #endif
 
 	MainParseArgs(argc, argv);
-
-#ifdef POSIX
-	Var_AddCmdLine(MAKEFLAGS);
-#endif
 
 	/*
 	 * Find where we are...
Index: nonints.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/nonints.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- nonints.h	3 Aug 2004 18:56:31 -0000	1.22
+++ nonints.h	12 Aug 2004 11:49:55 -0000	1.23
@@ -136,7 +136,7 @@
 void Var_Append(char *, char *, GNode *);
 Boolean Var_Exists(char *, GNode *);
 char *Var_Value(char *, GNode *, char **);
-void Var_AddCmdLine(char *);
+char *Var_Quote(const char *);
 char *Var_Parse(char *, GNode *, Boolean, int *, Boolean *);
 char *Var_Subst(char *, char *, GNode *, Boolean);
 char *Var_GetTail(char *);
Index: var.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/var.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- var.c	3 Aug 2004 18:56:31 -0000	1.47
+++ var.c	12 Aug 2004 11:49:55 -0000	1.48
@@ -815,45 +815,6 @@
     }
 }
 
-
-#ifdef POSIX
-
-
-/* In POSIX mode, variable assignments passed on the command line are
- * propagated to sub makes through MAKEFLAGS.
- */
-void
-Var_AddCmdLine(char *name)
-{
-    const Var *v;
-    LstNode ln;
-    Buffer buf;
-    static const char quotable[] = " \t\n\\'\"";
-    char *s;
-    int first = 1;
-
-    buf = Buf_Init (MAKE_BSIZE);
-
-    for (ln = Lst_First(VAR_CMD->context); ln != NULL;
-	ln = Lst_Succ(ln)) {
-	    if (!first)
-	    	Buf_AddByte(buf, ' ');
-	    first = 0;
-	    /* We assume variable names don't need quoting */
-	    v = (Var *)Lst_Datum(ln);
-	    Buf_AddBytes(buf, strlen(v->name), v->name);
-	    Buf_AddByte(buf, '=');
-	    for (s = Buf_GetAll(v->val, (int *)NULL); *s != '\0'; s++) {
-		if (strchr(quotable, *s))
-		    Buf_AddByte(buf, '\\');
-		Buf_AddByte(buf, *s);
-	    }
-    }
-    Var_Append(name, Buf_GetAll(buf, (int *)NULL), VAR_GLOBAL);
-    Buf_Destroy(buf, 1);
-}
-#endif
-
 /*-
  *-----------------------------------------------------------------------
  * Var_Quote --
@@ -773,7 +772,7 @@
 
 /*-
  *-----------------------------------------------------------------------
- * VarQuote --
+ * Var_Quote --
  *	Quote shell meta-characters in the string
  *
  * Results:
@@ -784,8 +783,8 @@
  *
  *-----------------------------------------------------------------------
  */
-static char *
-VarQuote(char *str)
+char *
+Var_Quote(const char *str)
 {
 
     Buffer  	  buf;
@@ -1526,7 +1486,7 @@
 		    /* FALLTHROUGH */
 		case 'Q':
 		    if (tstr[1] == endc || tstr[1] == ':') {
-			newStr = VarQuote (str);
+			newStr = Var_Quote (str);
 			cp = tstr + 1;
 			termc = *cp;
 			break;
---------------------
PatchSet 361
Date: 2004/08/18 14:25:46
Author: ru
Log:
Document the effects of modifying the .MAKEFLAGS internal
variable and using the .MAKEFLAGS special target, and the
differences between them.

Reviewed by:	harti

Members: 
	make.1:1.78->1.79 

Index: make.1
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/make.1,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -r1.78 -r1.79
--- make.1	9 Aug 2004 16:13:54 -0000	1.78
+++ make.1	18 Aug 2004 13:25:46 -0000	1.79
@@ -32,7 +32,7 @@
 .\"	@(#)make.1	8.8 (Berkeley) 6/13/95
 .\" $FreeBSD$
 .\"
-.Dd August 4, 2004
+.Dd August 18, 2004
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -581,6 +581,15 @@
 for all programs which
 .Nm
 executes.
+By modifying the contents of the
+.Va .MAKEFLAGS
+variable, makefile can alter the contents of the
+.Va MAKEFLAGS
+environment variable made available for all programs which
+.Nm
+executes; compare with the
+.Ic .MAKEFLAGS
+special target below.
 .It Va MFLAGS
 is provided for backward compatibility and
 contains all the options from the
@@ -1146,6 +1155,20 @@
 .Fl f
 option will have
 no effect.
+Flags (except for
+.Fl f )
+and variable assignments specified as the source
+for this target are also appended to the
+.Va .MAKEFLAGS
+internal variable.
+Please note the difference between this target and the
+.Va .MAKEFLAGS
+internal variable: specifying an option or variable
+assignment as the source for this target will affect
+.Em both
+the current makefile and all processes that
+.Nm
+executes.
 .It Ic .MFLAGS
 Same as above, for backward compatibility.
 .\" XXX: NOT YET!!!!
---------------------
PatchSet 366
Date: 2004/11/04 12:57:41
Author: harti
Log:
Remove the remote stuff from make. This actually never worked in our make
because the necessary files were not imported with the original import.
If somebody really needs it, there is still the devel/pmake port.

This is just the first step and removes just everything that is ifdef'ed out.
Otherwise the code is unchanged.

Checked by:	md5

Approved by:	no objections on arch@

Members: 
	job.c:1.52->1.53 
	job.h:1.22->1.23 
	main.c:1.92->1.93 

Index: job.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- job.c	23 Oct 2004 21:36:55 -0000	1.52
+++ job.c	4 Nov 2004 12:57:41 -0000	1.53
@@ -123,12 +123,8 @@
 #include "dir.h"
 #include "job.h"
 #include "pathnames.h"
-#ifdef REMOTE
-#include "rmt.h"
-# define STATIC
-#else
-# define STATIC static
-#endif
+
+#define STATIC static
 
 /*
  * error handling variables
@@ -239,14 +235,12 @@
 				 * running jobs equals the maximum allowed or
 				 * (2) a job can only be run locally, but
 				 * nLocal equals maxLocal */
-#ifndef RMT_WILL_WATCH
 #ifdef USE_KQUEUE
 static int	kqfd;		/* File descriptor obtained by kqueue() */
 #else
 static fd_set  	outputs;    	/* Set of descriptors of pipes connected to
 				 * the output channels of children */
 #endif
-#endif
 
 STATIC GNode   	*lastNode;	/* The node for which output was most recently
 				 * produced. */
@@ -254,15 +248,9 @@
 				 * job when it's not the most-recent job heard
 				 * from */
 
-#ifdef REMOTE
-# define TARG_FMT  "--- %s at %s ---\n" /* Default format */
-# define MESSAGE(fp, gn) \
-	(void) fprintf(fp, targFmt, gn->name, gn->rem.hname);
-#else
-# define TARG_FMT  "--- %s ---\n" /* Default format */
-# define MESSAGE(fp, gn) \
+#define	TARG_FMT  "--- %s ---\n" /* Default format */
+#define	MESSAGE(fp, gn) \
 	(void) fprintf(fp, targFmt, gn->name);
-#endif
 
 /*
  * When JobStart attempts to run a job remotely but can't, and isn't allowed
@@ -311,15 +299,8 @@
 static int JobPrintCommand(void *, void *);
 static int JobSaveCommand(void *, void *);
 static void JobClose(Job *);
-#ifdef REMOTE
-static int JobCmpRmtID(Job *, int);
-# ifdef RMT_WILL_WATCH
-static void JobLocalInput(int, Job *);
-# endif
-#else
 static void JobFinish(Job *, int *);
 static void JobExec(Job *, char **);
-#endif
 static void JobMakeArgv(Job *, char **);
 static void JobRestart(Job *);
 static int JobStart(GNode *, int, Job *);
@@ -348,20 +329,13 @@
 {
     Job	*job = (Job *) jobp;
     int	signo = *(int *) signop;
-#ifdef RMT_WANTS_SIGNALS
-    if (job->flags & JOB_REMOTE) {
-	(void) Rmt_Signal(job, signo);
-    } else {
-	KILL(job->pid, signo);
-    }
-#else
+
     /*
      * Assume that sending the signal to job->pid will signal any remote
      * job as well.
      */
     DEBUGF(JOB, ("JobCondPassSig passing signal %d to child %d.\n", signo, job->pid));
     KILL(job->pid, signo);
-#endif
     return 0;
 }
 
@@ -454,27 +428,6 @@
     return *(int *) pid - ((Job *) job)->pid;
 }
 
-#ifdef REMOTE
-/*-
- *-----------------------------------------------------------------------
- * JobCmpRmtID  --
- *	Compare the rmtID of the job with the given rmtID and return 0 if they
- *	are equal.
- *
- * Results:
- *	0 if the rmtID's match
- *
- * Side Effects:
- *	None.
- *-----------------------------------------------------------------------
- */
-static int
-JobCmpRmtID(void *job, void *rmtID)
-{
-    return(*(int *) rmtID - *(int *) job->rmtID);
-}
-#endif
-
 /*-
  *-----------------------------------------------------------------------
  * JobPrintCommand  --
@@ -702,9 +655,7 @@
 JobClose(Job *job)
 {
     if (usePipes) {
-#ifdef RMT_WILL_WATCH
-	Rmt_Ignore(job->inPipe);
-#elif !defined(USE_KQUEUE)
+#if !defined(USE_KQUEUE)
 	FD_CLR(job->inPipe, &outputs);
 #endif
 	if (job->outPipe != job->inPipe) {
@@ -759,18 +710,11 @@
 	 * cases, finish out the job's output before printing the exit
 	 * status...
 	 */
-#ifdef REMOTE
-	KILL(job->pid, SIGCONT);
-#endif
 	JobClose(job);
 	if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
 	   (void) fclose(job->cmdFILE);
 	}
 	done = TRUE;
-#ifdef REMOTE
-	if (job->flags & JOB_REMOTE)
-	    Rmt_Done(job->rmtID, job->node);
-#endif
     } else if (WIFEXITED(*status)) {
 	/*
 	 * Deal with ignored errors in -B mode. We need to print a message
@@ -787,10 +731,6 @@
 	 * stuff?
 	 */
 	JobClose(job);
-#ifdef REMOTE
-	if (job->flags & JOB_REMOTE)
-	    Rmt_Done(job->rmtID, job->node);
-#endif /* REMOTE */
     } else {
 	/*
 	 * No need to close things down or anything.
@@ -851,10 +791,6 @@
 	    }
 	    job->flags |= JOB_RESUME;
 	    (void)Lst_AtEnd(stoppedJobs, (void *)job);
-#ifdef REMOTE
-	    if (job->flags & JOB_REMIGRATE)
-		JobRestart(job);
-#endif
 	    (void) fflush(out);
 	    return;
 	} else if (WTERMSIG(*status) == SIGCONT) {
@@ -1120,27 +1056,6 @@
     }
     return TRUE;
 }
-#ifdef RMT_WILL_WATCH
-/*-
- *-----------------------------------------------------------------------
- * JobLocalInput --
- *	Handle a pipe becoming readable. Callback function for Rmt_Watch
- *
- * Results:
- *	None
- *
- * Side Effects:
- *	JobDoOutput is called.
- *
- *-----------------------------------------------------------------------
- */
-/*ARGSUSED*/
-static void
-JobLocalInput(int stream, Job *job)
-{
-    JobDoOutput(job, FALSE);
-}
-#endif /* RMT_WILL_WATCH */
 
 /*-
  *-----------------------------------------------------------------------
@@ -1186,12 +1101,6 @@
 	lastNode = job->node;
     }
 
-#ifdef RMT_NO_EXEC
-    if (job->flags & JOB_REMOTE) {
-	goto jobExecFinish;
-    }
-#endif /* RMT_NO_EXEC */
-
     if ((cpid = vfork()) == -1) {
 	Punt("Cannot fork");
     } else if (cpid == 0) {
@@ -1245,20 +1154,12 @@
 # endif
 #endif /* USE_PGRP */
 
-#ifdef REMOTE
-	if (job->flags & JOB_REMOTE) {
-	    Rmt_Exec(shellPath, argv, FALSE);
-	} else
-#endif /* REMOTE */
-	   (void) execv(shellPath, argv);
+	(void) execv(shellPath, argv);
 
 	(void) write(STDERR_FILENO, "Could not execute shell\n",
 		     sizeof("Could not execute shell"));
 	_exit(1);
     } else {
-#ifdef REMOTE
-	long omask = sigblock(sigmask(SIGCHLD));
-#endif
 	job->pid = cpid;
 
 	if (usePipes && (job->flags & JOB_FIRST) ) {
@@ -1272,9 +1173,7 @@
 #endif
 	    job->curPos = 0;
 
-#ifdef RMT_WILL_WATCH
-	    Rmt_Watch(job->inPipe, JobLocalInput, job);
-#elif defined(USE_KQUEUE)
+#if defined(USE_KQUEUE)
 	    EV_SET(&kev[0], job->inPipe, EVFILT_READ, EV_ADD, 0, 0, job);
 	    EV_SET(&kev[1], job->pid, EVFILT_PROC, EV_ADD | EV_ONESHOT,
 		NOTE_EXIT, 0, NULL);
@@ -1285,15 +1184,11 @@
 	    }
 #else
 	    FD_SET(job->inPipe, &outputs);
-#endif /* RMT_WILL_WATCH */
+#endif /* USE_KQUEUE */
 	}
 
 	if (job->flags & JOB_REMOTE) {
-#ifndef REMOTE
 	    job->rmtID = 0;
-#else
-	    job->rmtID = Rmt_LastID(job->pid);
-#endif /* REMOTE */
 	} else {
 	    nLocal += 1;
 	    /*
@@ -1304,14 +1199,8 @@
 		job->cmdFILE = NULL;
 	    }
 	}
-#ifdef REMOTE
-	(void) sigsetmask(omask);
-#endif
     }
 
-#ifdef RMT_NO_EXEC
-jobExecFinish:
-#endif
     /*
      * Now the job is actually running, add it to the table.
      */
@@ -1391,80 +1280,41 @@
 static void
 JobRestart(Job *job)
 {
-#ifdef REMOTE
-    int host;
-#endif
 
     if (job->flags & JOB_REMIGRATE) {
-	if (
-#ifdef REMOTE
-	    verboseRemigrates ||
-#endif
-	    DEBUG(JOB)) {
+	if (DEBUG(JOB)) {
 	   (void) fprintf(stdout, "*** remigrating %x(%s)\n",
 			   job->pid, job->node->name);
 	   (void) fflush(stdout);
 	}
 
-#ifdef REMOTE
-	if (!Rmt_ReExport(job->pid, job->node, &host)) {
-	    if (verboseRemigrates || DEBUG(JOB)) {
-		(void) fprintf(stdout, "*** couldn't migrate...\n");
+	if (nLocal != maxLocal) {
+	    /*
+	     * Job cannot be remigrated, but there's room on the local
+	     * machine, so resume the job and note that another
+	     * local job has started.
+	     */
+	    if (DEBUG(JOB)) {
+		(void) fprintf(stdout, "*** resuming on local machine\n");
 		(void) fflush(stdout);
 	    }
-#endif
-	    if (nLocal != maxLocal) {
-		/*
-		 * Job cannot be remigrated, but there's room on the local
-		 * machine, so resume the job and note that another
-		 * local job has started.
-		 */
-		if (
-#ifdef REMOTE
-		    verboseRemigrates ||
-#endif
-		    DEBUG(JOB)) {
-		    (void) fprintf(stdout, "*** resuming on local machine\n");
-		    (void) fflush(stdout);
-		}
-		KILL(job->pid, SIGCONT);
-		nLocal +=1;
-#ifdef REMOTE
-		job->flags &= ~(JOB_REMIGRATE|JOB_RESUME|JOB_REMOTE);
-		job->flags |= JOB_CONTINUING;
-#else
-		job->flags &= ~(JOB_REMIGRATE|JOB_RESUME);
-#endif
-	} else {
-		/*
-		 * Job cannot be restarted. Mark the table as full and
-		 * place the job back on the list of stopped jobs.
-		 */
-		if (
-#ifdef REMOTE
-		    verboseRemigrates ||
-#endif
-		    DEBUG(JOB)) {
-		   (void) fprintf(stdout, "*** holding\n");
-		   (void) fflush(stdout);
-  		}
-		(void)Lst_AtFront(stoppedJobs, (void *)job);
-		jobFull = TRUE;
-		DEBUGF(JOB, ("Job queue is full.\n"));
-		return;
-	    }
-#ifdef REMOTE
+	    KILL(job->pid, SIGCONT);
+	    nLocal +=1;
+	    job->flags &= ~(JOB_REMIGRATE|JOB_RESUME);
 	} else {
 	    /*
-	     * Clear out the remigrate and resume flags. Set the continuing
-	     * flag so we know later on that the process isn't exiting just
-	     * because of a signal.
+	     * Job cannot be restarted. Mark the table as full and
+	     * place the job back on the list of stopped jobs.
 	     */
-	    job->flags &= ~(JOB_REMIGRATE|JOB_RESUME);
-	    job->flags |= JOB_CONTINUING;
-	    job->rmtID = host;
+	    if (DEBUG(JOB)) {
+	       (void) fprintf(stdout, "*** holding\n");
+	       (void) fflush(stdout);
+  	    }
+	    (void)Lst_AtFront(stoppedJobs, (void *)job);
+	    jobFull = TRUE;
+	    DEBUGF(JOB, ("Job queue is full.\n"));
+	    return;
 	}
-#endif
 
 	(void)Lst_AtEnd(jobs, (void *)job);
 	nJobs += 1;
@@ -1486,43 +1336,23 @@
 	JobMakeArgv(job, argv);
 
 	DEBUGF(JOB, ("Restarting %s...", job->node->name));
-#ifdef REMOTE
-	if ((job->node->type&OP_NOEXPORT) ||
- 	    (nLocal < maxLocal && runLocalFirst)
-# ifdef RMT_NO_EXEC
-	    || !Rmt_Export(shellPath, argv, job)
-# else
-	    || !Rmt_Begin(shellPath, argv, job->node)
-# endif
-#endif
-	{
-	    if (((nLocal >= maxLocal) && !(job->flags & JOB_SPECIAL))) {
-		/*
-		 * Can't be exported and not allowed to run locally -- put it
-		 * back on the hold queue and mark the table full
-		 */
-		DEBUGF(JOB, ("holding\n"));
-		(void)Lst_AtFront(stoppedJobs, (void *)job);
-		jobFull = TRUE;
-		DEBUGF(JOB, ("Job queue is full.\n"));
-		return;
-	    } else {
-		/*
-		 * Job may be run locally.
-		 */
-		DEBUGF(JOB, ("running locally\n"));
-		job->flags &= ~JOB_REMOTE;
-	    }
-	}
-#ifdef REMOTE
-	else {
+	if (((nLocal >= maxLocal) && !(job->flags & JOB_SPECIAL))) {
+	    /*
+	     * Can't be exported and not allowed to run locally -- put it
+	     * back on the hold queue and mark the table full
+	     */
+	    DEBUGF(JOB, ("holding\n"));
+	    (void)Lst_AtFront(stoppedJobs, (void *)job);
+	    jobFull = TRUE;
+	    DEBUGF(JOB, ("Job queue is full.\n"));
+	    return;
+	} else {
 	    /*
-	     * Can be exported. Hooray!
+	     * Job may be run locally.
 	     */
-	    DEBUGF(JOB, ("exporting\n"));
-	    job->flags |= JOB_REMOTE;
+	    DEBUGF(JOB, ("running locally\n"));
+	    job->flags &= ~JOB_REMOTE;
 	}
-#endif
 	JobExec(job, argv);
     } else {
 	/*
@@ -1532,14 +1362,8 @@
 	DEBUGF(JOB, ("Resuming %s...", job->node->name));
 	if (((job->flags & JOB_REMOTE) ||
 	    (nLocal < maxLocal) ||
-#ifdef REMOTE
-	    (((job->flags & JOB_SPECIAL) &&
-	      (job->node->type & OP_NOEXPORT)) &&
-	     (maxLocal == 0))) &&
-#else
 	    ((job->flags & JOB_SPECIAL) &&
 	     (maxLocal == 0))) &&
-#endif
 	   (nJobs != maxJobs))
 	{
 	    /*
@@ -1552,12 +1376,7 @@
 	    Boolean error;
 	    int status;
 
-#ifdef RMT_WANTS_SIGNALS
-	    if (job->flags & JOB_REMOTE) {
-		error = !Rmt_Signal(job, SIGCONT);
-	    } else
-#endif	/* RMT_WANTS_SIGNALS */
-		error = (KILL(job->pid, SIGCONT) != 0);
+	    error = (KILL(job->pid, SIGCONT) != 0);
 
 	    if (!error) {
 		/*
@@ -1839,27 +1658,11 @@
 	}
     }
 
-#ifdef REMOTE
-    if (!(gn->type & OP_NOEXPORT) && !(runLocalFirst && nLocal < maxLocal)) {
-#ifdef RMT_NO_EXEC
-	local = !Rmt_Export(shellPath, argv, job);
-#else
-	local = !Rmt_Begin(shellPath, argv, job->node);
-#endif /* RMT_NO_EXEC */
-	if (!local) {
-	    job->flags |= JOB_REMOTE;
-	}
-    } else
-#endif
-	local = TRUE;
+    local = TRUE;
 
     if (local && (((nLocal >= maxLocal) &&
 	!(job->flags & JOB_SPECIAL) &&
-#ifdef REMOTE
-	(!(gn->type & OP_NOEXPORT) || (maxLocal != 0))
-#else
 	(maxLocal != 0)
-#endif
 	)))
     {
 	/*
@@ -2192,14 +1995,7 @@
 	    nJobs -= 1;
 	    DEBUGF(JOB, ("Job queue is no longer full.\n"));
 	    jobFull = FALSE;
-#ifdef REMOTE
-	    if (!(job->flags & JOB_REMOTE)) {
-		DEBUGF(JOB, ("Job queue has one fewer local process.\n"));
-		nLocal -= 1;
-	    }
-#else
 	    nLocal -= 1;
-#endif
 	}
 
 	JobFinish(job, &status);
@@ -2236,34 +2032,9 @@
     LstNode		  ln;
     Job		   	  *job;
 #endif
-#ifdef RMT_WILL_WATCH
-    int	    	  	  pnJobs;   	/* Previous nJobs */
-#endif
 
     (void) fflush(stdout);
-#ifdef RMT_WILL_WATCH
-    pnJobs = nJobs;
 
-    /*
-     * It is possible for us to be called with nJobs equal to 0. This happens
-     * if all the jobs finish and a job that is stopped cannot be run
-     * locally (eg if maxLocal is 0) and cannot be exported. The job will
-     * be placed back on the stoppedJobs queue, Job_Empty() will return false,
-     * Make_Run will call us again when there's nothing for which to wait.
-     * nJobs never changes, so we loop forever. Hence the check. It could
-     * be argued that we should sleep for a bit so as not to swamp the
-     * exportation system with requests. Perhaps we should.
-     *
-     * NOTE: IT IS THE RESPONSIBILITY OF Rmt_Wait TO CALL Job_CatchChildren
-     * IN A TIMELY FASHION TO CATCH ANY LOCALLY RUNNING JOBS THAT EXIT.
-     * It may use the variable nLocal to determine if it needs to call
-     * Job_CatchChildren (if nLocal is 0, there's nothing for which to
-     * wait...)
-     */
-    while (nJobs != 0 && pnJobs == nJobs) {
-	Rmt_Wait();
-    }
-#else
     if (usePipes) {
 #ifdef USE_KQUEUE
 	if ((nfds = kevent(kqfd, NULL, 0, kev, KEV_SIZE, NULL)) == -1) {
@@ -2309,7 +2080,6 @@
 	}
 #endif /* !USE_KQUEUE */
     }
-#endif /* RMT_WILL_WATCH */
 }
 
 /*-
@@ -2379,11 +2149,7 @@
 
     lastNode =	  NULL;
 
-    if (maxJobs == 1 || beVerbose == 0
-#ifdef REMOTE
-	|| noMessages
-#endif
-		     ) {
+    if (maxJobs == 1 || beVerbose == 0) {
 	/*
 	 * If only one job can run at a time, there's no need for a banner,
 	 * no is there?
@@ -2423,7 +2189,7 @@
      * we're giving each job its own process group (since then it won't get
      * signals from the terminal driver as we own the terminal)
      */
-#if defined(RMT_WANTS_SIGNALS) || defined(USE_PGRP)
+#if defined(USE_PGRP)
     if (signal(SIGTSTP, SIG_IGN) != SIG_IGN) {
 	(void) signal(SIGTSTP, JobPassSig);
     }
@@ -2450,9 +2216,7 @@
 	JobStart(begin, JOB_SPECIAL, (Job *)0);
 	while (nJobs) {
 	    Job_CatchOutput();
-#ifndef RMT_WILL_WATCH
 	    Job_CatchChildren(!usePipes);
-#endif /* RMT_WILL_WATCH */
 	}
     }
     postCommands = Targ_FindNode(".END", TARG_CREATE);
@@ -2757,80 +2521,13 @@
 		Error("*** %s removed", file);
 	    }
 	}
-#ifdef RMT_WANTS_SIGNALS
-	if (job->flags & JOB_REMOTE) {
-	    /*
-	     * If job is remote, let the Rmt module do the killing.
-	     */
-	    if (!Rmt_Signal(job, signo)) {
-		/*
-		 * If couldn't kill the thing, finish it out now with an
-		 * error code, since no exit report will come in likely.
-		 */
-		int status;
-
-		status.w_status = 0;
-		status.w_retcode = 1;
-		JobFinish(job, &status);
-	    }
-	} else if (job->pid) {
-	    KILL(job->pid, signo);
-	}
-#else
 	if (job->pid) {
 	    DEBUGF(JOB, ("JobInterrupt passing signal to child %d.\n",
 		   job->pid));
 	    KILL(job->pid, signo);
 	}
-#endif /* RMT_WANTS_SIGNALS */
     }
 
-#ifdef REMOTE
-    (void)Lst_Open(stoppedJobs);
-    while ((ln = Lst_Next(stoppedJobs)) != NULL) {
-	job = (Job *) Lst_Datum(ln);
-
-	if (job->flags & JOB_RESTART) {
-	    DEBUGF(JOB, "JobInterrupt skipping job on stopped queue"
-		   "-- it was waiting to be restarted.\n");
-	    continue;
-	}
-	if (!Targ_Precious(job->node)) {
-	    char  	*file = (job->node->path == NULL ?
-				 job->node->name :
-				 job->node->path);
-	    if (eunlink(file) == 0) {
-		Error("*** %s removed", file);
-	    }
-	}
-	/*
-	 * Resume the thing so it will take the signal.
-	 */
-	DEBUGF(JOB, ("JobInterrupt passing CONT to stopped child %d.\n", job->pid));
-	KILL(job->pid, SIGCONT);
-#ifdef RMT_WANTS_SIGNALS
-	if (job->flags & JOB_REMOTE) {
-	    /*
-	     * If job is remote, let the Rmt module do the killing.
-	     */
-	    if (!Rmt_Signal(job, SIGINT)) {
-		/*
-		 * If couldn't kill the thing, finish it out now with an
-		 * error code, since no exit report will come in likely.
-		 */
-		int status;
-		status.w_status = 0;
-		status.w_retcode = 1;
-		JobFinish(job, &status);
-	    }
-	} else if (job->pid) {
-	    DEBUGF(JOB, "JobInterrupt passing interrupt to stopped child %d.\n",
-		   job->pid);
-	    KILL(job->pid, SIGINT);
-	}
-#endif /* RMT_WANTS_SIGNALS */
-    }
-#endif
     Lst_Close(stoppedJobs);
 
     if (runINTERRUPT && !touchFlag) {
@@ -2841,9 +2538,7 @@
 	    JobStart(interrupt, JOB_IGNDOTS, (Job *)0);
 	    while (nJobs) {
 		Job_CatchOutput();
-#ifndef RMT_WILL_WATCH
 		Job_CatchChildren(!usePipes);
-#endif /* RMT_WILL_WATCH */
 	    }
 	}
     }
@@ -2870,9 +2565,7 @@
 
 	    while (nJobs) {
 		Job_CatchOutput();
-#ifndef RMT_WILL_WATCH
 		Job_CatchChildren(!usePipes);
-#endif /* RMT_WILL_WATCH */
 	    }
 	}
     }
@@ -2899,9 +2592,7 @@
     aborting = ABORT_WAIT;
     while (nJobs != 0) {
 	Job_CatchOutput();
-#ifndef RMT_WILL_WATCH
 	Job_CatchChildren(!usePipes);
-#endif /* RMT_WILL_WATCH */
     }
     aborting = 0;
 }
@@ -2939,18 +2630,8 @@
 	     * kill the child process with increasingly drastic signals to make
 	     * darn sure it's dead.
 	     */
-#ifdef RMT_WANTS_SIGNALS
-	    if (job->flags & JOB_REMOTE) {
-		Rmt_Signal(job, SIGINT);
-		Rmt_Signal(job, SIGKILL);
-	    } else {
-		KILL(job->pid, SIGINT);
-		KILL(job->pid, SIGKILL);
-	    }
-#else
 	    KILL(job->pid, SIGINT);
 	    KILL(job->pid, SIGKILL);
-#endif /* RMT_WANTS_SIGNALS */
 	}
     }
 
@@ -2961,51 +2642,6 @@
 	continue;
 }
 
-#ifdef REMOTE
-/*-
- *-----------------------------------------------------------------------
- * JobFlagForMigration --
- *	Handle the eviction of a child. Called from RmtStatusChange.
- *	Flags the child as remigratable and then suspends it.  Takes
- *	the ID of the host we used, for matching children.
- *
- * Results:
- *	none.
- *
- * Side Effects:
- *	The job descriptor is flagged for remigration.
- *
- *-----------------------------------------------------------------------
- */
-void
-JobFlagForMigration(int hostID)
-{
-    Job		  *job;	    	/* job descriptor for dead child */
-    LstNode       jnode;    	/* list element for finding job */
-
-    DEBUGF(JOB, ("JobFlagForMigration(%d) called.\n", hostID));
-    jnode = Lst_Find(jobs, (void *)hostID, JobCmpRmtID);
-
-    if (jnode == NULL) {
-	jnode = Lst_Find(stoppedJobs, (void *)hostID, JobCmpRmtID);
-		if (jnode == NULL) {
-		    if (DEBUG(JOB)) {
-			Error("Evicting host(%d) not in table", hostID);
-		    }
-		    return;
-		}
-    }
-    job = (Job *) Lst_Datum(jnode);
-
-    DEBUGF(JOB, ("JobFlagForMigration(%d) found job '%s'.\n", hostID, job->node->name));
-
-    KILL(job->pid, SIGSTOP);
-
-    job->flags |= JOB_REMIGRATE;
-}
-
-#endif
-
 /*-
  *-----------------------------------------------------------------------
  * JobRestartJobs --
Index: main.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/main.c,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -r1.92 -r1.93
--- main.c	23 Oct 2004 21:34:41 -0000	1.92
+++ main.c	4 Nov 2004 12:57:41 -0000	1.93
@@ -168,11 +168,7 @@
 	int c;
 
 	optind = 1;	/* since we're called more than once */
-#ifdef REMOTE
-# define OPTFLAGS "BC:D:E:I:L:PSV:Xd:ef:ij:km:nqrstv"
-#else
-# define OPTFLAGS "BC:D:E:I:PSV:Xd:ef:ij:km:nqrstv"
-#endif
+#define OPTFLAGS "BC:D:E:I:PSV:Xd:ef:ij:km:nqrstv"
 rearg:	while((c = getopt(argc, argv, OPTFLAGS)) != -1) {
 		switch(c) {
 		case 'C':
@@ -198,20 +194,6 @@
 			compatMake = TRUE;
 			MFLAGS_append("-B", NULL);
 			break;
-#ifdef REMOTE
-		case 'L': {
-			char *endptr;
-
-			maxLocal = strtol(optarg, &endptr, 10);
-			if (maxLocal < 0 || *endptr != '\0') {
-				warnx("illegal number, -L argument -- %s",
-				    optarg);
-				usage();
-			}
-			MFLAGS_append("-L", optarg);
-			break;
-		}
-#endif
 		case 'P':
 			usePipes = FALSE;
 			MFLAGS_append("-P", NULL);
@@ -302,9 +284,7 @@
 				    optarg);
 				usage();
 			}
-#ifndef REMOTE
 			maxLocal = maxJobs;
-#endif
 			MFLAGS_append("-j", optarg);
 			break;
 		}
@@ -599,11 +579,7 @@
 	jobsRunning = FALSE;
 
 	maxLocal = DEFMAXLOCAL;		/* Set default local max concurrency */
-#ifdef REMOTE
-	maxJobs = DEFMAXJOBS;		/* Set default max concurrency */
-#else
 	maxJobs = maxLocal;
-#endif
 	forceJobs = FALSE;              /* No -j flag */
 	compatMake = FALSE;		/* No compat mode */
 
Index: job.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- job.h	23 Oct 2004 21:34:41 -0000	1.22
+++ job.h	4 Nov 2004 12:57:41 -0000	1.23
@@ -207,22 +207,2 @@
-
-/*
- * If REMOTE is defined then these things need exposed, otherwise they are
- * static to job.c!
- */
-#ifdef REMOTE
-extern char 	*targFmt;   	/* Format string for banner that separates
-				 * output from multiple jobs. Contains a
-				 * single %s where the name of the node being
-				 * made should be put. */
-extern GNode	*lastNode;  	/* Last node for which a banner was printed.
-				 * If Rmt module finds it necessary to print
-				 * a banner, it should set this to the node
-				 * for which the banner was printed */
-extern int  	nJobs;	    	/* Number of jobs running (local and remote) */
-extern int  	nLocal;	    	/* Number of jobs running locally */
-extern Lst  	jobs;	    	/* List of active job descriptors */
-extern Lst  	stoppedJobs;	/* List of jobs that are stopped or didn't
-				 * quite get started */
-extern Boolean	jobFull;    	/* Non-zero if no more jobs should/will start*/
-#endif
 extern int	maxJobs;	/* Number of jobs that may run */
+
---------------------
PatchSet 367
Date: 2004/11/05 11:41:35
Author: harti
Log:
Now with the remote job support removed there can be no remote jobs and
no jobs that need to be remigrated. Remove the flags and the associated
code.

Members: 
	config.h:1.12->1.13 
	job.c:1.53->1.54 
	job.h:1.23->1.24 

Index: config.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/config.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- config.h	17 Sep 2002 21:29:06 -0000	1.12
+++ config.h	5 Nov 2004 11:41:35 -0000	1.13
@@ -44,7 +44,7 @@
  * DEFMAXJOBS
  * DEFMAXLOCAL
  *	These control the default concurrency. On no occasion will more
- *	than DEFMAXJOBS targets be created at once (locally or remotely)
+ *	than DEFMAXJOBS targets be created at once.
  *	DEFMAXLOCAL is the highest number of targets which will be
  *	created on the local machine at once. Note that if you set this
  *	to 0, nothing will ever happen...
Index: job.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -r1.53 -r1.54
--- job.c	4 Nov 2004 12:57:41 -0000	1.53
+++ job.c	5 Nov 2004 11:41:35 -0000	1.54
@@ -253,14 +253,14 @@
 	(void) fprintf(fp, targFmt, gn->name);
 
 /*
- * When JobStart attempts to run a job remotely but can't, and isn't allowed
- * to run the job locally, or when Job_CatchChildren detects a job that has
- * been migrated home, the job is placed on the stoppedJobs queue to be run
+ * When JobStart attempts to run a job but isn't allowed to
+ * or when Job_CatchChildren detects a job that has
+ * been stopped somehow, the job is placed on the stoppedJobs queue to be run
  * when the next job finishes.
  */
 STATIC Lst	stoppedJobs;	/* Lst of Job structures describing
 				 * jobs that were stopped due to concurrency
-				 * limits or migration home */
+				 * limits or externally */
 
 
 #if defined(USE_PGRP) && defined(SYSV)
@@ -313,8 +313,7 @@
 /*-
  *-----------------------------------------------------------------------
  * JobCondPassSig --
- *	Pass a signal to a job if the job is remote or if USE_PGRP
- *	is defined.
+ *	Pass a signal to a job if USE_PGRP is defined.
  *
  * Results:
  *	=== 0
@@ -330,11 +329,8 @@
     Job	*job = (Job *) jobp;
     int	signo = *(int *) signop;
 
-    /*
-     * Assume that sending the signal to job->pid will signal any remote
-     * job as well.
-     */
-    DEBUGF(JOB, ("JobCondPassSig passing signal %d to child %d.\n", signo, job->pid));
+    DEBUGF(JOB, ("JobCondPassSig passing signal %d to child %d.\n",
+	signo, job->pid));
     KILL(job->pid, signo);
     return 0;
 }
@@ -342,7 +338,7 @@
 /*-
  *-----------------------------------------------------------------------
  * JobPassSig --
- *	Pass a signal on to all remote jobs and to all local jobs if
+ *	Pass a signal on to all local jobs if
  *	USE_PGRP is defined, then die ourselves.
  *
  * Results:
@@ -785,10 +781,8 @@
 		MESSAGE(out, job->node);
 		lastNode = job->node;
 	    }
-	    if (!(job->flags & JOB_REMIGRATE)) {
-		(void) fprintf(out, "*** Stopped -- signal %d\n",
-		    WSTOPSIG(*status));
-	    }
+	    (void) fprintf(out, "*** Stopped -- signal %d\n",
+		WSTOPSIG(*status));
 	    job->flags |= JOB_RESUME;
 	    (void)Lst_AtEnd(stoppedJobs, (void *)job);
 	    (void) fflush(out);
@@ -799,7 +793,7 @@
 	     * list to the running one (or re-stop it if concurrency is
 	     * exceeded) and go and get another child.
 	     */
-	    if (job->flags & (JOB_RESUME|JOB_REMIGRATE|JOB_RESTART)) {
+	    if (job->flags & (JOB_RESUME|JOB_RESTART)) {
 		if (usePipes && job->node != lastNode) {
 		    MESSAGE(out, job->node);
 		    lastNode = job->node;
@@ -821,10 +815,8 @@
 	    job->flags &= ~JOB_CONTINUING;
  	    Lst_AtEnd(jobs, (void *)job);
 	    nJobs += 1;
-	    if (!(job->flags & JOB_REMOTE)) {
-		DEBUGF(JOB, ("Process %d is continuing locally.\n", job->pid));
-		nLocal += 1;
-	    }
+	    DEBUGF(JOB, ("Process %d is continuing locally.\n", job->pid));
+	    nLocal += 1;
 	    if (nJobs == maxJobs) {
 		jobFull = TRUE;
 		DEBUGF(JOB, ("Job queue is full.\n"));
@@ -1080,8 +1072,7 @@
     if (DEBUG(JOB)) {
 	int 	  i;
 
-	DEBUGF(JOB, ("Running %s %sly\n", job->node->name,
-	       job->flags&JOB_REMOTE?"remote":"local"));
+	DEBUGF(JOB, ("Running %s\n", job->node->name));
 	DEBUGF(JOB, ("\tCommand: "));
 	for (i = 0; argv[i] != NULL; i++) {
 	    DEBUGF(JOB, ("%s ", argv[i]));
@@ -1187,17 +1178,10 @@
 #endif /* USE_KQUEUE */
 	}
 
-	if (job->flags & JOB_REMOTE) {
-	    job->rmtID = 0;
-	} else {
-	    nLocal += 1;
-	    /*
-	     * XXX: Used to not happen if REMOTE. Why?
-	     */
-	    if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
-		(void) fclose(job->cmdFILE);
-		job->cmdFILE = NULL;
-	    }
+	nLocal += 1;
+	if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
+	    (void) fclose(job->cmdFILE);
+	    job->cmdFILE = NULL;
 	}
     }
 
@@ -1281,48 +1265,7 @@
 JobRestart(Job *job)
 {
 
-    if (job->flags & JOB_REMIGRATE) {
-	if (DEBUG(JOB)) {
-	   (void) fprintf(stdout, "*** remigrating %x(%s)\n",
-			   job->pid, job->node->name);
-	   (void) fflush(stdout);
-	}
-
-	if (nLocal != maxLocal) {
-	    /*
-	     * Job cannot be remigrated, but there's room on the local
-	     * machine, so resume the job and note that another
-	     * local job has started.
-	     */
-	    if (DEBUG(JOB)) {
-		(void) fprintf(stdout, "*** resuming on local machine\n");
-		(void) fflush(stdout);
-	    }
-	    KILL(job->pid, SIGCONT);
-	    nLocal +=1;
-	    job->flags &= ~(JOB_REMIGRATE|JOB_RESUME);
-	} else {
-	    /*
-	     * Job cannot be restarted. Mark the table as full and
-	     * place the job back on the list of stopped jobs.
-	     */
-	    if (DEBUG(JOB)) {
-	       (void) fprintf(stdout, "*** holding\n");
-	       (void) fflush(stdout);
-  	    }
-	    (void)Lst_AtFront(stoppedJobs, (void *)job);
-	    jobFull = TRUE;
-	    DEBUGF(JOB, ("Job queue is full.\n"));
-	    return;
-	}
-
-	(void)Lst_AtEnd(jobs, (void *)job);
-	nJobs += 1;
-	if (nJobs == maxJobs) {
-	    jobFull = TRUE;
-	    DEBUGF(JOB, ("Job queue is full.\n"));
-	}
-    } else if (job->flags & JOB_RESTART) {
+    if (job->flags & JOB_RESTART) {
 	/*
 	 * Set up the control arguments to the shell. This is based on the
 	 * flags set earlier for this job. If the JOB_IGNERR flag is clear,
@@ -1351,7 +1294,6 @@
 	     * Job may be run locally.
 	     */
 	    DEBUGF(JOB, ("running locally\n"));
-	    job->flags &= ~JOB_REMOTE;
 	}
 	JobExec(job, argv);
     } else {
@@ -1360,18 +1302,14 @@
 	 * we don't know...
 	 */
 	DEBUGF(JOB, ("Resuming %s...", job->node->name));
-	if (((job->flags & JOB_REMOTE) ||
-	    (nLocal < maxLocal) ||
+	if (((nLocal < maxLocal) ||
 	    ((job->flags & JOB_SPECIAL) &&
 	     (maxLocal == 0))) &&
 	   (nJobs != maxJobs))
 	{
 	    /*
-	     * If the job is remote, it's ok to resume it as long as the
-	     * maximum concurrency won't be exceeded. If it's local and
-	     * we haven't reached the local concurrency limit already (or the
-	     * job must be run locally and maxLocal is 0), it's also ok to
-	     * resume it.
+	     * If we haven't reached the concurrency limit already (or the
+	     * job must be run and maxLocal is 0), it's ok to resume it.
 	     */
 	    Boolean error;
 	    int status;
@@ -1431,12 +1369,11 @@
     Job	  	  *job;       /* new job descriptor */
     char	  *argv[4];   /* Argument vector to shell */
     Boolean	  cmdsOK;     /* true if the nodes commands were all right */
-    Boolean 	  local;      /* Set true if the job was run locally */
     Boolean 	  noExec;     /* Set true if we decide not to run the job */
     int		  tfd;	      /* File descriptor for temp file */
 
     if (previous != NULL) {
-	previous->flags &= ~(JOB_FIRST|JOB_IGNERR|JOB_SILENT|JOB_REMOTE);
+	previous->flags &= ~(JOB_FIRST|JOB_IGNERR|JOB_SILENT);
 	job = previous;
     } else {
 	job = (Job *) emalloc(sizeof(Job));
@@ -1658,21 +1595,13 @@
 	}
     }
 
-    local = TRUE;
-
-    if (local && (((nLocal >= maxLocal) &&
-	!(job->flags & JOB_SPECIAL) &&
-	(maxLocal != 0)
-	)))
-    {
+    if ((nLocal >= maxLocal) && !(job->flags & JOB_SPECIAL) &&
+	(maxLocal != 0)) {
 	/*
-	 * The job can only be run locally, but we've hit the limit of
-	 * local concurrency, so put the job on hold until some other job
-	 * finishes. Note that the special jobs (.BEGIN, .INTERRUPT and .END)
-	 * may be run locally even when the local limit has been reached
-	 * (e.g. when maxLocal == 0), though they will be exported if at
-	 * all possible. In addition, any target marked with .NOEXPORT will
-	 * be run locally if maxLocal is 0.
+	 * We've hit the limit of concurrency, so put the job on hold until
+	 * some other job finishes. Note that the special jobs (.BEGIN,
+	 * .INTERRUPT and .END) may be run even when the limit has been reached
+	 * (e.g. when maxLocal == 0).
 	 */
 	jobFull = TRUE;
 
@@ -1680,7 +1609,7 @@
 	job->flags |= JOB_RESTART;
 	(void) Lst_AtEnd(stoppedJobs, (void *)job);
     } else {
-	if ((nLocal >= maxLocal) && local) {
+	if (nLocal >= maxLocal) {
 	    /*
 	     * If we're running this job locally as a special case (see above),
 	     * at least say the table is full.
@@ -2527,8 +2456,6 @@
 	    KILL(job->pid, signo);
 	}
     }
-
-    Lst_Close(stoppedJobs);
 
     if (runINTERRUPT && !touchFlag) {
 	interrupt = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
Index: job.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- job.h	4 Nov 2004 12:57:41 -0000	1.23
+++ job.h	5 Nov 2004 11:41:36 -0000	1.24
@@ -80,9 +80,7 @@
  *	   maintained for each job. If, on the other hand, usePipes is false,
  *	   the output is routed to a temporary file and all that is kept
  *	   is the name of the file and the descriptor open to the file.
- *	6) An identifier provided by and for the exclusive use of the
- *	   Rmt module.
- *	7) A word of flags which determine how the module handles errors,
+ *	6) A word of flags which determine how the module handles errors,
  *	   echoing, etc. for the job
  *
  * The job "table" is kept as a linked Lst in 'jobs', with the number of
@@ -103,7 +101,6 @@
 			     * saved when the job has been run */
     FILE 	*cmdFILE;   /* When creating the shell script, this is
 			     * where the commands go */
-    int    	rmtID;     /* ID returned from Rmt module */
     short      	flags;	    /* Flags to control treatment of job */
 #define	JOB_IGNERR	0x001	/* Ignore non-zero exits */
 #define	JOB_SILENT	0x002	/* no output */
@@ -111,9 +108,7 @@
 				 * if we can't export it and maxLocal is 0 */
 #define	JOB_IGNDOTS	0x008  	/* Ignore "..." lines when processing
 				 * commands */
-#define	JOB_REMOTE	0x010	/* Job is running remotely */
 #define	JOB_FIRST	0x020	/* Job is first job for the node */
-#define	JOB_REMIGRATE	0x040	/* Job needs to be remigrated */
 #define	JOB_RESTART	0x080	/* Job needs to be completely restarted */
 #define	JOB_RESUME	0x100	/* Job needs to be resumed b/c it stopped,
 				 * for some reason */
@@ -223,6 +218,5 @@
 int Job_Finish(void);
 void Job_Wait(void);
 void Job_AbortAll(void);
-void JobFlagForMigration(int);
 
 #endif /* _JOB_H_ */
---------------------
PatchSet 368
Date: 2004/11/11 12:23:39
Author: phk
Log:
Get rid of now unused maxLocal variables.

Members: 
	config.h:1.13->1.14 
	main.c:1.93->1.94 

Index: config.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/config.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- config.h	5 Nov 2004 11:41:35 -0000	1.13
+++ config.h	11 Nov 2004 12:23:39 -0000	1.14
@@ -42,15 +42,10 @@
 
 /*
  * DEFMAXJOBS
- * DEFMAXLOCAL
- *	These control the default concurrency. On no occasion will more
+ *	This control the default concurrency. On no occasion will more
  *	than DEFMAXJOBS targets be created at once.
- *	DEFMAXLOCAL is the highest number of targets which will be
- *	created on the local machine at once. Note that if you set this
- *	to 0, nothing will ever happen...
  */
-#define	DEFMAXJOBS	4
-#define	DEFMAXLOCAL	1
+#define	DEFMAXJOBS	1
 
 /*
  * INCLUDES
Index: main.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/main.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- main.c	4 Nov 2004 12:57:41 -0000	1.93
+++ main.c	11 Nov 2004 12:23:39 -0000	1.94
@@ -91,10 +91,6 @@
 
 #define WANT_ENV_MKLVL	1
 
-#ifndef	DEFMAXLOCAL
-#define	DEFMAXLOCAL DEFMAXJOBS
-#endif	/* DEFMAXLOCAL */
-
 #define	MAKEFLAGS	".MAKEFLAGS"
 
 Lst			create;		/* Targets to be made */
@@ -108,7 +104,6 @@
 static Lst		variables;	/* list of variables to print */
 int			maxJobs;	/* -j argument */
 static Boolean          forceJobs;      /* -j argument given */
-static int		maxLocal;	/* -L argument */
 Boolean			compatMake;	/* -B argument */
 Boolean			debug;		/* -d flag */
 Boolean			noExecute;	/* -n flag */
@@ -284,7 +279,6 @@
 				    optarg);
 				usage();
 			}
-			maxLocal = maxJobs;
 			MFLAGS_append("-j", optarg);
 			break;
 		}
@@ -578,8 +572,7 @@
 	debug = 0;			/* No debug verbosity, please. */
 	jobsRunning = FALSE;
 
-	maxLocal = DEFMAXLOCAL;		/* Set default local max concurrency */
-	maxJobs = maxLocal;
+	maxJobs = DEFMAXJOBS;
 	forceJobs = FALSE;              /* No -j flag */
 	compatMake = FALSE;		/* No compat mode */
 
@@ -859,9 +852,7 @@
 			 * being executed should it exist).
 			 */
 			if (!queryFlag) {
-				if (maxLocal == -1)
-					maxLocal = maxJobs;
-				Job_Init(maxJobs, maxLocal);
+				Job_Init(maxJobs, maxJobs);
 				jobsRunning = TRUE;
 			}
 
---------------------
PatchSet 369
Date: 2004/11/11 12:52:15
Author: phk
Log:
Get rid of more local/remote leftovers

Members: 
	job.c:1.54->1.55 
	job.h:1.24->1.25 
	main.c:1.94->1.95 

Index: job.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- job.c	5 Nov 2004 11:41:35 -0000	1.54
+++ job.c	11 Nov 2004 12:52:15 -0000	1.55
@@ -226,15 +226,11 @@
 
 
 static int  	maxJobs;    	/* The most children we can run at once */
-static int  	maxLocal;    	/* The most local ones we can have */
 STATIC int     	nJobs;	    	/* The number of children currently running */
-STATIC int	nLocal;    	/* The number of local children */
 STATIC Lst     	jobs;		/* The structures that describe them */
 STATIC Boolean	jobFull;    	/* Flag to tell when the job table is full. It
 				 * is set TRUE when (1) the total number of
-				 * running jobs equals the maximum allowed or
-				 * (2) a job can only be run locally, but
-				 * nLocal equals maxLocal */
+				 * running jobs equals the maximum allowed */
 #ifdef USE_KQUEUE
 static int	kqfd;		/* File descriptor obtained by kqueue() */
 #else
@@ -816,7 +812,6 @@
  	    Lst_AtEnd(jobs, (void *)job);
 	    nJobs += 1;
 	    DEBUGF(JOB, ("Process %d is continuing locally.\n", job->pid));
-	    nLocal += 1;
 	    if (nJobs == maxJobs) {
 		jobFull = TRUE;
 		DEBUGF(JOB, ("Job queue is full.\n"));
@@ -1178,7 +1173,6 @@
 #endif /* USE_KQUEUE */
 	}
 
-	nLocal += 1;
 	if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
 	    (void) fclose(job->cmdFILE);
 	    job->cmdFILE = NULL;
@@ -1279,7 +1273,7 @@
 	JobMakeArgv(job, argv);
 
 	DEBUGF(JOB, ("Restarting %s...", job->node->name));
-	if (((nLocal >= maxLocal) && !(job->flags & JOB_SPECIAL))) {
+	if (((nJobs >= maxJobs) && !(job->flags & JOB_SPECIAL))) {
 	    /*
 	     * Can't be exported and not allowed to run locally -- put it
 	     * back on the hold queue and mark the table full
@@ -1302,14 +1296,14 @@
 	 * we don't know...
 	 */
 	DEBUGF(JOB, ("Resuming %s...", job->node->name));
-	if (((nLocal < maxLocal) ||
+	if (((nJobs < maxJobs) ||
 	    ((job->flags & JOB_SPECIAL) &&
-	     (maxLocal == 0))) &&
+	     (maxJobs == 0))) &&
 	   (nJobs != maxJobs))
 	{
 	    /*
 	     * If we haven't reached the concurrency limit already (or the
-	     * job must be run and maxLocal is 0), it's ok to resume it.
+	     * job must be run and maxJobs is 0), it's ok to resume it.
 	     */
 	    Boolean error;
 	    int status;
@@ -1595,13 +1589,12 @@
 	}
     }
 
-    if ((nLocal >= maxLocal) && !(job->flags & JOB_SPECIAL) &&
-	(maxLocal != 0)) {
+    if ((nJobs >= maxJobs) && !(job->flags & JOB_SPECIAL) && (maxJobs != 0)) {
 	/*
 	 * We've hit the limit of concurrency, so put the job on hold until
 	 * some other job finishes. Note that the special jobs (.BEGIN,
 	 * .INTERRUPT and .END) may be run even when the limit has been reached
-	 * (e.g. when maxLocal == 0).
+	 * (e.g. when maxJobs == 0).
 	 */
 	jobFull = TRUE;
 
@@ -1609,7 +1602,7 @@
 	job->flags |= JOB_RESTART;
 	(void) Lst_AtEnd(stoppedJobs, (void *)job);
     } else {
-	if (nLocal >= maxLocal) {
+	if (nJobs >= maxJobs) {
 	    /*
 	     * If we're running this job locally as a special case (see above),
 	     * at least say the table is full.
@@ -1894,7 +1887,7 @@
     /*
      * Don't even bother if we know there's no one around.
      */
-    if (nLocal == 0) {
+    if (nJobs == 0) {
 	return;
     }
 
@@ -1924,7 +1917,6 @@
 	    nJobs -= 1;
 	    DEBUGF(JOB, ("Job queue is no longer full.\n"));
 	    jobFull = FALSE;
-	    nLocal -= 1;
 	}
 
 	JobFinish(job, &status);
@@ -2050,8 +2042,7 @@
 /*-
  *-----------------------------------------------------------------------
  * Job_Init --
- *	Initialize the process module, given a maximum number of jobs, and
- *	a maximum number of local jobs.
+ *	Initialize the process module, given a maximum number of jobs.
  *
  * Results:
  *	none
@@ -2061,16 +2052,14 @@
  *-----------------------------------------------------------------------
  */
 void
-Job_Init(int maxproc, int maxlocal)
+Job_Init(int maxproc)
 {
     GNode         *begin;     /* node for commands to do at the very start */
 
     jobs =  	  Lst_Init(FALSE);
     stoppedJobs = Lst_Init(FALSE);
     maxJobs = 	  maxproc;
-    maxLocal = 	  maxlocal;
     nJobs = 	  0;
-    nLocal = 	  0;
     jobFull = 	  FALSE;
 
     aborting = 	  0;
Index: job.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- job.h	5 Nov 2004 11:41:36 -0000	1.24
+++ job.h	11 Nov 2004 12:52:16 -0000	1.25
@@ -211,7 +211,7 @@
 void Job_CatchChildren(Boolean);
 void Job_CatchOutput(void);
 void Job_Make(GNode *);
-void Job_Init(int, int);
+void Job_Init(int);
 Boolean Job_Full(void);
 Boolean Job_Empty(void);
 ReturnStatus Job_ParseShell(char *);
Index: main.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/main.c,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -r1.94 -r1.95
--- main.c	11 Nov 2004 12:23:39 -0000	1.94
+++ main.c	11 Nov 2004 12:52:16 -0000	1.95
@@ -852,7 +852,7 @@
 			 * being executed should it exist).
 			 */
 			if (!queryFlag) {
-				Job_Init(maxJobs, maxJobs);
+				Job_Init(maxJobs);
 				jobsRunning = TRUE;
 			}
 
---------------------
PatchSet 370
Date: 2004/11/12 07:57:17
Author: harti
Log:
Fix a (very) long standing bug in make (this has been there probably
from the beginning). Make used to handle all its interrupt-time stuff
directly from the signal handler, including calls to printf, accessing
global data and so on. This is of course wrong and could provoke a core
dump when interrupting make. Just set a flag in the signal handler and
do everything else from the main thread.

PR:		bin/29103

Members: 
	compat.c:1.38->1.39 
	job.c:1.55->1.56 

Index: compat.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/compat.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- compat.c	23 Oct 2004 21:34:41 -0000	1.38
+++ compat.c	12 Nov 2004 07:57:17 -0000	1.39
@@ -79,6 +79,8 @@
 
 static GNode	    *curTarg = NULL;
 static GNode	    *ENDNode;
+static sig_atomic_t interrupted;
+
 static void CompatInterrupt(int);
 static int CompatMake(void *, void *);
 static int shellneed(char *);
@@ -101,6 +103,16 @@
     meta[0] = 1;
 }
 
+/*
+ * Interrupt handler - set flag and defer handling to the main code
+ */
+static void
+CompatCatchSig(int signo)
+{
+
+	interrupted = signo;
+}
+
 /*-
  *-----------------------------------------------------------------------
  * CompatInterrupt --
@@ -120,6 +132,17 @@
 CompatInterrupt (int signo)
 {
     GNode   *gn;
+    sigset_t nmask, omask;
+
+    sigemptyset(&nmask);
+    sigaddset(&nmask, SIGINT);
+    sigaddset(&nmask, SIGTERM);
+    sigaddset(&nmask, SIGHUP);
+    sigaddset(&nmask, SIGQUIT);
+    sigprocmask(SIG_SETMASK, &nmask, &omask);
+
+    /* prevent recursion in evaluation of .INTERRUPT */
+    interrupted = 0;
 
     if ((curTarg != NULL) && !Targ_Precious (curTarg)) {
 	char	  *p1;
@@ -129,18 +152,20 @@
 	    printf ("*** %s removed\n", file);
 	}
 	free(p1);
+    }
 
-	/*
-	 * Run .INTERRUPT only if hit with interrupt signal
-	 */
-	if (signo == SIGINT) {
-	    gn = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
-	    if (gn != NULL) {
-		Lst_ForEach(gn->commands, Compat_RunCommand, (void *)gn);
-	    }
+    /*
+     * Run .INTERRUPT only if hit with interrupt signal
+     */
+    if (signo == SIGINT) {
+	gn = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
+	if (gn != NULL) {
+	    Lst_ForEach(gn->commands, Compat_RunCommand, (void *)gn);
 	}
-
     }
+
+    sigprocmask(SIG_SETMASK, &omask, NULL);
+
     if (signo == SIGQUIT)
 	exit(signo);
     (void) signal(signo, SIG_DFL);
@@ -373,10 +398,12 @@
     while (1) {
 
 	while ((rstat = wait(&reason)) != cpid) {
-	    if (rstat == -1 && errno != EINTR) {
-		break;
+	    if (interrupted || (rstat == -1 && errno != EINTR)) {
+		    break;
 	    }
 	}
+	if (interrupted)
+	    CompatInterrupt(interrupted);
 
 	if (rstat > -1) {
 	    if (WIFSTOPPED(reason)) {
@@ -660,16 +687,16 @@
     Shell_Init();		/* Set up shell. */
 
     if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
-	signal(SIGINT, CompatInterrupt);
+	signal(SIGINT, CompatCatchSig);
     }
     if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
-	signal(SIGTERM, CompatInterrupt);
+	signal(SIGTERM, CompatCatchSig);
     }
     if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
-	signal(SIGHUP, CompatInterrupt);
+	signal(SIGHUP, CompatCatchSig);
     }
     if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) {
-	signal(SIGQUIT, CompatInterrupt);
+	signal(SIGQUIT, CompatCatchSig);
     }
 
     ENDNode = Targ_FindNode(".END", TARG_CREATE);
Index: job.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.c,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- job.c	11 Nov 2004 12:52:15 -0000	1.55
+++ job.c	12 Nov 2004 07:57:17 -0000	1.56
@@ -259,6 +259,9 @@
 				 * limits or externally */
 
 
+static sig_atomic_t interrupted;
+
+
 #if defined(USE_PGRP) && defined(SYSV)
 # define KILL(pid, sig)		killpg(-(pid), (sig))
 #else
@@ -306,6 +309,19 @@
 static void JobInterrupt(int, int);
 static void JobRestartJobs(void);
 
+/*
+ * JobCatchSignal
+ *
+ * Got a signal. Set global variables and hope that someone will
+ * handle it.
+ */
+static void
+JobCatchSig(int signo)
+{
+
+	interrupted = signo;
+}
+
 /*-
  *-----------------------------------------------------------------------
  * JobCondPassSig --
@@ -351,6 +367,10 @@
     sigset_t nmask, omask;
     struct sigaction act;
 
+    sigemptyset(&nmask);
+    sigaddset(&nmask, signo);
+    sigprocmask(SIG_SETMASK, &nmask, &omask);
+
     DEBUGF(JOB, ("JobPassSig(%d) called.\n", signo));
     Lst_ForEach(jobs, JobCondPassSig, (void *) &signo);
 
@@ -377,10 +397,8 @@
      * Note we block everything else possible while we're getting the signal.
      * This ensures that all our jobs get continued when we wake up before
      * we take any other signal.
+     * XXX this comment seems wrong.
      */
-    sigemptyset(&nmask);
-    sigaddset(&nmask, signo);
-    sigprocmask(SIG_SETMASK, &nmask, &omask);
     act.sa_handler = SIG_DFL;
     sigemptyset(&act.sa_mask);
     act.sa_flags = 0;
@@ -1366,6 +1384,10 @@
     Boolean 	  noExec;     /* Set true if we decide not to run the job */
     int		  tfd;	      /* File descriptor for temp file */
 
+    if (interrupted) {
+        JobPassSig(interrupted);
+        return (JOB_ERROR);
+    }
     if (previous != NULL) {
 	previous->flags &= ~(JOB_FIRST|JOB_IGNERR|JOB_SILENT);
 	job = previous;
@@ -1709,6 +1731,14 @@
 
 	nRead = read(job->inPipe, &job->outBuf[job->curPos],
 			 JOB_BUFSIZE - job->curPos);
+	/*
+	 * Check for interrupt here too, because the above read may block
+	 * when the child process is stopped. In this case the interrupt
+	 * will unblock it (we don't use SA_RESTART).
+	 */
+	if (interrupted)
+	    JobPassSig(interrupted);
+
 	if (nRead < 0) {
 	    DEBUGF(JOB, ("JobDoOutput(piperead)"));
 	    nr = 0;
@@ -1921,6 +1951,8 @@
 
 	JobFinish(job, &status);
     }
+    if (interrupted)
+        JobPassSig(interrupted);
 }
 
 /*-
@@ -1961,6 +1993,8 @@
 	if ((nfds = kevent(kqfd, NULL, 0, kev, KEV_SIZE, NULL)) == -1) {
 	    if (errno != EINTR)
 		Punt("kevent: %s", strerror(errno));
+	    if (interrupted)
+		JobPassSig(interrupted);
 	} else {
 	    for (i = 0; i < nfds; i++) {
 		if (kev[i].flags & EV_ERROR) {
@@ -1984,9 +2018,11 @@
 	timeout.tv_usec = SEL_USEC;
 
 	if ((nfds = select(FD_SETSIZE, &readfds, (fd_set *) 0,
-			   (fd_set *) 0, &timeout)) <= 0)
+			   (fd_set *) 0, &timeout)) <= 0) {
+	    if (interrupted)
+		JobPassSig(interrupted);
 	    return;
-	else {
+	} else {
 	    if (Lst_Open(jobs) == FAILURE) {
 		Punt("Cannot open job table");
 	    }
@@ -2055,6 +2091,7 @@
 Job_Init(int maxproc)
 {
     GNode         *begin;     /* node for commands to do at the very start */
+    struct sigaction sa;
 
     jobs =  	  Lst_Init(FALSE);
     stoppedJobs = Lst_Init(FALSE);
@@ -2087,19 +2124,24 @@
 
     /*
      * Catch the four signals that POSIX specifies if they aren't ignored.
-     * JobPassSig will take care of calling JobInterrupt if appropriate.
+     * JobCatchSignal will just set global variables and hope someone
+     * else is going to handle the interrupt.
      */
+    sa.sa_handler = JobCatchSig;
+    sigemptyset(&sa.sa_mask);
+    sa.sa_flags = 0;
+
     if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGINT, JobPassSig);
+	(void) sigaction(SIGINT, &sa, NULL);
     }
     if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGHUP, JobPassSig);
+	(void) sigaction(SIGHUP, &sa, NULL);
     }
     if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGQUIT, JobPassSig);
+	(void) sigaction(SIGQUIT, &sa, NULL);
     }
     if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGTERM, JobPassSig);
+	(void) sigaction(SIGTERM, &sa, NULL);
     }
     /*
      * There are additional signals that need to be caught and passed if
@@ -2109,16 +2151,16 @@
      */
 #if defined(USE_PGRP)
     if (signal(SIGTSTP, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGTSTP, JobPassSig);
+	(void) sigaction(SIGTSTP, &sa, NULL);
     }
     if (signal(SIGTTOU, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGTTOU, JobPassSig);
+	(void) sigaction(SIGTTOU, &sa, NULL);
     }
     if (signal(SIGTTIN, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGTTIN, JobPassSig);
+	(void) sigaction(SIGTTIN, &sa, NULL);
     }
     if (signal(SIGWINCH, SIG_IGN) != SIG_IGN) {
-	(void) signal(SIGWINCH, JobPassSig);
+	(void) sigaction(SIGWINCH, &sa, NULL);
     }
 #endif
 
@@ -2447,6 +2489,10 @@
     }
 
     if (runINTERRUPT && !touchFlag) {
+	/* clear the interrupted flag because we would get an
+	 * infinite loop otherwise */
+	interrupted = 0;
+
 	interrupt = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
 	if (interrupt != NULL) {
 	    ignoreErrors = FALSE;
---------------------
PatchSet 374
Date: 2004/11/17 11:32:46
Author: harti
Log:
Eliminate the define for POSIX and build with Posix behaviour.
Our make has been build with POSIX enabled from the first day
and the ifdef'ed out code served no purpose.

Members: 
	config.h:1.14->1.15 
	main.c:1.97->1.98 
	parse.c:1.57->1.58 

Index: config.h
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/config.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- config.h	11 Nov 2004 12:23:39 -0000	1.14
+++ config.h	17 Nov 2004 11:32:46 -0000	1.15
@@ -78,15 +78,6 @@
 #define	RECHECK
 
 /*
- * POSIX
- *	Adhere to the POSIX 1003.2 draft for the make(1) program.
- *	- Use MAKEFLAGS instead of MAKE to pick arguments from the
- *	  environment.
- *	- Allow empty command lines if starting with tab.
- */
-#define	POSIX
-
-/*
  * SYSVINCLUDE
  *	Recognize system V like include directives [include "filename"]
  * SYSVVARSUB
Index: main.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/main.c,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -r1.97 -r1.98
--- main.c	12 Nov 2004 20:37:27 -0000	1.97
+++ main.c	17 Nov 2004 11:32:46 -0000	1.98
@@ -612,11 +612,7 @@
 	 * (Note this is *not* MAKEFLAGS since /bin/make uses that and it's
 	 * in a different format).
 	 */
-#ifdef POSIX
 	Main_ParseArgLine(getenv("MAKEFLAGS"));
-#else
-	Main_ParseArgLine(getenv("MAKE"));
-#endif
 
 	MainParseArgs(argc, argv);
 
@@ -766,11 +762,7 @@
 
 	/* Install all the flags into the MAKE envariable. */
 	if (((p = Var_Value(MAKEFLAGS, VAR_GLOBAL, &p1)) != NULL) && *p)
-#ifdef POSIX
 		setenv("MAKEFLAGS", p, 1);
-#else
-		setenv("MAKE", p, 1);
-#endif
 	free(p1);
 
 	/*
Index: parse.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -r1.57 -r1.58
--- parse.c	22 Jul 2004 11:12:01 -0000	1.57
+++ parse.c	17 Nov 2004 11:32:46 -0000	1.58
@@ -143,9 +143,7 @@
     Parallel,	    /* .PARALLEL */
     ExPath,	    /* .PATH */
     Phony,	    /* .PHONY */
-#ifdef POSIX
     Posix,	    /* .POSIX */
-#endif
     Precious,	    /* .PRECIOUS */
     ExShell,	    /* .SHELL */
     Silent,	    /* .SILENT */
@@ -199,9 +197,7 @@
 { ".PARALLEL",	  Parallel,	0 },
 { ".PATH",	  ExPath,	0 },
 { ".PHONY",	  Phony,	OP_PHONY },
-#ifdef POSIX
 { ".POSIX",	  Posix,	0 },
-#endif
 { ".PRECIOUS",	  Precious, 	OP_PRECIOUS },
 { ".RECURSIVE",	  Attribute,	OP_MAKE },
 { ".SHELL", 	  ExShell,    	0 },
@@ -1034,11 +1030,9 @@
 	    case ExPath:
 		Lst_ForEach(paths, ParseClearPath, (void *)NULL);
 		break;
-#ifdef POSIX
 	    case Posix:
 		Var_Set("%POSIX", "1003.2", VAR_GLOBAL);
 		break;
-#endif
 	    default:
 		break;
 	}
@@ -2428,9 +2422,6 @@
 		 * If a line starts with a tab, it can only hope to be
 		 * a creation command.
 		 */
-#ifndef POSIX
-	    shellCommand:
-#endif
 		for (cp = line + 1; isspace ((unsigned char) *cp); cp++) {
 		    continue;
 		}
@@ -2474,10 +2465,6 @@
 		 * line's script, we assume it's actually a shell command
 		 * and add it to the current list of targets.
 		 */
-#ifndef POSIX
-		Boolean	nonSpace = FALSE;
-#endif
-
 		cp = line;
 		if (isspace((unsigned char) line[0])) {
 		    while ((*cp != '\0') && isspace((unsigned char) *cp)) {
@@ -2486,44 +2473,24 @@
 		    if (*cp == '\0') {
 			goto nextLine;
 		    }
-#ifndef POSIX
-		    while ((*cp != ':') && (*cp != '!') && (*cp != '\0')) {
-			nonSpace = TRUE;
-			cp++;
-		    }
-#endif
 		}
 
-#ifndef POSIX
-		if (*cp == '\0') {
-		    if (inLine) {
-			Parse_Error (PARSE_WARNING,
-				     "Shell command needs a leading tab");
-			goto shellCommand;
-		    } else if (nonSpace) {
-			Parse_Error (PARSE_FATAL, "Missing operator");
-		    }
-		} else {
-#endif
-		    ParseFinishLine();
+		ParseFinishLine();
 
-		    cp = Var_Subst (NULL, line, VAR_CMD, TRUE);
-		    free (line);
-		    line = cp;
+		cp = Var_Subst (NULL, line, VAR_CMD, TRUE);
+		free (line);
+		line = cp;
 
-		    /*
-		     * Need a non-circular list for the target nodes
-		     */
-		    if (targets)
-			Lst_Destroy(targets, NOFREE);
+		/*
+		 * Need a non-circular list for the target nodes
+		 */
+		if (targets)
+		    Lst_Destroy(targets, NOFREE);
 
-		    targets = Lst_Init (FALSE);
-		    inLine = TRUE;
+		targets = Lst_Init (FALSE);
+		inLine = TRUE;
 
-		    ParseDoDependency (line);
-#ifndef POSIX
-		}
-#endif
+		ParseDoDependency (line);
 	    }
 
 	    nextLine:
---------------------
PatchSet 365
Date: 2004/10/23 22:36:55
Author: ru
Log:
"unset verbose" is 13 characters, not 10.

Members: 
	job.c:1.51->1.52 

Index: job.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- job.c	23 Oct 2004 21:34:41 -0000	1.51
+++ job.c	23 Oct 2004 21:36:55 -0000	1.52
@@ -182,7 +182,7 @@
      */
 {
     "csh",
-    TRUE, "unset verbose", "set verbose", "unset verbose", 10,
+    TRUE, "unset verbose", "set verbose", "unset verbose", 13,
     FALSE, "echo \"%s\"\n", "csh -c \"%s || exit 0\"",
     "v", "e",
 },
---------------------
PatchSet 375
Date: 2004/11/22 15:45:57
Author: harti
Log:
Get rid of the shell table sentinel. It isn't needed anymore because
JobMatchShell returns NULL when no shell name matches since revision 1.51.

Members: 
	job.c:1.58->1.59 

Index: job.c
===================================================================
RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/job.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- job.c	12 Nov 2004 13:14:56 -0000	1.58
+++ job.c	22 Nov 2004 15:45:57 -0000	1.59
@@ -205,15 +205,6 @@
     TRUE, "set -e", "set +e",
     "v", "e",
 },
-    /*
-     * UNKNOWN.
-     */
-{
-    (char *) 0,
-    FALSE, (char *) 0, (char *) 0, (char *) 0, 0,
-    FALSE, (char *) 0, (char *) 0,
-    (char *) 0, (char *) 0,
-}
 };
 static Shell 	*commandShell = &shells[DEFSHELL];/* this is the shell to
 						   * which we pass all
@@ -2345,7 +2336,7 @@
 
     match = NULL;
 
-    for (sh = shells; sh->name != NULL; sh++) {
+    for (sh = shells; sh < shells + sizeof(shells) / sizeof(shells[0]); sh++) {
 	for (cp1 = eoname - strlen(sh->name), cp2 = sh->name;
 	     *cp1 != '\0' && *cp1 == *cp2;
 	     cp1++, cp2++) {




More information about the Submit mailing list