VAR_CMD context is used by conditionals and other purposes, so

actually set VAR_FROM_CMD when appropriate and only skip setting in
VAR_GLOBAL when that flag is set.
This commit is contained in:
sjg 2008-05-15 21:05:54 +00:00
parent f147f68f57
commit f2c43a72d5
2 changed files with 20 additions and 11 deletions

View File

@ -302,5 +302,5 @@ three FU=<v>bar</v> FOO=<v>goo</v> VAR=<v></v>
four FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v>
five FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v>
five v=is x k=is x
six v=is x k=is x
show-v v=override k=is x
six v=is y k=is y
show-v v=override k=override

View File

@ -1,4 +1,4 @@
/* $NetBSD: var.c,v 1.130 2008/05/15 18:25:12 sjg Exp $ */
/* $NetBSD: var.c,v 1.131 2008/05/15 21:05:54 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@ -69,14 +69,14 @@
*/
#ifndef MAKE_NATIVE
static char rcsid[] = "$NetBSD: var.c,v 1.130 2008/05/15 18:25:12 sjg Exp $";
static char rcsid[] = "$NetBSD: var.c,v 1.131 2008/05/15 21:05:54 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.130 2008/05/15 18:25:12 sjg Exp $");
__RCSID("$NetBSD: var.c,v 1.131 2008/05/15 21:05:54 sjg Exp $");
#endif
#endif /* not lint */
#endif
@ -191,6 +191,7 @@ typedef struct Var {
#define VAR_REEXPORT 32 /* Indicate if var needs re-export.
* This would be true if it contains $'s
*/
#define VAR_FROM_CMD 64 /* Variable came from command line */
} Var;
/*
@ -729,6 +730,8 @@ Var_Export(char *str, int isExport)
* VAR_CMD->context is searched. This is done to avoid the literally
* thousands of unnecessary strcmp's that used to be done to
* set, say, $(@) or $(<).
* If the context is VAR_GLOBAL though, we check if the variable
* was set in VAR_CMD from the command line and skip it if so.
*-----------------------------------------------------------------------
*/
void
@ -746,14 +749,18 @@ Var_Set(const char *name, const char *val, GNode *ctxt, int flags)
name = Var_Subst(NULL, cp, ctxt, 0);
} else
name = cp;
#ifdef skip_global_if_cmd
if (ctxt == VAR_GLOBAL) {
v = VarFind(name, VAR_CMD, 0);
if (v != (Var *)NIL) {
goto out;
if ((v->flags & VAR_FROM_CMD)) {
if (DEBUG(VAR)) {
fprintf(debug_file, "%s:%s = %s ignored!\n", ctxt->name, name, val);
}
goto out;
}
VarFreeEnv(v, TRUE);
}
}
#endif
v = VarFind(name, ctxt, 0);
if (v == (Var *)NIL) {
VarAdd(name, val, ctxt);
@ -773,7 +780,11 @@ Var_Set(const char *name, const char *val, GNode *ctxt, int flags)
* to the environment (as per POSIX standard)
*/
if (ctxt == VAR_CMD && (flags & VAR_NO_EXPORT) == 0) {
if (v == (Var *)NIL) {
/* we just added it */
v = VarFind(name, ctxt, 0);
}
v->flags |= VAR_FROM_CMD;
/*
* If requested, don't export these in the environment
* individually. We still put them in MAKEOVERRIDES so
@ -785,9 +796,7 @@ Var_Set(const char *name, const char *val, GNode *ctxt, int flags)
Var_Append(MAKEOVERRIDES, name, VAR_GLOBAL);
}
#ifdef skip_global_if_cmd
out:
#endif
if (name != cp)
free(UNCONST(name));
if (v != (Var *)NIL)