summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2013-07-09 19:14:40 -0400
committerPaul Smith <psmith@gnu.org>2013-07-09 19:14:40 -0400
commit5601726151b3856ad26433d632392904ec059368 (patch)
tree04b9fed5f0a9ccb21cf139e3cd390ce49729e7a7
parent9453a7451d66ee1ea5762a75161bf8a818c01a1f (diff)
downloadgunmake-5601726151b3856ad26433d632392904ec059368.tar.gz
Keep a local count of the max dependency list size.
This global variable could be modified during recursion so keep our own local copy to compare against.
-rw-r--r--ChangeLog6
-rw-r--r--implicit.c14
-rw-r--r--tests/ChangeLog5
-rw-r--r--tests/scripts/features/se_implicit22
4 files changed, 41 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index b24186a..11442c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-07-09 Paul Smith <psmith@gnu.org>
+
+ * implicit.c (pattern_search): Keep a local copy of the number of
+ deps in deplist: the global max might change due to recursion.
+ Fixes a bug reported by Martin d'Anjou <martin.danjou14@gmail.com>.
+
2013-06-28 Paul Smith <psmith@gnu.org>
* misc.c (set_append_mode): Set the O_APPEND flag on a file descriptor.
diff --git a/implicit.c b/implicit.c
index 97233a6..6d2e09b 100644
--- a/implicit.c
+++ b/implicit.c
@@ -217,8 +217,8 @@ pattern_search (struct file *file, int archive,
struct file *int_file = 0;
/* List of dependencies found recursively. */
- struct patdeps *deplist
- = xmalloc (max_pattern_deps * sizeof (struct patdeps));
+ unsigned int max_deps = max_pattern_deps;
+ struct patdeps *deplist = xmalloc (max_deps * sizeof (struct patdeps));
struct patdeps *pat = deplist;
/* Names of possible dependencies are constructed in this buffer. */
@@ -651,13 +651,15 @@ pattern_search (struct file *file, int archive,
/* If there are more than max_pattern_deps prerequisites (due to
2nd expansion), reset it and realloc the arrays. */
- if (deps_found > max_pattern_deps)
+ if (deps_found > max_deps)
{
unsigned int l = pat - deplist;
+ /* This might have changed due to recursion. */
+ max_pattern_deps = MAX(max_pattern_deps, deps_found);
+ max_deps = max_pattern_deps;
deplist = xrealloc (deplist,
- deps_found * sizeof (struct patdeps));
+ max_deps * sizeof (struct patdeps));
pat = deplist + l;
- max_pattern_deps = deps_found;
}
/* Go through the nameseq and handle each as a prereq name. */
@@ -757,8 +759,8 @@ pattern_search (struct file *file, int archive,
pat->pattern = int_file->name;
int_file->name = d->name;
pat->file = int_file;
- (pat++)->name = d->name;
int_file = 0;
+ (pat++)->name = d->name;
continue;
}
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 7bdc5a1..978349a 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-09 Paul Smith <psmith@gnu.org>
+
+ * scripts/features/se_implicit: Add a test for SE rules depending
+ on other SE rules to be built.
+
2013-05-26 Paul Smith <psmith@gnu.org>
* scripts/features/archives: Test for Savannah bug #38442.
diff --git a/tests/scripts/features/se_implicit b/tests/scripts/features/se_implicit
index e9acb2f..0a31948 100644
--- a/tests/scripts/features/se_implicit
+++ b/tests/scripts/features/se_implicit
@@ -222,5 +222,27 @@ foo.o:
!,
'', "\n");
+# Test #10: Test second expansion with second expansion prerequisites
+# Ensures pattern_search() recurses with SE prereqs.
+touch('a');
+run_make_test(q!
+.SECONDEXPANSION:
+sim_base_rgg := just_a_name
+sim_base_src := a
+sim_base_f := a a a
+sim_%.f: $${sim_$$*_f}
+ echo $@
+sim_%.src: $${sim_$$*_src}
+ echo $@
+sim_%: \
+ $$(if $$(sim_$$*_src),sim_%.src) \
+ $$(if $$(sim_$$*_f),sim_%.f) \
+ $$(if $$(sim_$$*_rgg),$$(sim_$$*_rgg).s)
+ echo $@
+!,
+ '-s sim_base', "#MAKE#: *** No rule to make target 'sim_base'. Stop.", 512);
+
+unlink('a');
+
# This tells the test driver that the perl test script executed properly.
1;