Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > Per the log of changes to the Makfile and Junio's recent comment about > [1] why that pattern got introduced it was for a different reason > entirely, i.e. ("[]" edits are mine, for brevity): > > [T]hat age old convention [...] is spelled [as]: > > thing: > rm -f thing thing+ > prepare contents for thing >thing+ Did I say that? I recall I specifically avoided the "redirection" because this is *NOT* shell-script only principle. If a command is so broken that "cmd -o thing" that fails to work correctly leaves a broken output in thing, then the pattern should be applied and made to "cmd -o thing+ && mv thing+ thing". On the other hand, if "cmd" refrains from leaving a half-baked result in "-o thing" (and I believe $(CC) is well-behaved even on AIX), I do not think it is a good idea to use that pattern. One version of AIX may refuse to overwrite a file in use because creat("thing") that is necessary for "-o thing" may fail while "thing" is in use), but another system may refuse to rename over a file in use (i.e. "-o thing+" into a brand new "thing+" may be OK but the final "mv thing+ thing" may fail). So pretending that it is a cure for broken use case is cluttering Makefile for no real benefit and leading readers into confused thinking. > mv thing+ thing > > It protects us from a failure mode where "prepare contents for > thing" step is broken and leaves a "thing" that does not work, but > confuses make that make does not need to rebuild it, if you wrote it > as such: > > thing: > prepare contents for thing >thing > > [It might leave behind a corrupt 'thing'.] In any case, it is not > "we are trying to make thing available while it is being > rewritten" at all. > > That makes perfect sense for shellscripts, but as this change shows > there's other good reasons to use this age old convention that weren't > considered at the time. So, no, the age old convention may have considered and does not apply to such a use case. > git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS) > - $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \ > - $(filter %.o,$^) $(LIBS) > + $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@+ $(ALL_LDFLAGS) \ > + $(filter %.o,$^) $(LIBS) && \ > + mv $@+ $@ Really, does anybody else use "$(CC) -o $@" in such a way in their Makefile? Having to do this smells simply crazy (I am not saying you are crazy---the platform that forces you to write such a thing is crazy). So, while I do not think the end result would break the build (other than it probably would leave crufts "make clean" would not notice behind when interrupted in the middle), I am moderately negative on this change. Thanks.