From f15efca8112bc2cd4f120a64fcc3aa4fa70a871e Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Sat, 7 May 2011 20:03:49 +0000 Subject: [PATCH] Ensure private variables are not used when appending target-specific variables. Fixes Savannah bug #32872. --- ChangeLog | 5 +++++ expand.c | 13 +++++++------ tests/ChangeLog | 3 +++ tests/scripts/variables/private | 12 ++++++++++++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index a8c865f8..b72f24c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-05-07 Paul Smith + * 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 diff --git a/expand.c b/expand.c index 2315b068..d1404b94 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 73b49fa3..629242c0 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,5 +1,8 @@ 2011-05-07 Paul Smith + * 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 b4baf5f2..17977455 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;