Ensure private variables are not used when appending target-specific
authorPaul Smith <psmith@gnu.org>
Sat, 7 May 2011 20:03:49 +0000 (20:03 +0000)
committerPaul Smith <psmith@gnu.org>
Sat, 7 May 2011 20:03:49 +0000 (20:03 +0000)
variables.  Fixes Savannah bug #32872.

ChangeLog
expand.c
tests/ChangeLog
tests/scripts/variables/private

index a8c865f..b72f24c 100644 (file)
--- 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>
index 2315b06..d1404b9 100644 (file)
--- 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;
 
index 73b49fa..629242c 100644 (file)
@@ -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.
 
index b4baf5f..1797745 100644 (file)
@@ -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;