From: "René Scharfe" <l.s.r@web.de>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] Makefile: detect errors in running spatch
Date: Fri, 10 Mar 2017 18:03:47 +0100 [thread overview]
Message-ID: <1fd87646-76fb-e67c-e61a-c0ccca20cf0a@web.de> (raw)
In-Reply-To: <20170310083117.cbflqx7zbe4s7cqv@sigill.intra.peff.net>
Am 10.03.2017 um 09:31 schrieb Jeff King:
> 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
That's nice. The current version is just a contraption that does the
bare minimum of work.
> 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>
> ---
> This shell code is getting a bit unwieldy to stick inside the Makefile,
> with all the line continuation and $-escaping. It might be worth moving
> it into a helper script.
There is one for the kernel
(https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/scripts/coccicheck).
It's quite big, though.
> It also doesn't help that shells are awkward at passing status out of a
> for-loop. I think the most "make-ish" way of doing this would actually
> be to lose the for loop and have a per-cocci-per-source target.
>
> I don't know if that would make the patches harder to apply. The results
> aren't full patches, so I assume you usually do some kind of munging on
> them?
They work with patch -p0.
We can get rid of the loop by using the spatch options --use-gitgrep and
--dir. I can't find the former one in the docs, though, so I'm not sure
if it only works with certain versions or what exactly it is even doing.
It seems to have the side effect of producing git-style patches
(applicable with patch -p1) at least.
> I resorted to:
>
> make coccicheck SPATCH='spatch --in-place'
Using SPATCH_FLAGS for adding an option in such case would be a bit simpler.
> Makefile | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 9ec6065cc..d97633892 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2336,9 +2336,17 @@ check: common-cmds.h
> C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
> %.cocci.patch: %.cocci $(C_SOURCES)
> @echo ' ' SPATCH $<; \
> + ret=0; \
> for f in $(C_SOURCES); do \
> - $(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS); \
> - done >$@ 2>$@.log; \
> + $(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS) || \
> + { ret=$$?; break; }; \
> + done >$@+ 2>$@.log; \
> + if test $$ret != 0; \
> + then \
> + cat $@.log; \
> + exit 1; \
> + fi; \
> + mv $@+ $@; \
> if test -s $@; \
> then \
> echo ' ' SPATCH result: $@; \
>
next prev parent reply other threads:[~2017-03-10 17:04 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-10 8:31 [PATCH] Makefile: detect errors in running spatch Jeff King
2017-03-10 17:03 ` René Scharfe [this message]
2017-03-10 18:12 ` Jeff King
2017-03-10 20:16 ` Junio C Hamano
-- strict thread matches above, loose matches on Subject: below --
2017-03-28 19:42 [PATCH 0/18] snprintf cleanups Jeff King
2017-03-29 7:10 ` [PATCH] Makefile: detect errors in running spatch Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1fd87646-76fb-e67c-e61a-c0ccca20cf0a@web.de \
--to=l.s.r@web.de \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).