From 73e7767ffc14fad98dd2e78791a1237bcb3d6fe3 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 21 Sep 2004 20:23:12 +0000 Subject: Fixed bug in implicit rule prerequisite evaluation code. Added test. --- ChangeLog | 8 ++++ file.c | 3 +- implicit.c | 4 +- tests/ChangeLog | 8 ++++ tests/run_make_tests.pl | 2 +- tests/scripts/features/implicit_prereq_eval | 64 +++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 tests/scripts/features/implicit_prereq_eval diff --git a/ChangeLog b/ChangeLog index 4ae898b..bbedcd5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-09-21 Boris Kolpackov + + * 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 * 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 + + * 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 * 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 <