Module Name:    src
Committed By:   sjg
Date:           Tue Sep  8 17:29:20 UTC 2009

Modified Files:
        src/usr.bin/make: main.c make.1 make.h var.c

Log Message:
Reviewed by: apb

Use .MAKE.LEVEL to track recursion.
The first instance of make will have .MAKE.LEVEL 0, which
can be handy for excluding rules which should not apply
in a sub-make.
gmake and freebsd's make have a similar mechanism, but each
uses a different variable to track it.  Since we cannot be
compatible with both, we allow the makefiles to cope if they want
by handling the export of .MAKE.LEVEL+1 in Var_Set().


To generate a diff of this commit:
cvs rdiff -u -r1.172 -r1.173 src/usr.bin/make/main.c
cvs rdiff -u -r1.160 -r1.161 src/usr.bin/make/make.1
cvs rdiff -u -r1.78 -r1.79 src/usr.bin/make/make.h
cvs rdiff -u -r1.153 -r1.154 src/usr.bin/make/var.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/main.c
diff -u src/usr.bin/make/main.c:1.172 src/usr.bin/make/main.c:1.173
--- src/usr.bin/make/main.c:1.172	Thu Sep  3 06:45:23 2009
+++ src/usr.bin/make/main.c	Tue Sep  8 17:29:20 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.172 2009/09/03 06:45:23 dholland Exp $	*/
+/*	$NetBSD: main.c,v 1.173 2009/09/08 17:29:20 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,7 +69,7 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: main.c,v 1.172 2009/09/03 06:45:23 dholland Exp $";
+static char rcsid[] = "$NetBSD: main.c,v 1.173 2009/09/08 17:29:20 sjg Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
@@ -81,7 +81,7 @@
 #if 0
 static char sccsid[] = "@(#)main.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: main.c,v 1.172 2009/09/03 06:45:23 dholland Exp $");
+__RCSID("$NetBSD: main.c,v 1.173 2009/09/08 17:29:20 sjg Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -916,7 +916,12 @@
 	 */
 	{
 	    char tmp[64];
+	    const char *ep;
 
+	    if (!(ep = getenv(MAKE_LEVEL))) {
+		ep = "0";
+	    }
+	    Var_Set(MAKE_LEVEL, ep, VAR_GLOBAL, 0);
 	    snprintf(tmp, sizeof(tmp), "%u", getpid());
 	    Var_Set(".MAKE.PID", tmp, VAR_GLOBAL, 0);
 	    snprintf(tmp, sizeof(tmp), "%u", getppid());

Index: src/usr.bin/make/make.1
diff -u src/usr.bin/make/make.1:1.160 src/usr.bin/make/make.1:1.161
--- src/usr.bin/make/make.1:1.160	Wed Aug 26 23:18:57 2009
+++ src/usr.bin/make/make.1	Tue Sep  8 17:29:20 2009
@@ -1,4 +1,4 @@
-.\"	$NetBSD: make.1,v 1.160 2009/08/26 23:18:57 sjg Exp $
+.\"	$NetBSD: make.1,v 1.161 2009/09/08 17:29:20 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 August 26, 2009
+.Dd September 7, 2009
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -660,6 +660,17 @@
 .Nm ,
 which is useful for tracking dependencies.
 Each makefile is recorded only once, regardless of the number of times read.
+.It Va .MAKE.LEVEL
+The recursion depth of
+.Nm .
+The initial instance of 
+.Nm
+will be 0, and an incremented value is put into the environment
+to be seen by the next generation.  
+This allows tests like:
+.Li .if ${.MAKE.LEVEL} == 0
+to protect things which should only be evaluated in the initial instance of
+.Nm .
 .It Va .MAKE.PID
 The process-id of
 .Nm .

Index: src/usr.bin/make/make.h
diff -u src/usr.bin/make/make.h:1.78 src/usr.bin/make/make.h:1.79
--- src/usr.bin/make/make.h:1.78	Sat Jan 24 14:43:28 2009
+++ src/usr.bin/make/make.h	Tue Sep  8 17:29:20 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.h,v 1.78 2009/01/24 14:43:28 dsl Exp $	*/
+/*	$NetBSD: make.h,v 1.79 2009/09/08 17:29:20 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -398,6 +398,7 @@
 #define	MAKE_JOB_PREFIX	".MAKE.JOB.PREFIX" /* prefix for job target output */
 #define	MAKE_EXPORTED	".MAKE.EXPORTED"   /* variables we export */
 #define	MAKE_MAKEFILES	".MAKE.MAKEFILES"  /* all the makefiles we read */
+#define	MAKE_LEVEL	".MAKE.LEVEL"	   /* recursion level */
 
 /*
  * debug control:

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.153 src/usr.bin/make/var.c:1.154
--- src/usr.bin/make/var.c:1.153	Mon Sep  7 17:56:24 2009
+++ src/usr.bin/make/var.c	Tue Sep  8 17:29:20 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.153 2009/09/07 17:56:24 sjg Exp $	*/
+/*	$NetBSD: var.c,v 1.154 2009/09/08 17:29:20 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.153 2009/09/07 17:56:24 sjg Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.154 2009/09/08 17:29:20 sjg Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)var.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: var.c,v 1.153 2009/09/07 17:56:24 sjg Exp $");
+__RCSID("$NetBSD: var.c,v 1.154 2009/09/08 17:29:20 sjg Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -811,6 +811,23 @@
 
 	Var_Append(MAKEOVERRIDES, name, VAR_GLOBAL);
     }
+    /*
+     * Another special case.
+     * Several make's support this sort of mechanism for tracking
+     * recursion - but each uses a different name.
+     * We allow the makefiles to update .MAKE.LEVEL and ensure
+     * children see a correctly incremented value.
+     */
+    if (ctxt == VAR_GLOBAL && strcmp(MAKE_LEVEL, name) == 0) {
+	char tmp[64];
+	int level;
+	
+	level = atoi(val);
+	snprintf(tmp, sizeof(tmp), "%u", level + 1);
+	setenv(MAKE_LEVEL, tmp, 1);
+    }
+	
+	
  out:
     if (expanded_name != NULL)
 	free(expanded_name);

Reply via email to