On Tue, 2021-09-07 at 18:30 -0700, Nick Stoughton wrote: > The problem we were trying to address with this change is that > bsd make (bmake) and GNU make both have a := operator, but they > behave differently. We originally added ::= to match the gmake > behavior. The idea with :::= is to match the bmake behavior.
OK, but that doesn't really answer my question. "We added this version so now we have to add that version too or else it's not fair" doesn't seem like a good reason to invent brand new syntax in the POSIX spec. There must be some reason for the BSD model to be added; there must be some important or useful feature that it enables, that is impossible, or difficult, or at least annoying to achieve in other ways. If this was a feature that already existed (that is, the operator :::= was already implemented and used by makefiles) then there's an argument for adding it to the standard just to make it official: standardizing existing practice has value. But here we're inventing an entirely new operator that NO VERSION of make currently implements (yes, I understand that BSD make has a different operator that works in this same way but that's not the same thing: no existing makefile today contains the :::= operator so every makefile that wants to use it will have to be changed, and in a way which is not backward-compatible with older versions of make). People who are writing BSD makefiles already have this feature: they can just use BSD's := operator. The only makefiles that would use :::= are makefiles that want to be portable, and that need this particular capability. So what I'm asking is, what does this operator enable, beyond what we have with "=" and "::=", that is helpful in writing portable makefiles? In what situations would a makefile need to use :::=? Can someone provide some use cases? > So, extracting from the etherpad of 2021-08-12: > > Options: > > > > > > 1. Add :::= with behavior of BSD := with $$ always preserved > > (.MAKE.SAVE_DOLLARS either doesn't affect :::= or is an extension) > > > > > > 2. Add :::= with behavior of BSD := with $$ never preserved > > (.MAKE.SAVE_DOLLARS is an extension, nominally required to be false > > by default if implemented so existing scripts don't break if > > implementation applies it to additional assignment types other than > > :::=, imo) > > > > > > 3. Add :::= with behavior of BSD := with .MAKE.SAVE_DOLLARS, > > default true > > > > > > 4. Add :::= with behavior of BSD := with .MAKE.SAVE_DOLLARS, > > default false > > > > > > 5. Don't add :::= > > I believe we opted for #4. Based on my reading of the text actually appearing the in current draft, it appears that the option chosen was #1 above, not #4: the text says that "$$" is preserved and there's no mention of .MAKE.SAVE_DOLLARS anywhere. If not I'm even more confused.