From: Daniel P. Berrange <berrange@xxxxxxxxxx> Always generate the rpc files, and require rpcgen during bootstrap. * daemon/Makefile.am: Removed generated files with maintainer-clean target * src/Makefile.am: Removed generated files with maintainer-clean target. Always run 'rpcgen' if generated files are missing --- bootstrap.conf | 1 + daemon/Makefile.am | 35 ++++++--------- src/Makefile.am | 101 ++++++++++++----------------------------- src/remote/remote_protocol.c | 2 +- src/remote/rpcgen_fix.pl | 47 +++++++++++++++++--- 5 files changed, 87 insertions(+), 99 deletions(-) diff --git a/bootstrap.conf b/bootstrap.conf index 09e8218..2d27846 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -169,6 +169,7 @@ gzip - libtool - perl 5.5 pkg-config - +rpcgen - tar - " diff --git a/daemon/Makefile.am b/daemon/Makefile.am index c6f4d29..114adf3 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -2,21 +2,26 @@ CLEANFILES = -DAEMON_SOURCES = \ - libvirtd.c libvirtd.h \ - remote.c remote.h \ - dispatch.c dispatch.h \ - stream.c stream.h \ +DAEMON_GENERATED = \ remote_dispatch_prototypes.h \ remote_dispatch_table.h \ remote_dispatch_args.h \ remote_dispatch_ret.h \ + remote_dispatch_bodies.h \ qemu_dispatch_prototypes.h \ qemu_dispatch_table.h \ qemu_dispatch_args.h \ qemu_dispatch_ret.h \ + qemu_dispatch_bodies.h + +DAEMON_SOURCES = \ + libvirtd.c libvirtd.h \ + remote.c remote.h \ + dispatch.c dispatch.h \ + stream.c stream.h \ ../src/remote/remote_protocol.c \ - ../src/remote/qemu_protocol.c + ../src/remote/qemu_protocol.c \ + $(DAEMON_GENERATED) AVAHI_SOURCES = \ mdns.c mdns.h @@ -202,20 +207,8 @@ install-data-polkit:: uninstall-data-polkit:: endif - -remote.c: \ - remote_dispatch_prototypes.h \ - remote_dispatch_table.h \ - remote_dispatch_bodies.h \ - qemu_dispatch_prototypes.h \ - qemu_dispatch_table.h \ - qemu_dispatch_bodies.h - -remote.h: \ - remote_dispatch_args.h \ - remote_dispatch_ret.h \ - qemu_dispatch_args.h \ - qemu_dispatch_ret.h +remote.c: $(DAEMON_GENERATED) +remote.h: $(DAEMON_GENERATED) REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x @@ -360,4 +353,4 @@ endif CLEANFILES += $(BUILT_SOURCES) $(man8_MANS) CLEANFILES += *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda -MAINTAINERCLEANFILES = $(srcdir)/libvirtd.8.in +MAINTAINERCLEANFILES = $(srcdir)/libvirtd.8.in $(DAEMON_GENERATED) diff --git a/src/Makefile.am b/src/Makefile.am index 962c6f9..b7ea8d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -154,27 +154,36 @@ CONF_SOURCES = \ $(CPU_CONF_SOURCES) # The remote RPC driver, covering domains, storage, networks, etc -REMOTE_DRIVER_SOURCES = \ - gnutls_1_0_compat.h \ - remote/remote_driver.c remote/remote_driver.h \ +REMOTE_DRIVER_GENERATED = \ remote/remote_protocol.c \ remote/remote_protocol.h \ + remote/remote_client_bodies.h \ remote/qemu_protocol.c \ - remote/qemu_protocol.h - -remote/remote_driver.c: remote/remote_client_bodies.h remote/qemu_client_bodies.h + remote/qemu_protocol.h \ + remote/qemu_client_bodies.h REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x +REMOTE_DRIVER_PROTOCOL = $(REMOTE_PROTOCOL) $(QEMU_PROTOCOL) -remote/remote_client_bodies.h: $(top_srcdir)/daemon/remote_generator.pl $(REMOTE_PROTOCOL) - $(AM_V_GEN)perl -w $(top_srcdir)/daemon/remote_generator.pl -c -k remote $(REMOTE_PROTOCOL) > $@ +remote/remote_client_bodies.h: $(top_srcdir)/daemon/remote_generator.pl \ + $(REMOTE_PROTOCOL) + $(AM_V_GEN)perl -w $(top_srcdir)/daemon/remote_generator.pl \ + -c -k remote $(REMOTE_PROTOCOL) > $@ -remote/qemu_client_bodies.h: $(top_srcdir)/daemon/remote_generator.pl $(QEMU_PROTOCOL) - $(AM_V_GEN)perl -w $(top_srcdir)/daemon/remote_generator.pl -k remote $(QEMU_PROTOCOL) > $@ +remote/qemu_client_bodies.h: $(top_srcdir)/daemon/remote_generator.pl \ + $(QEMU_PROTOCOL) + $(AM_V_GEN)perl -w $(top_srcdir)/daemon/remote_generator.pl \ + -k qemu $(QEMU_PROTOCOL) > $@ + +REMOTE_DRIVER_SOURCES = \ + gnutls_1_0_compat.h \ + remote/remote_driver.c remote/remote_driver.h \ + $(REMOTE_DRIVER_GENERATED) -EXTRA_DIST += remote/remote_protocol.x remote/qemu_protocol.x \ - remote/rpcgen_fix.pl remote/remote_client_bodies.h remote/qemu_client_bodies.h +EXTRA_DIST += $(REMOTE_DRIVER_PROTOCOL) \ + $(REMOTE_DRIVER_GENERATED) \ + remote/rpcgen_fix.pl # 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 @@ -539,68 +548,17 @@ libvirt_driver_remote_la_LDFLAGS += -module -avoid-version endif libvirt_driver_remote_la_SOURCES = $(REMOTE_DRIVER_SOURCES) -if HAVE_RPCGEN -# -# Maintainer-only target for re-generating the derived .c/.h source -# files, which are actually derived from the .x file. -# -# For committing protocol changes to GIT, the GLIBC rpcgen *must* -# be used. -# -# Support for non-GLIB rpcgen is here as a convenience for -# non-Linux people needing to test changes during dev. -# -rpcgen-normal: - rm -f rp.c-t rp.h-t rp.c-t1 rp.c-t2 rp.h-t1 - $(RPCGEN) -h -o rp.h-t $(srcdir)/remote/remote_protocol.x - $(RPCGEN) -c -o rp.c-t $(srcdir)/remote/remote_protocol.x -if HAVE_GLIBC_RPCGEN - perl -w $(srcdir)/remote/rpcgen_fix.pl rp.h-t > rp.h-t1 - perl -w $(srcdir)/remote/rpcgen_fix.pl rp.c-t > rp.c-t1 - (echo '#include <config.h>'; cat rp.c-t1) > rp.c-t2 - chmod 0444 rp.c-t2 rp.h-t1 - mv -f rp.h-t1 $(srcdir)/remote/remote_protocol.h - mv -f rp.c-t2 $(srcdir)/remote/remote_protocol.c - rm -f rp.c-t rp.h-t rp.c-t1 -else - chmod 0444 rp.c-t rp.h-t - mv -f rp.h-t $(srcdir)/remote/remote_protocol.h - mv -f rp.c-t $(srcdir)/remote/remote_protocol.c -endif - -rpcgen-qemu: - rm -f rp_qemu.c-t rp_qemu.h-t rp_qemu.c-t1 rp_qemu.c-t2 rp_qemu.h-t1 - $(RPCGEN) -h -o rp_qemu.h-t $(srcdir)/remote/qemu_protocol.x - $(RPCGEN) -c -o rp_qemu.c-t $(srcdir)/remote/qemu_protocol.x -if HAVE_GLIBC_RPCGEN - perl -w $(srcdir)/remote/rpcgen_fix.pl rp_qemu.h-t > rp_qemu.h-t1 - perl -w $(srcdir)/remote/rpcgen_fix.pl rp_qemu.c-t > rp_qemu.c-t1 - (echo '#include <config.h>'; cat rp_qemu.c-t1) > rp_qemu.c-t2 - chmod 0444 rp_qemu.c-t2 rp_qemu.h-t1 - mv -f rp_qemu.h-t1 $(srcdir)/remote/qemu_protocol.h - mv -f rp_qemu.c-t2 $(srcdir)/remote/qemu_protocol.c - rm -f rp_qemu.c-t rp_qemu.h-t rp_qemu.c-t1 -else - chmod 0444 rp_qemu.c-t rp_qemu.h-t - mv -f rp_qemu.h-t $(srcdir)/remote/qemu_protocol.h - mv -f rp_qemu.c-t $(srcdir)/remote/qemu_protocol.c -endif -# -# Maintainer-only target for re-generating the derived .c/.h source -# files, which are actually derived from the .x file. -# -# For committing protocol changes to GIT, the GLIBC rpcgen *must* -# be used. -# -# Support for non-GLIB rpcgen is here as a convenience for -# non-Linux people needing to test changes during dev. -# -rpcgen: rpcgen-normal rpcgen-qemu +remote/remote_driver.c: $(REMOTE_DRIVER_GENERATED) -endif +remote/%_protocol.c: remote/%_protocol.x remote/%_protocol.h + $(AM_V_GEN)perl -w $(srcdir)/remote/rpcgen_fix.pl $(RPCGEN) -c \ + $< $@ + +remote/%_protocol.h: remote/%_protocol.x + $(AM_V_GEN)perl -w $(srcdir)/remote/rpcgen_fix.pl $(RPCGEN) -h \ + $< $@ -remote/remote_protocol.c: remote/remote_protocol.h endif if WITH_XEN @@ -1350,3 +1308,4 @@ endif CLEANFILES = *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda *.i *.s DISTCLEANFILES = $(BUILT_SOURCES) +MAINTAINERCLEANFILES = $(REMOTE_DRIVER_GENERATED) diff --git a/src/remote/remote_protocol.c b/src/remote/remote_protocol.c index 301ffbf..84bc617 100644 --- a/src/remote/remote_protocol.c +++ b/src/remote/remote_protocol.c @@ -4,7 +4,7 @@ * It was generated using rpcgen. */ -#include "remote_protocol.h" +#include "remote/remote_protocol.h" #include "internal.h" #include <arpa/inet.h> #ifdef HAVE_XDR_U_INT64_T diff --git a/src/remote/rpcgen_fix.pl b/src/remote/rpcgen_fix.pl index 3cf5479..4edba98 100644 --- a/src/remote/rpcgen_fix.pl +++ b/src/remote/rpcgen_fix.pl @@ -1,4 +1,6 @@ -# Fix XDR code (generated by rpcgen) so that it compiles +# +# Generate code for an XDR protocol, optionally 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 @@ -6,7 +8,7 @@ # actually fixes for 64 bit, so this file is necessary. Arguably # so is the type-punning fix. # -# Copyright (C) 2007 Red Hat, Inc. +# Copyright (C) 2007, 2011 Red Hat, Inc. # # See COPYING for the license of this software. # @@ -17,10 +19,35 @@ use strict; my $in_function = 0; my @function = (); -while (<>) { +my $rpcgen = shift; +my $mode = shift; +my $xdrdef = shift; +my $target = shift; + +unlink $target; + +open RPCGEN, "-|", $rpcgen, $mode, $xdrdef + or die "cannot run $rpcgen $mode $xdrdef: $!"; +open TARGET, ">$target" + or die "cannot create $target: $!"; + +my $fixup = $^O eq "linux"; + +if ($mode eq "-c") { + print TARGET "#include <config.h>\n"; +} + +while (<RPCGEN>) { + # We only want to fixup the GLibc rpcgen output + # So just print data unchanged, if non-Linux + unless ($fixup) { + print TARGET; + next; + } + if (m/^{/) { $in_function = 1; - print; + print TARGET; next; } @@ -79,13 +106,21 @@ while (<>) { map { s/\bXDR_INLINE\b/(int32_t*)XDR_INLINE/; $_ } @function; - print (join ("", @function)); + print TARGET (join ("", @function)); @function = (); } unless ($in_function) { - print; + 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: $!"; -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list