summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@kolpackov.net>2004-09-21 20:23:12 +0000
committerBoris Kolpackov <boris@kolpackov.net>2004-09-21 20:23:12 +0000
commit73e7767ffc14fad98dd2e78791a1237bcb3d6fe3 (patch)
tree4772e03f4350bbebfde62605316e340153d4813a
parent6e51d9c90a92933e6cf84ae494076b6b1cd17c3b (diff)
downloadgunmake-73e7767ffc14fad98dd2e78791a1237bcb3d6fe3.tar.gz
Fixed bug in implicit rule prerequisite evaluation code. Added test.
-rw-r--r--ChangeLog8
-rw-r--r--file.c3
-rw-r--r--implicit.c4
-rw-r--r--tests/ChangeLog8
-rwxr-xr-xtests/run_make_tests.pl2
-rw-r--r--tests/scripts/features/implicit_prereq_eval64
6 files changed, 86 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 4ae898b..bbedcd5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-09-21 Boris Kolpackov <boris@kolpackov.net>
+
+ * file.c (snap_deps): Mark .PHONY prerequisites as targets.
+
+ * implicit.c (pattern_search): When considering an implicit rule's
+ prerequisite check that it is actually a target rather then
+ just an entry in the file hashtable.
+
2004-09-21 Paul D. Smith <psmith@gnu.org>
* read.c (readstring): Fix some logic errors in backslash handling.
diff --git a/file.c b/file.c
index 8f89503..ae99745 100644
--- a/file.c
+++ b/file.c
@@ -455,8 +455,9 @@ snap_deps (void)
for (d = f->deps; d != 0; d = d->next)
for (f2 = d->file; f2 != 0; f2 = f2->prev)
{
- /* Mark this file as phony and nonexistent. */
+ /* Mark this file as phony nonexistent target. */
f2->phony = 1;
+ f2->is_target = 1;
f2->last_mtime = NONEXISTENT_MTIME;
f2->mtime_before_update = NONEXISTENT_MTIME;
}
diff --git a/implicit.c b/implicit.c
index 165afdb..10b41ff 100644
--- a/implicit.c
+++ b/implicit.c
@@ -342,6 +342,8 @@ pattern_search (struct file *file, int archive,
deps_found = 0;
for (dep = rule->deps; dep != 0; dep = dep->next)
{
+ struct file *f;
+
/* If the dependency name has a %, substitute the stem. */
p = strchr (dep_name (dep), '%');
if (p != 0)
@@ -396,7 +398,7 @@ pattern_search (struct file *file, int archive,
directory (the one gotten by prepending FILENAME's directory),
so it might actually exist. */
- if (lookup_file (p) != 0
+ if (((f = lookup_file (p)) != 0 && f->is_target)
|| ((!dep->changed || check_lastslash) && file_exists_p (p)))
{
found_files_im[deps_found] = dep->ignore_mtime;
diff --git a/tests/ChangeLog b/tests/ChangeLog
index ba6b59e..0a7ed0c 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,11 @@
+2004-09-21 Boris Kolpackov <boris@kolpackov.net>
+
+ * run_make_tests.pl: Change `#!/usr/local/bin/perl' to be
+ `#!/usr/bin/env perl'.
+
+ * scripts/features/implicit_prereq_eval: Test implicit rule
+ prerequisite evaluation code.
+
2004-09-21 Paul D. Smith <psmith@gnu.org>
* run_make_tests.pl (run_make_test): Enhance to allow the make
diff --git a/tests/run_make_tests.pl b/tests/run_make_tests.pl
index 5d49014..a4c4330 100755
--- a/tests/run_make_tests.pl
+++ b/tests/run_make_tests.pl
@@ -1,4 +1,4 @@
-#!/usr/local/bin/perl
+#!/usr/bin/env perl
# -*-perl-*-
# Test driver for the Make test suite
diff --git a/tests/scripts/features/implicit_prereq_eval b/tests/scripts/features/implicit_prereq_eval
new file mode 100644
index 0000000..f549a79
--- /dev/null
+++ b/tests/scripts/features/implicit_prereq_eval
@@ -0,0 +1,64 @@
+$description = "Test implicit rule prerequisite evaluation code.";
+
+$details = "The makefile created by this test has a set of implicit rule
+ pairs with the first rule usually not applying because its prerequisites
+ cannot be made and the second rule which should succeed.";
+
+open(MAKEFILE,"> $makefile");
+
+# The contents of the Makefile ...
+
+print MAKEFILE <<EOF;
+
+.PHONY: all
+
+all: case.1 case.2 case.3
+
+a: void
+
+# 1 - existing file
+#
+%.1: void
+ \@false
+
+%.1: $makefile
+ \@true
+
+
+# 2 - phony
+#
+%.2: void
+ \@false
+
+%.2: 2.phony
+ \@true
+
+.PHONY: 2.phony
+
+
+# 3 - implicit-phony
+#
+%.3: void
+ \@false
+
+%.3: 3.implicit-phony
+ \@true
+
+3.implicit-phony:
+
+EOF
+
+close(MAKEFILE);
+
+&run_make_with_options($makefile,
+ "",
+ &get_logfile,
+ 0);
+
+
+# This makefile doesn't produce anything except exit code.
+#
+&compare_output("",&get_logfile(1));
+
+# This tells the test driver that the perl test script executed properly.
+1;