Module Name:    src
Committed By:   sjg
Date:           Thu Aug 30 21:17:05 UTC 2012

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

Log Message:
Add a knob to control whether -V fully expands a plain variable by default.
The default retains the traditional NetBSD behavior, but the knob
can be set so that FreeBSD can retain their expected behavior.
This is a compromise to be sure.

Add a debug flag -dV to override the above, so that regardless of
the knob setting, the raw value of a variable can be easily seen.


To generate a diff of this commit:
cvs rdiff -u -r1.200 -r1.201 src/usr.bin/make/main.c
cvs rdiff -u -r1.64 -r1.65 src/usr.bin/make/nonints.h

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.200 src/usr.bin/make/main.c:1.201
--- src/usr.bin/make/main.c:1.200	Tue Jun 12 19:21:51 2012
+++ src/usr.bin/make/main.c	Thu Aug 30 21:17:05 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.200 2012/06/12 19:21:51 joerg Exp $	*/
+/*	$NetBSD: main.c,v 1.201 2012/08/30 21:17:05 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,7 +69,7 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: main.c,v 1.200 2012/06/12 19:21:51 joerg Exp $";
+static char rcsid[] = "$NetBSD: main.c,v 1.201 2012/08/30 21:17:05 sjg Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
@@ -81,7 +81,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
 #if 0
 static char sccsid[] = "@(#)main.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: main.c,v 1.200 2012/06/12 19:21:51 joerg Exp $");
+__RCSID("$NetBSD: main.c,v 1.201 2012/08/30 21:17:05 sjg Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -159,6 +159,7 @@ int			maxJobs;	/* -j argument */
 static int		maxJobTokens;	/* -j argument */
 Boolean			compatMake;	/* -B argument */
 int			debug;		/* -d argument */
+Boolean			debugVflag;	/* -dV */
 Boolean			noExecute;	/* -n flag */
 Boolean			noRecursiveExecute;	/* -N flag */
 Boolean			keepgoing;	/* -k flag */
@@ -260,6 +261,9 @@ parse_debug_options(const char *argvalue
 		case 't':
 			debug |= DEBUG_TARG;
 			break;
+		case 'V':
+			debugVflag = TRUE;
+			break;
 		case 'v':
 			debug |= DEBUG_VAR;
 			break;
@@ -877,6 +881,7 @@ main(int argc, char **argv)
 	create = Lst_Init(FALSE);
 	makefiles = Lst_Init(FALSE);
 	printVars = FALSE;
+	debugVflag = FALSE;
 	variables = Lst_Init(FALSE);
 	beSilent = FALSE;		/* Print commands as executed */
 	ignoreErrors = FALSE;		/* Pay attention to non-zero returns */
@@ -1214,7 +1219,12 @@ main(int argc, char **argv)
 	/* print the values of any variables requested by the user */
 	if (printVars) {
 		LstNode ln;
+		Boolean expandVars;
 
+		if (debugVflag)
+			expandVars = FALSE;
+		else
+			expandVars = getBoolean(".MAKE.EXPAND_VARIABLES", FALSE);
 		for (ln = Lst_First(variables); ln != NULL;
 		    ln = Lst_Succ(ln)) {
 			char *var = (char *)Lst_Datum(ln);
@@ -1222,6 +1232,13 @@ main(int argc, char **argv)
 			
 			if (strchr(var, '$')) {
 				value = p1 = Var_Subst(NULL, var, VAR_GLOBAL, 0);
+			} else if (expandVars) {
+				char tmp[128];
+								
+				if (snprintf(tmp, sizeof(tmp), "${%s}", var) >= sizeof(tmp))
+					Fatal("%s: variable name too big: %s",
+					      progname, var);
+				value = p1 = Var_Subst(NULL, tmp, VAR_GLOBAL, 0);
 			} else {
 				value = Var_Value(var, VAR_GLOBAL, &p1);
 			}
@@ -2019,3 +2036,49 @@ mkTempFile(const char *pattern, char **f
     }
     return fd;
 }
+
+
+/*
+ * Return a Boolean based on setting of a knob.
+ *
+ * If the knob is not set, the supplied default is the return value.
+ * If set, anything that looks or smells like "No", "False", "Off", "0" etc,
+ * is FALSE, otherwise TRUE.
+ */
+Boolean
+getBoolean(const char *name, Boolean bf)
+{
+    char tmp[64];
+    char *cp;
+
+    if (snprintf(tmp, sizeof(tmp), "${%s:tl}", name) < sizeof(tmp)) {
+	cp = Var_Subst(NULL, tmp, VAR_GLOBAL, 0);
+
+	if (cp) {
+	    switch(*cp) {
+	    case '\0':			/* not set - the default wins */
+		break;
+	    case '0':
+	    case 'f':
+	    case 'n':
+		bf = FALSE;
+		break;
+	    case 'o':
+		switch (cp[1]) {
+		case 'f':
+		    bf = FALSE;
+		    break;
+		default:
+		    bf = TRUE;
+		    break;
+		}
+		break;
+	    default:
+		bf = TRUE;
+		break;
+	    }
+	    free(cp);
+	}
+    }
+    return (bf);
+}

Index: src/usr.bin/make/nonints.h
diff -u src/usr.bin/make/nonints.h:1.64 src/usr.bin/make/nonints.h:1.65
--- src/usr.bin/make/nonints.h:1.64	Tue Jun 12 19:21:51 2012
+++ src/usr.bin/make/nonints.h	Thu Aug 30 21:17:05 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: nonints.h,v 1.64 2012/06/12 19:21:51 joerg Exp $	*/
+/*	$NetBSD: nonints.h,v 1.65 2012/08/30 21:17:05 sjg Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -118,6 +118,7 @@ void Finish(int) MAKE_ATTR_DEAD;
 int eunlink(const char *);
 void execError(const char *, const char *);
 char *getTmpdir(void);
+Boolean getBoolean(const char *, Boolean);
 
 /* parse.c */
 void Parse_Error(int, const char *, ...) MAKE_ATTR_PRINTFLIKE(2, 3);

Reply via email to