build: refactor generated RPC files

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
This commit is contained in:
Daniel P. Berrange 2011-05-06 14:11:32 +01:00 committed by Eric Blake
parent d3c5104dda
commit fb1e8d9c44
5 changed files with 89 additions and 101 deletions

View File

@ -169,6 +169,7 @@ gzip -
libtool -
perl 5.5
pkg-config -
rpcgen -
tar -
"

View File

@ -2,21 +2,26 @@
CLEANFILES =
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 \
remote_dispatch_prototypes.h \
remote_dispatch_table.h \
remote_dispatch_args.h \
remote_dispatch_ret.h \
qemu_dispatch_prototypes.h \
qemu_dispatch_table.h \
qemu_dispatch_args.h \
qemu_dispatch_ret.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)

View File

@ -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) > $@
EXTRA_DIST += remote/remote_protocol.x remote/qemu_protocol.x \
remote/rpcgen_fix.pl remote/remote_client_bodies.h remote/qemu_client_bodies.h
REMOTE_DRIVER_SOURCES = \
gnutls_1_0_compat.h \
remote/remote_driver.c remote/remote_driver.h \
$(REMOTE_DRIVER_GENERATED)
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
remote/remote_driver.c: $(REMOTE_DRIVER_GENERATED)
#
# 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/%_protocol.c: remote/%_protocol.x remote/%_protocol.h
$(AM_V_GEN)perl -w $(srcdir)/remote/rpcgen_fix.pl $(RPCGEN) -c \
$< $@
endif
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)

View File

@ -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

View File

@ -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: $!";