summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--expand.c13
-rw-r--r--tests/ChangeLog3
-rw-r--r--tests/scripts/variables/private12
4 files changed, 27 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index a8c865f..b72f24c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2011-05-07 Paul Smith <psmith@gnu.org>
+ * expand.c (variable_append): Add a LOCAL argument to track
+ whether this is the first invocation or not. If it's not and
+ private_var is set, then skip this variable and try the next one.
+ Fixes Savannah bug #32872.
+
* read.c (parse_file_seq): Ensure existence checks use glob().
2011-05-07 Eli Zaretskii <eliz@gnu.org>
diff --git a/expand.c b/expand.c
index 2315b06..d1404b9 100644
--- a/expand.c
+++ b/expand.c
@@ -499,7 +499,7 @@ variable_expand_for_file (const char *line, struct file *file)
static char *
variable_append (const char *name, unsigned int length,
- const struct variable_set_list *set)
+ const struct variable_set_list *set, int local)
{
const struct variable *v;
char *buf = 0;
@@ -511,14 +511,14 @@ variable_append (const char *name, unsigned int length,
/* Try to find the variable in this variable set. */
v = lookup_variable_in_set (name, length, set->set);
- /* If there isn't one, look to see if there's one in a set above us. */
- if (!v)
- return variable_append (name, length, set->next);
+ /* If there isn't one, or this one is private, try the set above us. */
+ if (!v || (!local && v->private_var))
+ return variable_append (name, length, set->next, 0);
/* If this variable type is append, first get any upper values.
If not, initialize the buffer. */
if (v->append)
- buf = variable_append (name, length, set->next);
+ buf = variable_append (name, length, set->next, 0);
else
buf = initialize_variable_output ();
@@ -548,7 +548,8 @@ allocated_variable_append (const struct variable *v)
variable_buffer = 0;
- val = variable_append (v->name, strlen (v->name), current_variable_set_list);
+ val = variable_append (v->name, strlen (v->name),
+ current_variable_set_list, 1);
variable_buffer_output (val, "", 1);
val = variable_buffer;
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 73b49fa..629242c 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,5 +1,8 @@
2011-05-07 Paul Smith <psmith@gnu.org>
+ * scripts/variables/private: Ensure we skip private variables when
+ appending. Test for Savannah bug #32872.
+
* scripts/functions/wildcard: Verify wildcard used to test for
file existence/non-existence.
diff --git a/tests/scripts/variables/private b/tests/scripts/variables/private
index b4baf5f..1797745 100644
--- a/tests/scripts/variables/private
+++ b/tests/scripts/variables/private
@@ -75,4 +75,16 @@ a b: ; @echo $@=$(private)
',
'', "b=a\na=a\n");
+# 9: make sure private suppresses inheritence
+run_make_test(q!
+DEFS = FOO
+all: bar1
+bar1: private DEFS += 1
+bar3: private DEFS += 3
+bar1: bar2
+bar2: bar3
+bar1 bar2 bar3: ; @echo '$@: $(DEFS)'
+!,
+ '', "bar3: FOO 3\nbar2: FOO\nbar1: FOO 1\n");
+
1;