From a62486b95feed2cf17ce4adbe794a1ecff9ef22a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Wed, 14 Dec 2022 06:58:51 -0500 Subject: [PATCH] build: switch over to new rpc generator code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This replaces use of 'rpcgen' with our new python impl of the RPC code generator. Since the new impl generates code that matches our style/coding rules, and does not contain long standing bugs, we no longer need to post-process the output. Reviewed-by: Michal Privoznik Signed-off-by: Daniel P. Berrangé --- libvirt.spec.in | 1 - meson.build | 11 --- scripts/rpcgen/meson.build | 5 ++ scripts/rpcgen/rpcgen/meson.build | 7 ++ src/admin/meson.build | 8 ++- src/locking/meson.build | 8 ++- src/logging/meson.build | 8 ++- src/lxc/meson.build | 12 +++- src/remote/meson.build | 8 ++- src/rpc/genprotocol.pl | 114 ------------------------------ src/rpc/meson.build | 9 ++- 11 files changed, 52 insertions(+), 139 deletions(-) create mode 100644 scripts/rpcgen/rpcgen/meson.build delete mode 100755 src/rpc/genprotocol.pl diff --git a/libvirt.spec.in b/libvirt.spec.in index 8d0a0aad60..bcf4e128a5 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -394,7 +394,6 @@ BuildRequires: wireshark-devel %if %{with_libssh} BuildRequires: libssh-devel >= 0.8.1 %endif -BuildRequires: rpcgen BuildRequires: libtirpc-devel # Needed for the firewalld_reload macro %if %{with_firewalld_zone} diff --git a/meson.build b/meson.build index 85ddad52c1..755e9187e2 100644 --- a/meson.build +++ b/meson.build @@ -783,10 +783,6 @@ required_programs = [ 'xsltproc', ] -required_programs_groups = [ - { 'name': 'rpcgen', 'prog': [ 'rpcgen', 'portable-rpcgen' ] }, -] - if host_machine.system() == 'freebsd' required_programs += 'ifconfig' endif @@ -798,13 +794,6 @@ foreach name : required_programs set_variable('@0@_prog'.format(varname), prog) endforeach -foreach item : required_programs_groups - prog = find_program(item.get('prog'), dirs: libvirt_sbin_path) - varname = item.get('name').underscorify() - conf.set_quoted(varname.to_upper(), prog.full_path()) - set_variable('@0@_prog'.format(varname), prog) -endforeach - # optional programs optional_programs = [ diff --git a/scripts/rpcgen/meson.build b/scripts/rpcgen/meson.build index 52526bf812..65236457be 100644 --- a/scripts/rpcgen/meson.build +++ b/scripts/rpcgen/meson.build @@ -1,3 +1,5 @@ +subdir('rpcgen') + if pytest_prog.found() subdir('tests') @@ -9,3 +11,6 @@ if pytest_prog.found() workdir: meson.current_source_dir(), ) endif + +rpcgen_prog = find_program('main.py') +rpcgen_src += files(['main.py']) diff --git a/scripts/rpcgen/rpcgen/meson.build b/scripts/rpcgen/rpcgen/meson.build new file mode 100644 index 0000000000..5a0f59eecf --- /dev/null +++ b/scripts/rpcgen/rpcgen/meson.build @@ -0,0 +1,7 @@ +rpcgen_src = files([ + 'ast.py', + 'lexer.py', + 'generator.py', + 'parser.py', + 'visitor.py', +]) diff --git a/src/admin/meson.build b/src/admin/meson.build index e04d610f92..ca2a475a6f 100644 --- a/src/admin/meson.build +++ b/src/admin/meson.build @@ -13,8 +13,10 @@ admin_protocol_h = custom_target( 'admin_protocol.h', input: admin_driver_protocol, output: 'admin_protocol.h', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=header', '@INPUT@', '@OUTPUT@', ], ) admin_driver_generated += admin_protocol_h @@ -23,8 +25,10 @@ admin_driver_generated += custom_target( 'admin_protocol.c', input: admin_driver_protocol, output: 'admin_protocol.c', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=source', '--header=admin_protocol.h', '@INPUT@', '@OUTPUT@', ], ) diff --git a/src/locking/meson.build b/src/locking/meson.build index ff1578cfcb..c661389178 100644 --- a/src/locking/meson.build +++ b/src/locking/meson.build @@ -18,8 +18,10 @@ lock_protocol_generated += custom_target( 'lock_protocol.h', input: lock_protocol, output: 'lock_protocol.h', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=header', '@INPUT@', '@OUTPUT@', ], ) @@ -27,8 +29,10 @@ lock_protocol_generated += custom_target( 'lock_protocol.c', input: lock_protocol, output: 'lock_protocol.c', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=source', '--header=lock_protocol.h', '@INPUT@', '@OUTPUT@', ], ) diff --git a/src/logging/meson.build b/src/logging/meson.build index 4d98113ac7..0e0cc7ab76 100644 --- a/src/logging/meson.build +++ b/src/logging/meson.build @@ -10,8 +10,10 @@ log_protocol_header_generated = custom_target( 'log_protocol.h', input: log_protocol, output: 'log_protocol.h', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@' + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=header', '@INPUT@', '@OUTPUT@', ], ) log_protocol_generated += log_protocol_header_generated @@ -20,8 +22,10 @@ log_protocol_generated += custom_target( 'log_protocol.c', input: log_protocol, output: 'log_protocol.c', + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@' + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=source', '--header=log_protocol.h', '@INPUT@', '@OUTPUT@', ], ) diff --git a/src/lxc/meson.build b/src/lxc/meson.build index d8644190f0..edb88a71cb 100644 --- a/src/lxc/meson.build +++ b/src/lxc/meson.build @@ -21,14 +21,22 @@ lxc_monitor_protocol_generated += custom_target( 'lxc_monitor_protocol_h', input: lxc_monitor_protocol, output: 'lxc_monitor_protocol.h', - command: [ genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@' ] + depend_files: rpcgen_src, + command: [ + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=header', '@INPUT@', '@OUTPUT@', + ] ) lxc_monitor_protocol_generated += custom_target( 'lxc_monitor_protocol_c', input: lxc_monitor_protocol, output: 'lxc_monitor_protocol.c', - command: [ genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@' ] + depend_files: rpcgen_src, + command: [ + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=source', '--header=lxc_monitor_protocol.h', '@INPUT@', '@OUTPUT@', + ], ) lxc_monitor_generated = custom_target( diff --git a/src/remote/meson.build b/src/remote/meson.build index 498f7ff1b8..16b903fcaf 100644 --- a/src/remote/meson.build +++ b/src/remote/meson.build @@ -25,8 +25,10 @@ foreach name : [ 'remote', 'qemu', 'lxc' ] protocol_h, input: protocol_x, output: protocol_h, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=header', '@INPUT@', '@OUTPUT@', ], ) @@ -34,8 +36,10 @@ foreach name : [ 'remote', 'qemu', 'lxc' ] protocol_c, input: protocol_x, output: protocol_c, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=source', '--header=' + protocol_h, '@INPUT@', '@OUTPUT@', ], ) diff --git a/src/rpc/genprotocol.pl b/src/rpc/genprotocol.pl deleted file mode 100755 index 67cf6d4c0b..0000000000 --- a/src/rpc/genprotocol.pl +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env perl -# -# Generate code for an XDR protocol, applying -# fixups to the glibc rpcgen code so that it compiles -# with warnings turned on. -# -# This code is evil. Arguably better would be just to compile -# without -Werror. Update: The IXDR_PUT_LONG replacements are -# actually fixes for 64 bit, so this file is necessary. Arguably -# so is the type-punning fix. -# -# Copyright (C) 2007, 2011-2013 Red Hat, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library. If not, see -# . -# -# Richard Jones - -use strict; - -my $in_function = 0; -my @function = (); - -my $rpcgen = shift; -my $mode = shift; -my $xdrdef = shift; -my $target = shift; - -unlink $target; - -if ($rpcgen =~ /portable-rpcgen/) { - $rpcgen = "$rpcgen -o -"; -} else { - $rpcgen = "$rpcgen -C"; -} -open RPCGEN, "-|", "$rpcgen $mode $xdrdef" - or die "cannot run $rpcgen $mode $xdrdef: $!"; -open TARGET, ">$target" - or die "cannot create $target: $!"; - -if ($mode eq "-c") { - print TARGET "#include \n"; -} - -while () { - if (m/^{/) { - $in_function = 1; - print TARGET; - next; - } - - s/\t/ /g; - - # Fix VPATH builds - s,#include ".*/([^/]+)protocol\.h",#include "${1}protocol.h",; - - # Portability for Solaris RPC - s/u_quad_t/uint64_t/g; - s/quad_t/int64_t/g; - s/xdr_u_quad_t/xdr_uint64_t/g; - s/xdr_quad_t/xdr_int64_t/g; - s/(?]\bbuf\b/, @function; - @function = grep !/[^.>]\bbuf\b/, @function if @uses == 1; - - # Remove decl of i, if i isn't used in the function. - @uses = grep /[^.>]\bi\b/, @function; - @function = grep !/[^.>]\bi\b/, @function if @uses == 1; - - # The code uses 'IXDR_PUT_{U_,}LONG' but it's wrong in two - # ways: Firstly these functions are deprecated and don't - # work on 64 bit platforms. Secondly the return value should - # be ignored. Correct both these mistakes. - @function = - map { s/\bIXDR_PUT_((U_)?)LONG\b/(void)IXDR_PUT_$1INT32/; $_ } - map { s/\bXDR_INLINE\b/(int32_t*)XDR_INLINE/; $_ } - @function; - - print TARGET (join ("", @function)); - @function = (); - } - - unless ($in_function) { - print TARGET; - } else { - push @function, $_; - } -} - -close TARGET - or die "cannot save $target: $!"; -close RPCGEN - or die "cannot shutdown $rpcgen: $!"; - -chmod 0444, $target - or die "cannot set $target readonly: $!"; diff --git a/src/rpc/meson.build b/src/rpc/meson.build index 36a2809adf..d58f3caaf5 100644 --- a/src/rpc/meson.build +++ b/src/rpc/meson.build @@ -1,4 +1,3 @@ -genprotocol_prog = find_program('genprotocol.pl') gendispatch_prog = find_program('gendispatch.pl') socket_sources = [ @@ -53,8 +52,10 @@ foreach name : [ 'virnet', 'virkeepalive' ] header_file, input: protocol_file, output: header_file, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=header', '@INPUT@', '@OUTPUT@', ], ) @@ -62,8 +63,10 @@ foreach name : [ 'virnet', 'virkeepalive' ] source_file, input: protocol_file, output: source_file, + depend_files: rpcgen_src, command: [ - genprotocol_prog, rpcgen_prog, '-c', '@INPUT@', '@OUTPUT@', + meson_python_prog, python3_prog, rpcgen_prog, + '--mode=source', '--header=' + header_file, '@INPUT@', '@OUTPUT@', ], )