Module Name:    src
Committed By:   christos
Date:           Tue Mar  5 22:01:44 UTC 2013

Modified Files:
        src/usr.bin/make: dir.c job.c job.h make.1 parse.c

Log Message:
Add a .STALE special target that gets invoked when dependency files contain
stail entries.


To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.67 src/usr.bin/make/dir.c
cvs rdiff -u -r1.171 -r1.172 src/usr.bin/make/job.c
cvs rdiff -u -r1.40 -r1.41 src/usr.bin/make/job.h
cvs rdiff -u -r1.210 -r1.211 src/usr.bin/make/make.1
cvs rdiff -u -r1.186 -r1.187 src/usr.bin/make/parse.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/dir.c
diff -u src/usr.bin/make/dir.c:1.66 src/usr.bin/make/dir.c:1.67
--- src/usr.bin/make/dir.c:1.66	Mon Mar  4 21:04:10 2013
+++ src/usr.bin/make/dir.c	Tue Mar  5 17:01:43 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: dir.c,v 1.66 2013/03/05 02:04:10 christos Exp $	*/
+/*	$NetBSD: dir.c,v 1.67 2013/03/05 22:01:43 christos Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -70,14 +70,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: dir.c,v 1.66 2013/03/05 02:04:10 christos Exp $";
+static char rcsid[] = "$NetBSD: dir.c,v 1.67 2013/03/05 22:01:43 christos Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)dir.c	8.2 (Berkeley) 1/2/94";
 #else
-__RCSID("$NetBSD: dir.c,v 1.66 2013/03/05 02:04:10 christos Exp $");
+__RCSID("$NetBSD: dir.c,v 1.67 2013/03/05 22:01:43 christos Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -145,6 +145,7 @@ __RCSID("$NetBSD: dir.c,v 1.66 2013/03/0
 #include "make.h"
 #include "hash.h"
 #include "dir.h"
+#include "job.h"
 
 /*
  *	A search path consists of a Lst of Path structures. A Path structure
@@ -1463,10 +1464,11 @@ Dir_MTime(GNode *gn, Boolean recheck)
 			 * so that we give that to the compiler.
 			 */
 			gn->path = bmake_strdup(fullName);
-			fprintf(stdout,
-			    "%s: %s, %d: ignoring stale %s for %s, found %s\n",
-			    progname, gn->fname, gn->lineno,
-			    makeDependfile, gn->name, fullName);
+			if (!Job_RunTarget(".STALE", gn->fname))
+			    fprintf(stdout,
+				"%s: %s, %d: ignoring stale %s for %s, "
+				"found %s\n", progname, gn->fname, gn->lineno,
+				makeDependfile, gn->name, fullName);
 		    }
 		}
 	    }

Index: src/usr.bin/make/job.c
diff -u src/usr.bin/make/job.c:1.171 src/usr.bin/make/job.c:1.172
--- src/usr.bin/make/job.c:1.171	Mon Mar  4 21:04:10 2013
+++ src/usr.bin/make/job.c	Tue Mar  5 17:01:43 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.c,v 1.171 2013/03/05 02:04:10 christos Exp $	*/
+/*	$NetBSD: job.c,v 1.172 2013/03/05 22:01:43 christos Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -70,14 +70,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: job.c,v 1.171 2013/03/05 02:04:10 christos Exp $";
+static char rcsid[] = "$NetBSD: job.c,v 1.172 2013/03/05 22:01:43 christos Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)job.c	8.2 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: job.c,v 1.171 2013/03/05 02:04:10 christos Exp $");
+__RCSID("$NetBSD: job.c,v 1.172 2013/03/05 22:01:43 christos Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -1232,8 +1232,10 @@ Job_CheckCommands(GNode *gn, void (*abor
 	    static const char msg[] = ": don't know how to make";
 
 	    if (gn->flags & FROM_DEPEND) {
-		fprintf(stdout, "%s: %s, %d: ignoring stale %s for %s\n",
-		    progname, gn->fname, gn->lineno, makeDependfile, gn->name);
+		if (!Job_RunTarget(".STALE", gn->fname))
+		    fprintf(stdout, "%s: %s, %d: ignoring stale %s for %s\n",
+			progname, gn->fname, gn->lineno, makeDependfile,
+			gn->name);
 		return TRUE;
 	    }
 
@@ -2177,8 +2179,6 @@ Job_SetPrefix(void)
 void
 Job_Init(void)
 {
-    GNode         *begin;     /* node for commands to do at the very start */
-
     /* Allocate space for all the job info */
     job_table = bmake_malloc(maxJobs * sizeof *job_table);
     memset(job_table, 0, maxJobs * sizeof *job_table);
