[libvirt] [PATCH v5 14/23] src: rewrite remote protocol checker in Python
Ján Tomko
jtomko at redhat.com
Wed Nov 20 13:13:37 UTC 2019
On Mon, Nov 11, 2019 at 02:38:17PM +0000, Daniel P. Berrangé wrote:
>As part of an goal to eliminate Perl from libvirt build tools,
>rewrite the pdwtags processing script in Python.
>
>The original inline shell and perl code was completely
>unintelligible. The new python code is a manual conversion
>that attempts todo basically the same thing.
>
>Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
>---
> Makefile.am | 1 +
> build-aux/syntax-check.mk | 3 +-
> scripts/check-remote-protocol.py | 136 +++++++++++++++++++++++++++++++
> src/Makefile.am | 98 ++++------------------
> 4 files changed, 155 insertions(+), 83 deletions(-)
> create mode 100644 scripts/check-remote-protocol.py
>
>+if n < 1:
>+ print("WARNING: No structs/enums matched. Your", file=sys.stderr)
>+ print("WARNING: pdwtags program is probably too old", file=sys.stderr)
>+ print("WARNING: skipping the remote protocol test", file=sys.stderr)
>+ print("WARNING: install dwarves-1.3 or newer", file=sys.stderr)
>+ sys.exit(8)
>+
>+diff = subprocess.Popen(["diff", "-u", expected, "-"], stdin=subprocess.PIPE)
>+actualstr = "\n".join(actual) + "\n"
>+diff.communicate(input=actualstr.encode("utf-8"))
>+
>+sys.exit(diff.returncode)
>diff --git a/src/Makefile.am b/src/Makefile.am
>index bb63e2486c..c40e61e7ee 100644
>--- a/src/Makefile.am
>+++ b/src/Makefile.am
>@@ -196,83 +196,6 @@ DRIVER_SOURCES += \
>
>
>
>-# Ensure that we don't change the struct or member names or member ordering
>-# in remote_protocol.x The embedded perl below needs a few comments, and
>-# presumes you know what pdwtags output looks like:
>-# * use -0777 -n to slurp the entire file into $_.
>-# * the "split" splits on the /* DD */ comments, so that $p iterates
>-# through the struct definitions.
>-# * process only "struct remote_..." entries
>-# * remove comments and preceding TAB throughout
>-# * remove empty lines throughout
>-# * remove white space at end of buffer
>-
>-# With pdwtags 1.8, --verbose output includes separators like these:
>-# /* 93 */
>-# /* <0> (null):0 */
>-# with the second line omitted for intrinsic types.
>-# Whereas with pdwtags 1.3, they look like this:
>-# /* <2d2> /usr/include/libio.h:180 */
>-# The alternation of the following regexps matches both cases.
>-r1 = /\* \d+ \*/
>-r2 = /\* <[[:xdigit:]]+> \S+:\d+ \*/
>-libs_prefix = remote_|qemu_|lxc_|admin_
>-other_prefix = keepalive|vir(Net|LockSpace|LXCMonitor)
>-struct_prefix = ($(libs_prefix)|$(other_prefix))
>-
>-# Depending on configure options, libtool creates one or both of
>-# remote/{,.libs/}libvirt_driver_remote_la-remote_protocol.o. We want
>-# the newest of the two, in case configure options changed and a stale
>-# file is left around from an earlier build.
So I assume the configure option that gives you the path without .libs
is gone?
>-# The pdwtags output is completely different when building with clang
>-# which causes the comparison against expected output to fail, so skip
>-# if using clang as CC.
>-PDWTAGS = \
>- $(AM_V_GEN)if $(CC) -v 2>&1 | grep -q clang; then \
>- echo 'WARNING: skipping pdwtags test with Clang' >&2; \
>- exit 0; \
>- fi; \
>- if (pdwtags --help) > /dev/null 2>&1; then \
>- o=`ls -t $(<:.lo=.$(OBJEXT)) \
>- $(subst /,/.libs/,$(<:.lo=.$(OBJEXT))) \
>- 2>/dev/null | sed -n 1p`; \
And that OBJEXT is always .o
>- test -f "$$o" || { echo ".o for $< not found" >&2; exit 1; }; \
>- pdwtags --verbose $$o > $(@F)-t1 2> $(@F)-t2; \
>- if test ! -s $(@F)-t1 && test -s $(@F)-t2; then \
>- rm -rf $(@F)-t?; \
>- echo 'WARNING: pdwtags appears broken; skipping the $@ test' >&2;\
>- else \
>- $(PERL) -0777 -n \
>- -e 'foreach my $$p (split m!\n*(?:$(r1)|$(r2))\n!) {' \
>- -e ' if ($$p =~ /^(struct|enum) $(struct_prefix)/) {' \
>- -e ' $$p =~ s!\t*/\*.*?\*/!!sg;' \
>- -e ' $$p =~ s!\s+\n!\n!sg;' \
>- -e ' $$p =~ s!\s+$$!!;' \
>- -e ' $$p =~ s!\t! !g;' \
>- -e ' print "$$p\n";' \
>- -e ' $$n++;' \
>- -e ' }' \
>- -e '}' \
>- -e 'BEGIN {' \
>- -e ' print "/* -*- c -*- */\n";' \
>- -e '}' \
>- -e 'END {' \
>- -e ' if ($$n < 1) {' \
>- -e ' warn "WARNING: your pdwtags program is too old\n";' \
>- -e ' warn "WARNING: skipping the $@ test\n";' \
>- -e ' warn "WARNING: install dwarves-1.3 or newer\n";' \
>- -e ' exit 8;' \
>- -e ' }' \
>- -e '}' \
>- < $(@F)-t1 > $(@F)-t3; \
>- case $$? in 8) rm -f $(@F)-t?; exit 0;; 0) ;; *) exit 1;; esac;\
>- diff -u $(@)s $(@F)-t3; st=$$?; rm -f $(@F)-t?; exit $$st; \
>- fi; \
>- else \
>- echo 'WARNING: you lack pdwtags; skipping the $@ test' >&2; \
>- echo 'WARNING: install the dwarves package to get pdwtags' >&2; \
>- fi
>-
> # .libs/libvirt.so is built by libtool as a side-effect of the Makefile
> # rule for libvirt.la. However, checking symbols relies on Linux ELF layout
> if WITH_LINUX
>@@ -301,27 +224,38 @@ PROTOCOL_STRUCTS = \
> if WITH_REMOTE
> check-protocol: $(PROTOCOL_STRUCTS) $(PROTOCOL_STRUCTS:structs=struct)
>
>+# Ensure that we don't change the struct or member names or member ordering
>+# in remote_protocol.x The process-pdwtags.py post-processes output to
Here you refer to process-pdwtags.py but the script is called check-remote-protocol.py
>+# extract the bits we want.
>+
>+CHECK_REMOTE_PROTOCOL = $(top_srcdir)/scripts/check-remote-protocol.py
>+
With the comment fixed or the script renamed:
Reviewed-by: Ján Tomko <jtomko at redhat.com>
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20191120/ab07dfbe/attachment-0001.sig>
More information about the libvir-list
mailing list