On Fri, 2020-01-10 at 15:07 -0500, Paul Smith wrote: > Oh. It's this change: > > * 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. > > Hm. That might be too incompatible a change. I'll need to consider > this.
Hm hm. So it turns out to be even more bogus. I re-read the bug and it turns out that the prerequisites here were ignored before. So, these rules did not do at all what the author (presumably) intended. If you built targets with a suffix rule with a prerequisite, then you touched one of the prerequisites, then you re-ran make (I'm talking about 4.2.1 or below not with the new changes), it would not rebuild anything. To me this makes preserving the old behavior quite problematic: make is allowing you to write illegal makefiles with no warning or error, which is very bad IMO. I think that either make should accept prerequisites and implement them as the user expects, which violates POSIX and so should only be enabled if .POSIX is not set (and which never happened before and so would be extra work), or else we should keep the new behavior and follow POSIX and existing makefiles will fail as we've discovered. To me the former is useless. The only reason to use suffix rules is to be portable with other versions of make: if you're using GNU make then pattern rules are infinitely more flexible and usable. And if there's no other reason to use suffix rules except to be portable then we shouldn't be implementing non-portable capabilities for it. If we do the latter, Martin had suggested some kind of warning or diagnostic be shown if a makefile contained an incorrectly-constructed suffix rule. At the time I didn't think this would be a widespread problem so I didn't agree, but perhaps I was wrong. It's a bit annoying that a warning would be generated for perfectly legitimate makefile (albeit confusing and _likely_ wrong). I mean, it's not _illegal_ to have: .POSIX: .SUFFIXES: .f .b .f.b : prereq it just means that ".f.b" is not a suffix rule, it's a real rule to build the literal target ".f.b".