]> xenbits.xensource.com Git - libvirt.git/commitdiff
build: switch over to new rpc generator code
authorDaniel P. Berrangé <berrange@redhat.com>
Wed, 14 Dec 2022 11:58:51 +0000 (06:58 -0500)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 3 Nov 2023 18:06:35 +0000 (14:06 -0400)
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 <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
libvirt.spec.in
meson.build
scripts/rpcgen/meson.build
scripts/rpcgen/rpcgen/meson.build [new file with mode: 0644]
src/admin/meson.build
src/locking/meson.build
src/logging/meson.build
src/lxc/meson.build
src/remote/meson.build
src/rpc/genprotocol.pl [deleted file]
src/rpc/meson.build

index 8d0a0aad6018e66db782f0e2cd0b6c9c9c4e9113..bcf4e128a531ef4825091795eb1d62334b894746 100644 (file)
@@ -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}
index 85ddad52c1cff4d2e52b72f4b5a1c0533bcf6196..755e9187e252872b176fbd02a5fc768e26de51fd 100644 (file)
@@ -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 = [
index 52526bf8126a20abc35549583862f66aabc2761b..65236457be30dee76827755e7e9da070025018d1 100644 (file)
@@ -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 (file)
index 0000000..5a0f59e
--- /dev/null
@@ -0,0 +1,7 @@
+rpcgen_src = files([
+    'ast.py',
+    'lexer.py',
+    'generator.py',
+    'parser.py',
+    'visitor.py',
+])
index e04d610f924c2853efdf68e8f1f735f7f961a4c4..ca2a475a6fabdea9dc1fee34a298c7d10b1a3101 100644 (file)
@@ -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@',
   ],
 )
 
index ff1578cfcb87c924025cd4f618b6169012bcb8a6..c661389178da6a89e9589fb742da1451dfe10d8f 100644 (file)
@@ -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@',
   ],
 )
 
index 4d98113ac718a381bd27b6bcb193a598662afafc..0e0cc7ab76d14ea6b040f8f85a2dd1a1eb630a5d 100644 (file)
@@ -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@',
   ],
 )
 
index d8644190f0d8fa5e63baee1f89474aa08cdeadcf..edb88a71cb364ecb6cbb263d2fcc2be491444e9c 100644 (file)
@@ -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(
index 498f7ff1b898d7b4770320301cdc0dbef674a4aa..16b903fcaf821ecc778a9d7a72e17393031e195f 100644 (file)
@@ -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 (executable)
index 67cf6d4..0000000
+++ /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
-# <http://www.gnu.org/licenses/>.
-#
-# Richard Jones <rjones@redhat.com>
-
-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 <config.h>\n";
-}
-
-while (<RPCGEN>) {
-    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/(?<!IXDR_GET_INT32 )IXDR_GET_LONG/IXDR_GET_INT32/g;
-
-    if (m/^}/) {
-        $in_function = 0;
-
-        # Note: The body of the function is in @function.
-
-        # Remove decl of buf, if buf isn't used in the function.
-        my @uses = grep /[^.>]\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: $!";
index 36a2809adf970e1d2e921b982a14cf7323c20a7b..d58f3caaf5ebeb6736771c96ed2cf00dad2dd3b7 100644 (file)
@@ -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@',
     ],
   )