[libvirt] [PATCHv2 2/3] build: refactor generated RPC files

Eric Blake eblake at redhat.com
Fri May 6 21:21:35 UTC 2011


From: Daniel P. Berrange <berrange at redhat.com>

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




More information about the libvir-list mailing list