summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@kolpackov.net>2004-10-05 16:56:14 +0000
committerBoris Kolpackov <boris@kolpackov.net>2004-10-05 16:56:14 +0000
commitb0d67e0e15490e43bbc074ec50618488c206399b (patch)
tree68ffc649b47bf74c8a738bca4872136839b1d0a5
parentfb6410f43583a9e0b457d675e1bc2d1ed5ba279b (diff)
downloadgunmake-b0d67e0e15490e43bbc074ec50618488c206399b.tar.gz
Moved expansion of simple pattern-specific variables from the rebuild stage
to the read stage.
-rw-r--r--ChangeLog7
-rw-r--r--read.c7
-rw-r--r--tests/ChangeLog5
-rw-r--r--tests/scripts/features/patspecific_vars51
-rw-r--r--variable.c23
5 files changed, 88 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 53fa8df..51d599d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-05 Boris Kolpackov <boris@kolpackov.net>
+
+ * read.c (record_target_var): Expand simple pattern-specific
+ variable.
+ * variable.c (initialize_file_variables): Do not expand simple
+ pattern-specific variable.
+
2004-09-28 Boris Kolpackov <boris@kolpackov.net>
* remake.c (update_file_1): When rebuilding makefiles inherit
diff --git a/read.c b/read.c
index 3704836..291c691 100644
--- a/read.c
+++ b/read.c
@@ -1675,7 +1675,12 @@ record_target_var (struct nameseq *filenames, char *defn,
variable definition. */
v = parse_variable_definition (&p->variable, defn);
assert (v != 0);
- v->value = xstrdup (v->value);
+
+ if (v->flavor == f_simple)
+ v->value = allocated_variable_expand (v->value);
+ else
+ v->value = xstrdup (v->value);
+
fname = p->target;
}
else
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 87c64d5..f1c59d6 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-05 Boris Kolpackov <boris@kolpackov.net>
+
+ * scripts/features/patspecific_vars: Test simple/recursive
+ variable expansion.
+
2004-09-28 Boris Kolpackov <boris@kolpackov.net>
* scripts/features/include: Test dontcare flag inheritance
diff --git a/tests/scripts/features/patspecific_vars b/tests/scripts/features/patspecific_vars
index 74de9bb..31359cf 100644
--- a/tests/scripts/features/patspecific_vars
+++ b/tests/scripts/features/patspecific_vars
@@ -70,4 +70,55 @@ run_make_test('
@test "$(foo)" == "$$foo"
', '', '');
+
+# TEST #6 -- test expansion of pattern-specific simple variables
+#
+run_make_test('
+.PHONY: all
+
+all: inherit := good $$t
+all: bar baz
+
+b%: pattern := good $$t
+
+global := orginal $$t
+
+
+# normal target
+#
+ifdef rec
+bar: a = global: $(global) pattern: $(pattern) inherit: $(inherit)
+else
+bar: a := global: $(global) pattern: $(pattern) inherit: $(inherit)
+endif
+
+bar: ; @echo \'normal: $a;\'
+
+
+# pattern target
+#
+ifdef rec
+%z: a = global: $(global) pattern: $(pattern) inherit: $(inherit)
+else
+%z: a := global: $(global) pattern: $(pattern) inherit: $(inherit)
+endif
+
+%z: ; @echo \'pattrn: $a;\'
+
+
+global := new $$t
+',
+'',
+'normal: global: orginal $t pattern: inherit: ;
+pattrn: global: orginal $t pattern: inherit: ;');
+
+
+# TEST #7 -- test expansion of pattern-specific recursive variables
+#
+run_make_test(undef, # reuse previous makefile
+'rec=1',
+'normal: global: new $t pattern: good $t inherit: good $t;
+pattrn: global: new $t pattern: good $t inherit: good $t;');
+
+
1;
diff --git a/variable.c b/variable.c
index f6cca0d..31b84a4 100644
--- a/variable.c
+++ b/variable.c
@@ -495,10 +495,25 @@ initialize_file_variables (struct file *file, int reading)
do
{
/* We found one, so insert it into the set. */
- struct variable *v = do_variable_definition (
- &p->variable.fileinfo, p->variable.name,
- p->variable.value, p->variable.origin,
- p->variable.flavor, 1);
+
+ struct variable *v;
+
+ if (p->variable.flavor == f_simple)
+ {
+ v = define_variable_loc (
+ p->variable.name, strlen (p->variable.name),
+ p->variable.value, p->variable.origin,
+ 0, &p->variable.fileinfo);
+
+ v->flavor = f_simple;
+ }
+ else
+ {
+ v = do_variable_definition (
+ &p->variable.fileinfo, p->variable.name,
+ p->variable.value, p->variable.origin,
+ p->variable.flavor, 1);
+ }
/* Also mark it as a per-target and copy export status. */
v->per_target = p->variable.per_target;