Module Name:    src
Committed By:   sjg
Date:           Sun Mar 31 05:49:51 UTC 2013

Modified Files:
        src/usr.bin/make: make.1 meta.c

Log Message:
Refine the effect of .OODATE on command comparison.
Rather than apply it to the whole script, just the current command line
is affected.   This allows a trick like ${.OODATE:M.NOMETA_CMP}
to cause command comparison to be supressed for one command only.


To generate a diff of this commit:
cvs rdiff -u -r1.212 -r1.213 src/usr.bin/make/make.1
cvs rdiff -u -r1.28 -r1.29 src/usr.bin/make/meta.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/make.1
diff -u src/usr.bin/make/make.1:1.212 src/usr.bin/make/make.1:1.213
--- src/usr.bin/make/make.1:1.212	Sat Mar 23 05:31:29 2013
+++ src/usr.bin/make/make.1	Sun Mar 31 05:49:51 2013
@@ -1,4 +1,4 @@
-.\"	$NetBSD: make.1,v 1.212 2013/03/23 05:31:29 sjg Exp $
+.\"	$NetBSD: make.1,v 1.213 2013/03/31 05:49:51 sjg 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 March 22, 2013
+.Dd March 30, 2013
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -1764,6 +1764,20 @@ targets.
 Ignore differences in commands when deciding if target is out of date.
 This is useful if the command contains a value which always changes.
 If the number of commands change, though, the target will still be out of date.
+The same effect applies to any command line that uses the variable
+.Va .OODATE ,
+which can be used for that purpose even when not otherwise needed or desired:
+.Bd -literal -offset indent
+
+skip-compare-for-some:
+	@echo this will be compared
+	@echo this will not ${.OODATE:M.NOMETA_CMP}
+	@echo this will also be compared
+
+.Ed
+The
+.Cm \&:M
+pattern suppresses any expansion of the unwanted variable.
 .It Ic .NOPATH
 Do not search for the target in the directories specified by
 .Ic .PATH .

Index: src/usr.bin/make/meta.c
diff -u src/usr.bin/make/meta.c:1.28 src/usr.bin/make/meta.c:1.29
--- src/usr.bin/make/meta.c:1.28	Sat Mar 23 23:39:47 2013
+++ src/usr.bin/make/meta.c	Sun Mar 31 05:49:51 2013
@@ -1,4 +1,4 @@
-/*      $NetBSD: meta.c,v 1.28 2013/03/23 23:39:47 sjg Exp $ */
+/*      $NetBSD: meta.c,v 1.29 2013/03/31 05:49:51 sjg Exp $ */
 
 /*
  * Implement 'meta' mode.
@@ -1213,17 +1213,19 @@ meta_oodate(GNode *gn, Boolean oodate)
 		    oodate = TRUE;
 		} else {
 		    char *cmd = (char *)Lst_Datum(ln);
+		    Boolean hasOODATE = FALSE;
 
-		    if (!needOODATE) {
-			if (strstr(cmd, "$?"))
-			    needOODATE = TRUE;
-			else if ((cp = strstr(cmd, ".OODATE"))) {
-			    /* check for $[{(].OODATE[)}] */
-			    if (cp > cmd + 2 && cp[-2] == '$')
-				needOODATE = TRUE;
-			}
-			if (needOODATE && DEBUG(META))
-			    fprintf(debug_file, "%s: %d: cannot compare commands using .OODATE\n", fname, lineno);
+		    if (strstr(cmd, "$?"))
+			hasOODATE = TRUE;
+		    else if ((cp = strstr(cmd, ".OODATE"))) {
+			/* check for $[{(].OODATE[:)}] */
+			if (cp > cmd + 2 && cp[-2] == '$')
+			    hasOODATE = TRUE;
+		    }
+		    if (hasOODATE) {
+			needOODATE = TRUE;
+			if (DEBUG(META))
+			    fprintf(debug_file, "%s: %d: cannot compare command using .OODATE\n", fname, lineno);
 		    }
 		    cmd = Var_Subst(NULL, cmd, gn, TRUE);
 
@@ -1252,7 +1254,7 @@ meta_oodate(GNode *gn, Boolean oodate)
 			if (buf[x - 1] == '\n')
 			    buf[x - 1] = '\0';
 		    }
-		    if (!needOODATE &&
+		    if (!hasOODATE &&
 			!(gn->type & OP_NOMETA_CMP) &&
 			strcmp(p, cmd) != 0) {
 			if (DEBUG(META))

Reply via email to