@@ -2254,15 +2254,7 @@ Job_Init(void)
     ADDSIG(SIGCONT, JobContinueSig)
 #undef ADDSIG
 
-    begin = Targ_FindNode(".BEGIN", TARG_NOCREATE);
-
-    if (begin != NULL) {
-	JobRun(begin);
-	if (begin->made == ERROR) {
-	    PrintOnError(begin, "\n\nStop.");
-	    exit(1);
-	}
-    }
+    (void)Job_RunTarget(".BEGIN", NULL);
     postCommands = Targ_FindNode(".END", TARG_CREATE);
 }
 
@@ -2928,6 +2920,38 @@ Job_TokenWithdraw(void)
     return TRUE;
 }
 
+/*-
+ *-----------------------------------------------------------------------
+ * Job_RunTarget --
+ *	Run the named target if found. If a filename is specified, then
+ *	set that to the sources.
+ *
+ * Results:
+ *	None
+ *
+ * Side Effects:
+ * 	exits if the target fails.
+ *
+ *-----------------------------------------------------------------------
+ */
+Boolean
+Job_RunTarget(const char *target, const char *fname) {
+    GNode *gn = Targ_FindNode(target, TARG_NOCREATE);
+
+    if (gn == NULL)
+	return FALSE;
+
+    if (fname)
+	Var_Set(ALLSRC, fname, gn, 0);
+
+    JobRun(gn);
+    if (gn->made == ERROR) {
+	PrintOnError(gn, "\n\nStop.");
+	exit(1);
+    }
+    return TRUE;
+}
+
 #ifdef USE_SELECT
 int
 emul_poll(struct pollfd *fd, int nfd, int timeout)

Index: src/usr.bin/make/job.h
diff -u src/usr.bin/make/job.h:1.40 src/usr.bin/make/job.h:1.41
--- src/usr.bin/make/job.h:1.40	Mon Sep 13 11:36:57 2010
+++ src/usr.bin/make/job.h	Tue Mar  5 17:01:44 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.h,v 1.40 2010/09/13 15:36:57 sjg Exp $	*/
+/*	$NetBSD: job.h,v 1.41 2013/03/05 22:01:44 christos Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -268,5 +268,6 @@ void Job_TokenReturn(void);
 Boolean Job_TokenWithdraw(void);
 void Job_ServerStart(int, int, int);
 void Job_SetPrefix(void);
+Boolean Job_RunTarget(const char *, const char *);
 
 #endif /* _JOB_H_ */

Index: src/usr.bin/make/make.1
diff -u src/usr.bin/make/make.1:1.210 src/usr.bin/make/make.1:1.211
--- src/usr.bin/make/make.1:1.210	Sun Jan 27 13:52:01 2013
+++ src/usr.bin/make/make.1	Tue Mar  5 17:01:44 2013
@@ -1,4 +1,4 @@
-.\"	$NetBSD: make.1,v 1.210 2013/01/27 18:52:01 sjg Exp $
+.\"	$NetBSD: make.1,v 1.211 2013/03/05 22:01:44 christos Exp $
 .\"
 .\" Copyright (c) 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
 .\"
-.Dd January 23, 2013
+.Dd March 5, 2013
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -2008,6 +2008,10 @@ If no sources are specified, the
 .Ic .SILENT
 attribute is applied to every
 command in the file.
+.It Ic .STALE
+This target gets run when a dependency file contains stale entries, having
+.Va .ALLSRC
+set to the name of that dependency file.
 .It Ic .SUFFIXES
 Each source specifies a suffix to
 .Nm .

Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.186 src/usr.bin/make/parse.c:1.187
--- src/usr.bin/make/parse.c:1.186	Mon Mar  4 21:04:11 2013
+++ src/usr.bin/make/parse.c	Tue Mar  5 17:01:44 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.186 2013/03/05 02:04:11 christos Exp $	*/
+/*	$NetBSD: parse.c,v 1.187 2013/03/05 22:01:44 christos Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: parse.c,v 1.186 2013/03/05 02:04:11 christos Exp $";
+static char rcsid[] = "$NetBSD: parse.c,v 1.187 2013/03/05 22:01:44 christos Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)parse.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: parse.c,v 1.186 2013/03/05 02:04:11 christos Exp $");
+__RCSID("$NetBSD: parse.c,v 1.187 2013/03/05 22:01:44 christos Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -210,6 +210,7 @@ typedef enum {
     ExShell,	    /* .SHELL */
     Silent,	    /* .SILENT */
     SingleShell,    /* .SINGLESHELL */
