summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--tests/scripts/features/targetvars6
-rw-r--r--variable.c107
3 files changed, 70 insertions, 52 deletions
diff --git a/ChangeLog b/ChangeLog
index 9009827..a8ea9d3 100644
--- 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
diff --git a/tests/scripts/features/targetvars b/tests/scripts/features/targetvars
index 52548f2..a1bd88e 100644
--- a/tests/scripts/features/targetvars
+++ b/tests/scripts/features/targetvars
@@ -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
diff --git a/variable.c b/variable.c
index 300368d..75ceb78 100644
--- a/variable.c
+++ b/variable.c
@@ -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,