From 0298aee67fd74c9bfb1aee74d9739997182d8ecc Mon Sep 17 00:00:00 2001 From: psmith Date: Mon, 28 Feb 2005 09:41:25 +0000 Subject: [PATCH] - Fix bug #7144 (infinite loop sometimes with -q and double-colon rules) - Resolve support request #103195 (rationalize wordlist fn arguments) --- ChangeLog | 15 +++++ function.c | 4 ++ remake.c | 5 +- tests/ChangeLog | 2 + tests/scripts/options/dash-B | 28 ++++------ tests/scripts/options/dash-q | 127 +++++++++++++++++++------------------------ 6 files changed, 93 insertions(+), 88 deletions(-) rewrite tests/scripts/options/dash-q (70%) diff --git a/ChangeLog b/ChangeLog index 4696420..b9f4ad7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2005-02-28 Paul D. Smith + + * doc/make.texi (Text Functions): Update docs to allow the end + ordinal for $(wordlist ...) to be 0. + * function.c (func_wordlist): Fail if the start ordinal for + $(wordlist ...) is <1. Matches documentation. + Resolves Savannah support request #103195. + + * remake.c (update_goal_chain): Fix logic for stopping in -q: + previously we were stopping when !-q, exactly the opposite. This + has been wrong since version 1.34, in 1994! + (update_file): If we got an error don't break out to run more + double-colon rules: just return immediately. + Fixes Savannah bug #7144. + 2005-02-27 Paul D. Smith * misc.c (end_of_token): Make argument const. diff --git a/function.c b/function.c index 66d23fd..c2bd16f 100644 --- a/function.c +++ b/function.c @@ -771,6 +771,10 @@ func_wordlist (char *o, char **argv, const char *funcname UNUSED) _("non-numeric second argument to `wordlist' function")); start = atoi (argv[0]); + if (start < 1) + fatal (reading_file, "invalid first argument to `wordlist' function: '%d'", + message, start); + count = atoi (argv[1]) - start + 1; if (count > 0) diff --git a/remake.c b/remake.c index e1def64..eb34c92 100644 --- a/remake.c +++ b/remake.c @@ -176,7 +176,7 @@ update_goal_chain (struct dep *goals) /* If -q just triggered, stop immediately. It doesn't matter how much more we run, since we already know the answer to return. */ - stop = (!keep_going_flag && !question_flag + stop = (question_flag && !keep_going_flag && !rebuilding_makefiles); } else @@ -307,8 +307,9 @@ update_file (struct file *file, unsigned int depth) status |= update_file_1 (f, depth); check_renamed (f); + /* If we got an error, don't bother with double_colon etc. */ if (status != 0 && !keep_going_flag) - break; + return status; if (f->command_state == cs_running || f->command_state == cs_deps_running) diff --git a/tests/ChangeLog b/tests/ChangeLog index 41c9b34..1979324 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,5 +1,7 @@ 2005-02-28 Paul D. Smith + * scripts/options/dash-q: Add a test for Savannah bug # 7144. + * scripts/options/symlinks: New file to test checking of symlink timestamps. Can't use filename dash-L because it conflicts with dash-l on case-insensitive filesystems. diff --git a/tests/scripts/options/dash-B b/tests/scripts/options/dash-B index 32992b3..4ac377f 100644 --- a/tests/scripts/options/dash-B +++ b/tests/scripts/options/dash-B @@ -8,9 +8,9 @@ Invoke make once, so it builds everything. Invoke it again and verify that nothing is built. Then invoke it with -B and verify that everything is built again."; -open(MAKEFILE,"> $makefile"); +&touch('bar.x'); -print MAKEFILE <<'EOF'; +run_make_test(' .SUFFIXES: .PHONY: all @@ -19,25 +19,21 @@ all: foo foo: bar.x @echo cp $< $@ @echo "" > $@ -EOF - -close(MAKEFILE); +', + '', 'cp bar.x foo'); +run_make_test(undef, '', "#MAKE#: Nothing to be done for `all'."); +run_make_test(undef, '-B', 'cp bar.x foo'); -&touch('bar.x'); +# Put the timestamp for foo into the future; it should still be remade. -&run_make_with_options($makefile, '', &get_logfile); -$answer = "cp bar.x foo\n"; -&compare_output($answer, &get_logfile(1)); +utouch(1000, 'foo'); +run_make_test(undef, '', "#MAKE#: Nothing to be done for `all'."); +run_make_test(undef, '-B', 'cp bar.x foo'); -&run_make_with_options($makefile, '', &get_logfile); -$answer = "$make_name: Nothing to be done for `all'.\n"; -&compare_output($answer, &get_logfile(1)); -&run_make_with_options($makefile, '-B', &get_logfile); -$answer = "cp bar.x foo\n"; -&compare_output($answer, &get_logfile(1)); +# Clean up -unlink('bar.x', 'foo') unless $keep; +rmfiles('bar.x', 'foo'); 1; diff --git a/tests/scripts/options/dash-q b/tests/scripts/options/dash-q dissimilarity index 70% index 923e4c4..56f04a1 100644 --- a/tests/scripts/options/dash-q +++ b/tests/scripts/options/dash-q @@ -1,70 +1,57 @@ -# -*-perl-*- -$description = "Test the -q option.\n"; - -$details = "Try various uses of -q and ensure they all give the correct results.\n"; - -open(MAKEFILE, "> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE <<'EOMAKE'; -one: -two: ; -three: ; : -four: ; $(.XY) -five: ; \ - $(.XY) -six: ; \ - $(.XY) - $(.XY) -seven: ; \ - $(.XY) - : foo - $(.XY) -EOMAKE - -close(MAKEFILE); - -# TEST 0 - -&run_make_with_options($makefile, "-q one", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 1 - -&run_make_with_options($makefile, "-q two", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 2 - -&run_make_with_options($makefile, "-q three", &get_logfile, 256); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 3 - -&run_make_with_options($makefile, "-q four", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 4 - -&run_make_with_options($makefile, "-q five", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 5 - -&run_make_with_options($makefile, "-q six", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 6 - -&run_make_with_options($makefile, "-q seven", &get_logfile, 256); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -1; +# -*-perl-*- +$description = "Test the -q option.\n"; + +$details = "Try various uses of -q and ensure they all give the correct results.\n"; + +# TEST 0 + +run_make_test(' +one: +two: ; +three: ; : +four: ; $(.XY) +five: ; \ + $(.XY) +six: ; \ + $(.XY) + $(.XY) +seven: ; \ + $(.XY) + : foo + $(.XY) +', + '-q one', ''); + +# TEST 1 + +run_make_test(undef, '-q two', ''); + +# TEST 2 + +run_make_test(undef, '-q three', '', 256); + +# TEST 3 + +run_make_test(undef, '-q four', ''); + +# TEST 4 + +run_make_test(undef, '-q five', ''); + +# TEST 5 + +run_make_test(undef, '-q six', ''); + +# TEST 6 + +run_make_test(undef, '-q seven', '', 256); + +# TEST 7 : Savannah bug # 7144 + +run_make_test(' +one:: ; @echo one +one:: ; @echo two +', + '-q', '', 256); + +1; -- 2.11.4.GIT