+    Stale,	    /* .STALE */
     Suffixes,	    /* .SUFFIXES */
     Wait,	    /* .WAIT */
     Attribute	    /* Generic attribute */
@@ -333,6 +334,7 @@ static const struct {
 { ".SHELL", 	  ExShell,    	0 },
 { ".SILENT",	  Silent,   	OP_SILENT },
 { ".SINGLESHELL", SingleShell,	0 },
+{ ".STALE",	  Stale,	0 },
 { ".SUFFIXES",	  Suffixes, 	0 },
 { ".USE",   	  Attribute,   	OP_USE },
 { ".USEBEFORE",   Attribute,   	OP_USEBEFORE },
@@ -1292,6 +1294,7 @@ ParseDoDependency(char *line)
 		 *	    	    	apply the .DEFAULT commands.
 		 *	.PHONY		The list of targets
 		 *	.NOPATH		Don't search for file in the path
+		 *	.STALE
 		 *	.BEGIN
 		 *	.END
 		 *	.ERROR
@@ -1302,44 +1305,45 @@ ParseDoDependency(char *line)
 		 *  	.ORDER	    	Must set initial predecessor to NULL
 		 */
 		switch (specType) {
-		    case ExPath:
-			if (paths == NULL) {
-			    paths = Lst_Init(FALSE);
-			}
-			(void)Lst_AtEnd(paths, dirSearchPath);
-			break;
-		    case Main:
-			if (!Lst_IsEmpty(create)) {
-			    specType = Not;
-			}
-			break;
-		    case Begin:
-		    case End:
-		    case dotError:
-		    case Interrupt:
-			gn = Targ_FindNode(line, TARG_CREATE);
-			if (doing_depend)
-			    ParseMark(gn);
-			gn->type |= OP_NOTMAIN|OP_SPECIAL;
-			(void)Lst_AtEnd(targets, gn);
-			break;
-		    case Default:
-			gn = Targ_NewGN(".DEFAULT");
-			gn->type |= (OP_NOTMAIN|OP_TRANSFORM);
-			(void)Lst_AtEnd(targets, gn);
-			DEFAULT = gn;
-			break;
-		    case NotParallel:
-			maxJobs = 1;
-			break;
-		    case SingleShell:
-			compatMake = TRUE;
-			break;
-		    case Order:
-			predecessor = NULL;
-			break;
-		    default:
-			break;
+		case ExPath:
+		    if (paths == NULL) {
+			paths = Lst_Init(FALSE);
+		    }
+		    (void)Lst_AtEnd(paths, dirSearchPath);
+		    break;
+		case Main:
+		    if (!Lst_IsEmpty(create)) {
+			specType = Not;
+		    }
+		    break;
+		case Begin:
+		case End:
+		case Stale:
+		case dotError:
+		case Interrupt:
+		    gn = Targ_FindNode(line, TARG_CREATE);
+		    if (doing_depend)
+			ParseMark(gn);
+		    gn->type |= OP_NOTMAIN|OP_SPECIAL;
+		    (void)Lst_AtEnd(targets, gn);
+		    break;
+		case Default:
+		    gn = Targ_NewGN(".DEFAULT");
+		    gn->type |= (OP_NOTMAIN|OP_TRANSFORM);
+		    (void)Lst_AtEnd(targets, gn);
+		    DEFAULT = gn;
+		    break;
+		case NotParallel:
+		    maxJobs = 1;
+		    break;
+		case SingleShell:
+		    compatMake = TRUE;
+		    break;
+		case Order:
+		    predecessor = NULL;
+		    break;
+		default:
+		    break;
 		}
 	    } else if (strncmp(line, ".PATH", 5) == 0) {
 		/*
@@ -1447,6 +1451,7 @@ ParseDoDependency(char *line)
 		Parse_Error(PARSE_WARNING, "Special and mundane targets don't mix. Mundane ones ignored");
 		break;
 	    case Default:
+	    case Stale:
 	    case Begin:
 	    case End:
 	    case dotError:

Reply via email to