]> git.ipfire.org Git - thirdparty/make.git/commitdiff
[SV 40657] Don't create pattern rules for suffix rules with deps.
authorPaul Smith <psmith@gnu.org>
Sun, 9 Sep 2018 19:30:07 +0000 (15:30 -0400)
committerPaul Smith <psmith@gnu.org>
Sat, 15 Sep 2018 19:08:29 +0000 (15:08 -0400)
* 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.

NEWS
src/rule.c
tests/scripts/features/suffixrules [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 5395fc889c3e6d74f71d3ad6e8b313358f904095..eb25119c7cd3e536c9457ba8b1e48ebe7b414dc0 100644 (file)
--- 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 <sven.c.dack@sky.com>
 
+* 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.
 
index 4bd3ff0972f04ef5fc5f121c5b0989a7adbb2aa1..0c0204e94a48f2d047d9f88becc121a87167422d 100644 (file)
@@ -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 (file)
index 0000000..a18c363
--- /dev/null
@@ -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;