Fix PR/1831. See the ChangeLog.
authorPaul Smith <psmith@gnu.org>
Mon, 21 Aug 2000 06:18:35 +0000 (06:18 +0000)
committerPaul Smith <psmith@gnu.org>
Mon, 21 Aug 2000 06:18:35 +0000 (06:18 +0000)
ChangeLog
tests/scripts/features/targetvars
variable.c

index 9009827..a8ea9d3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2000-08-21  Paul D. Smith  <paul@paulandlesley.org>
+
+       * variable.c (try_variable_definition): Change how we handle
+       target-specific append variable defns: instead of just setting the
+       value, expand it as an append _but_ only within the current
+       target's context.  Otherwise we lose all but the last value if the
+       variable is appended more than once within the current target
+       context.  Fixes PR/1831.
+
 2000-07-25  Paul D. Smith  <psmith@gnu.org>
 
        * job.c (construct_command_argv_internal): Add "~" to the list of
index 52548f2..a1bd88e 100644 (file)
@@ -126,6 +126,7 @@ $answer = "foo bar\n";
 
 # TEST #9
 # For PR/1380: Using += assignment in target-specific variables sometimes fails
+# Also PR/1831
 
 $makefile3 = &get_tmpfile;
 
@@ -138,18 +139,19 @@ all: one; @echo $(FOO)
 FOO = bar
 
 one: FOO += biz
+one: FOO += boz
 one: ; @echo $(FOO)
 EOF
 close(MAKEFILE);
 
 &run_make_with_options("$makefile3", "", &get_logfile);
-$answer = "bar baz biz\nbar baz\n";
+$answer = "bar baz biz boz\nbar baz\n";
 &compare_output($answer, &get_logfile(1));
 
 # Test #10
 
 &run_make_with_options("$makefile3", "one", &get_logfile);
-$answer = "bar biz\n";
+$answer = "bar biz boz\n";
 &compare_output($answer, &get_logfile(1));
 
 # Test #11
index 300368d..75ceb78 100644 (file)
@@ -900,51 +900,56 @@ try_variable_definition (flocp, line, origin, target_var)
       value = p;
       break;
     case f_append:
-      /* If we have += but we're in a target variable context, defer the
-         append until the context expansion.  */
-      if (target_var)
-        {
-          append = 1;
-          flavor = f_recursive;
-          value = p;
-          break;
-        }
+      {
+        struct variable_set_list *saved_next = current_variable_set_list->next;
 
-      /* An appending variable definition "var += value".
-        Extract the old value and append the new one.  */
-      v = lookup_variable (expanded_name, strlen (expanded_name));
-      if (v == 0)
-       {
-         /* There was no old value.
-            This becomes a normal recursive definition.  */
-         value = p;
-         flavor = f_recursive;
-       }
-      else
-       {
-         /* Paste the old and new values together in VALUE.  */
+        /* If we have += but we're in a target variable context, we want to
+           append only with other variables in the context of this target.  */
+        if (target_var)
+          {
+            append = 1;
+            current_variable_set_list->next = 0;
+          }
 
-         unsigned int oldlen, newlen;
+        /* An appending variable definition "var += value".
+           Extract the old value and append the new one.  */
+        v = lookup_variable (expanded_name, strlen (expanded_name));
 
-         if (v->recursive)
-           /* The previous definition of the variable was recursive.
-              The new value comes from the unexpanded old and new values.  */
-           flavor = f_recursive;
-         else
-           /* The previous definition of the variable was simple.
-              The new value comes from the old value, which was expanded
-              when it was set; and from the expanded new value.  Allocate
-               memory for the expansion as we may still need the rest of the
-               buffer if we're looking at a target-specific variable.  */
-           p = alloc_value = allocated_variable_expand (p);
-
-         oldlen = strlen (v->value);
-         newlen = strlen (p);
-         value = (char *) alloca (oldlen + 1 + newlen + 1);
-         bcopy (v->value, value, oldlen);
-         value[oldlen] = ' ';
-         bcopy (p, &value[oldlen + 1], newlen + 1);
-       }
+        current_variable_set_list->next = saved_next;
+
+        if (v == 0)
+          {
+            /* There was no old value.
+               This becomes a normal recursive definition.  */
+            value = p;
+            flavor = f_recursive;
+          }
+        else
+          {
+            /* Paste the old and new values together in VALUE.  */
+
+            unsigned int oldlen, newlen;
+
+            if (v->recursive)
+              /* The previous definition of the variable was recursive.
+                 The new value is the unexpanded old and new values. */
+              flavor = f_recursive;
+            else
+              /* The previous definition of the variable was simple.
+                 The new value comes from the old value, which was expanded
+                 when it was set; and from the expanded new value.  Allocate
+                 memory for the expansion as we may still need the rest of the
+                 buffer if we're looking at a target-specific variable.  */
+              p = alloc_value = allocated_variable_expand (p);
+
+            oldlen = strlen (v->value);
+            newlen = strlen (p);
+            value = (char *) alloca (oldlen + 1 + newlen + 1);
+            bcopy (v->value, value, oldlen);
+            value[oldlen] = ' ';
+            bcopy (p, &value[oldlen + 1], newlen + 1);
+          }
+      }
     }
 
 #ifdef __MSDOS__
@@ -1032,21 +1037,23 @@ try_variable_definition (flocp, line, origin, target_var)
 #endif /* __MSDOS__ */
 #ifdef WINDOWS32
   if ((origin == o_file || origin == o_override)
-      && strcmp (expanded_name, "SHELL") == 0) {
-    extern char* default_shell;
+      && strcmp (expanded_name, "SHELL") == 0)
+    {
+      extern char* default_shell;
 
     /*
      * Call shell locator function. If it returns TRUE, then
         * set no_default_sh_exe to indicate sh was found and
      * set new value for SHELL variable.
         */
-    if (find_and_set_default_shell(value)) {
-       v = define_variable_loc (expanded_name, strlen (expanded_name),
-                                default_shell, origin, flavor == f_recursive,
-                                flocp);
-       no_default_sh_exe = 0;
+      if (find_and_set_default_shell(value)) {
+        v = define_variable_loc (expanded_name, strlen (expanded_name),
+                                 default_shell, origin, flavor == f_recursive,
+                                 flocp);
+        no_default_sh_exe = 0;
+      }
     }
-  else
+  else
 #endif
 
   v = define_variable_loc (expanded_name, strlen (expanded_name), value,