Makefile: detect errors in running spatch

The "make coccicheck" target runs spatch against each source file. But it does so in a for loop, so "make" never sees the exit code of spatch. Worse, it redirects stderr to a log file, so the user has no indication of any failure. And then to top it all off, because we touched the patch file's mtime, make will refuse to repeat the command because it think the target is up-to-date. So for example: $ make coccicheck SPATCH=does-not-exist SPATCH contrib/coccinelle/free.cocci SPATCH contrib/coccinelle/qsort.cocci SPATCH contrib/coccinelle/xstrdup_or_null.cocci SPATCH contrib/coccinelle/swap.cocci SPATCH contrib/coccinelle/strbuf.cocci SPATCH contrib/coccinelle/object_id.cocci SPATCH contrib/coccinelle/array.cocci $ make coccicheck SPATCH=does-not-exist make: Nothing to be done for 'coccicheck'. With this patch, you get: $ make coccicheck SPATCH=does-not-exist SPATCH contrib/coccinelle/free.cocci /bin/sh: 4: does-not-exist: not found Makefile:2338: recipe for target 'contrib/coccinelle/free.cocci.patch' failed make: *** [contrib/coccinelle/free.cocci.patch] Error 1 It also dumps the log on failure, so any errors from spatch itself (like syntax errors in our .cocci files) will be seen by the user. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Mar 10, 2017 at 03:31 UTC f5c2bc2b9699d9333e7e73c68db4ee266c24f9cf
1 file changed +10 -2
Makefile
+10 -2
@@ -2329,9 +2329,17 @@ check: common-cmds.h
2329 C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
2330 %.cocci.patch: %.cocci $(C_SOURCES)
2331 @echo ' ' SPATCH $<; \
2332 + ret=0; \
2333 for f in $(C_SOURCES); do \
2333 - $(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS); \
2334 - done >$@ 2>$@.log; \
2334 + $(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS) || \
2335 + { ret=$$?; break; }; \
2336 + done >$@+ 2>$@.log; \
2337 + if test $$ret != 0; \
2338 + then \
2339 + cat $@.log; \
2340 + exit 1; \
2341 + fi; \
2342 + mv $@+ $@; \
2343 if test -s $@; \
2344 then \
2345 echo ' ' SPATCH result: $@; \