From: Paul Smith Date: Sun, 9 Sep 2018 19:30:07 +0000 (-0400) Subject: [SV 40657] Don't create pattern rules for suffix rules with deps. X-Git-Tag: 4.2.90~31 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=67e6d81256486cbf160208c5b7ea164964c49dd4;p=thirdparty%2Fmake.git [SV 40657] Don't create pattern rules for suffix rules with deps. * NEWS: Update with a backward-compatibility warning. * src/rule.c (convert_to_pattern): If a suffix rule has dependencies, do not create a pattern rule for it. According to the manual suffix rules with prerequisites are treated as normal targets. * tests/scrips/features/suffixrules: Create some regression tests for .SUFFIXES and suffix rules. --- diff --git a/NEWS b/NEWS index 5395fc88..eb25119c 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,11 @@ http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=108&set N-processor systems without fear of overload. Patch provided by Sven C. Dack +* WARNING: Backward-incompatibility! + Contrary to the documentation, suffix rules with prerequisites were being + treated BOTH as simple targets AND as pattern rules. Behavior now matches + the documentation, and pattern rules are no longer created in this case. + * Makefiles can now specify the '-j' option in their MAKEFLAGS variable and this will cause make to enable that parallelism mode. diff --git a/src/rule.c b/src/rule.c index 4bd3ff09..0c0204e9 100644 --- a/src/rule.c +++ b/src/rule.c @@ -252,7 +252,10 @@ convert_to_pattern (void) memcpy (rulename + slen, dep_name (d2), s2len + 1); f = lookup_file (rulename); - if (f == 0 || f->cmds == 0) + + /* No target, or no commands, or it has deps: it can't be a + suffix rule. */ + if (f == 0 || f->cmds == 0 || f->deps != 0) continue; if (s2len == 2 && rulename[slen] == '.' && rulename[slen + 1] == 'a') diff --git a/tests/scripts/features/suffixrules b/tests/scripts/features/suffixrules new file mode 100644 index 00000000..a18c3637 --- /dev/null +++ b/tests/scripts/features/suffixrules @@ -0,0 +1,78 @@ +# -*-perl-*- + +$description = "Test suffix rules."; + +$details = ""; + +# TEST #0: Clear all suffixes + +touch('foo.c'); + +run_make_test(q! +.SUFFIXES: +all: foo.o ; @echo $@ $< +!, + '', "#MAKE#: *** No rule to make target 'foo.o', needed by 'all'. Stop.\n", 512); + +unlink('foo.c'); + +# Test #1: Add a simple suffix rule + +touch('foo.baz'); + +run_make_test(q! +.SUFFIXES: .biz .baz + +.baz.biz: ; @echo make $@ +!, + 'foo.biz', "make foo.biz\n"); + +unlink('foo.baz'); + +# Test #2: Make sure the defaults still work + +touch('foo.c'); + +run_make_test(undef, 'foo.o COMPILE.c=@echo OUTPUT_OPTION=', "foo.c\n"); + +unlink('foo.c'); + +# Test #3: Replacing all suffixes + +touch('foo.baz'); + +run_make_test(q! +.SUFFIXES: +.SUFFIXES: .biz .baz + +.baz.biz: ; @echo make $@ +!, + 'foo.biz', "make foo.biz\n"); + +unlink('foo.baz'); + +# Test #4: Suffix rules with deps are not suffix rules + +touch('foo.bar'); + +run_make_test(q! +.SUFFIXES: +.SUFFIXES: .biz .baz + +.baz.biz: foo.bar ; @echo make $@ from $< +!, + '.baz.biz', "make .baz.biz from foo.bar\n"); + +unlink('foo.bar'); + +# Test #5: Should not create pattern rules for it either + +touch('foo.baz'); + +run_make_test(undef, + 'foo.biz', "#MAKE#: *** No rule to make target 'foo.biz'. Stop.\n", 512); + +unlink('foo.baz'); + +# Complete +1;