[libvirt] [PATCH 1/4] build: avoid $(srcdir) in *_SOURCES

Eric Blake eblake at redhat.com
Mon Sep 9 15:51:32 UTC 2013


Trying to enable automake's subdir-objects option resulted in
the creation of literal directories such as src/$(srcdir)/remote/.
I traced this to the fact that we had used a literal $(srcdir)
in a location that later fed an automake *_SOURCES variable.
This has also been reported as an automake bug:
http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13928
but it's better to fix our code than to wait for an automake fix.

Some things to remember that affect VPATH builds, and where an
in-tree build is blissfully unaware of the issues: if a VPATH
build fails to find a file that was used as a prereq of any
other target, then the rule for that file will expand $@ to
prefer the current build dir (bad because a VPATH build on a
fresh checkout will then stick $@ in the current directory
instead of the desired srcdir); conversely, if a VPATH build
finds the file in srcdir but decides it needs to be rebuilt,
then the rule for that file will expand $@ to include the
directory where it was found out-of-date (bad for an explicit
listing of $(srcdir)/$@ because an incremental VPATH build will
then expand srcdir twice).  As we want these files to go into
srcdir unconditionally, we have to massage or avoid $@ for any
recipe that involves one of these files.

Therefore, this patch removes all uses of $(srcdir) from any
generated file name that later feeds a *_SOURCES variable, and
then rewrites all the recipes to generate those files to
hard-code their creation into srcdir without the use of $@.

* src/Makefile.am (REMOTE_DRIVER_GENERATED): Drop $(srcdir); VPATH
builds know how to find the files, and automake subdir-objects
fails with it in place.
(LXC_MONITOR_PROTOCOL_GENERATED, (LXC_MONITOR_GENERATED)
(ACCESS_DRIVER_GENERATED, LOCK_PROTOCOL_GENERATED): Likewise.
(*_client_bodies.h): Hard-code rules to write into srcdir, as
VPATH tries to build $@ locally if missing.
(util/virkeymaps.h): Likewise.
(lxc/lxc_monitor_dispatch.h): Likewise.
(access/viraccessapi*): Likewise.
(locking/lock_daemon_dispatch_stubs.h): Likewise.
* daemon/Makeflie.am (DAEMON_GENERATED, remote_dispatch.h):
Likewise.

Signed-off-by: Eric Blake <eblake at redhat.com>

fixup DAEMON_GENERATED
---
 daemon/Makefile.am |  23 ++++++-----
 src/Makefile.am    | 109 ++++++++++++++++++++++++++++++-----------------------
 2 files changed, 74 insertions(+), 58 deletions(-)

diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 90689f8..e0b8744 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -29,10 +29,10 @@ INCLUDES = \

 CLEANFILES =

-DAEMON_GENERATED =					\
-		$(srcdir)/remote_dispatch.h		\
-		$(srcdir)/lxc_dispatch.h		\
-		$(srcdir)/qemu_dispatch.h		\
+DAEMON_GENERATED =			\
+		remote_dispatch.h	\
+		lxc_dispatch.h		\
+		qemu_dispatch.h		\
 		$(NULL)

 DAEMON_SOURCES =					\
@@ -75,20 +75,23 @@ REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x
 LXC_PROTOCOL = $(top_srcdir)/src/remote/lxc_protocol.x
 QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x

-$(srcdir)/remote_dispatch.h: $(srcdir)/../src/rpc/gendispatch.pl \
+remote_dispatch.h: $(srcdir)/../src/rpc/gendispatch.pl \
 		$(REMOTE_PROTOCOL)
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/../src/rpc/gendispatch.pl \
-	  --mode=server remote REMOTE $(REMOTE_PROTOCOL) > $@
+	  --mode=server remote REMOTE $(REMOTE_PROTOCOL) \
+	  > $(srcdir)/remote_dispatch.h

-$(srcdir)/lxc_dispatch.h: $(srcdir)/../src/rpc/gendispatch.pl \
+lxc_dispatch.h: $(srcdir)/../src/rpc/gendispatch.pl \
 		$(LXC_PROTOCOL)
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/../src/rpc/gendispatch.pl \
-	  --mode=server lxc LXC $(LXC_PROTOCOL) > $@
+	  --mode=server lxc LXC $(LXC_PROTOCOL) \
+	  > $(srcdir)/lxc_dispatch.h

-$(srcdir)/qemu_dispatch.h: $(srcdir)/../src/rpc/gendispatch.pl \
+qemu_dispatch.h: $(srcdir)/../src/rpc/gendispatch.pl \
 		$(QEMU_PROTOCOL)
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/../src/rpc/gendispatch.pl \
-	  --mode=server qemu QEMU $(QEMU_PROTOCOL) > $@
+	  --mode=server qemu QEMU $(QEMU_PROTOCOL) \
+	  > $(srcdir)/qemu_dispatch.h

 if WITH_LIBVIRTD

diff --git a/src/Makefile.am b/src/Makefile.am
index ca35e04..7f76af7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -154,12 +154,12 @@ UTIL_SOURCES =							\
 EXTRA_DIST += $(srcdir)/util/virkeymaps.h $(srcdir)/util/keymaps.csv \
 		$(srcdir)/util/virkeycode-mapgen.py

-BUILT_SOURCES += $(srcdir)/util/virkeymaps.h
+BUILT_SOURCES += util/virkeymaps.h

-$(srcdir)/util/virkeymaps.h: $(srcdir)/util/keymaps.csv	\
+util/virkeymaps.h: $(srcdir)/util/keymaps.csv	\
 		$(srcdir)/util/virkeycode-mapgen.py
 	$(AM_V_GEN)$(PYTHON) $(srcdir)/util/virkeycode-mapgen.py \
-	  <$(srcdir)/util/keymaps.csv >$@
+	  <$(srcdir)/util/keymaps.csv >$(srcdir)/util/virkeymaps.h

 EXTRA_DIST += util/virthreadpthread.c util/virthreadwin32.c

@@ -185,8 +185,8 @@ LOCK_DRIVER_SANLOCK_HELPER_SOURCES = \
 		locking/sanlock_helper.c

 LOCK_PROTOCOL_GENERATED = \
-		$(srcdir)/locking/lock_protocol.h \
-		$(srcdir)/locking/lock_protocol.c \
+		locking/lock_protocol.h \
+		locking/lock_protocol.c \
 		$(NULL)

 LOCK_PROTOCOL = $(srcdir)/locking/lock_protocol.x
@@ -216,11 +216,11 @@ LOCK_DAEMON_SOURCES = \
 		locking/lock_daemon_dispatch.h \
 		$(NULL)

-$(srcdir)/locking/lock_daemon_dispatch_stubs.h: $(LOCK_PROTOCOL) \
+locking/lock_daemon_dispatch_stubs.h: $(LOCK_PROTOCOL) \
 		$(srcdir)/rpc/gendispatch.pl Makefile.am
 	$(AM_V_GEN)perl -w $(srcdir)/rpc/gendispatch.pl --mode=server \
 	    virLockSpaceProtocol VIR_LOCK_SPACE_PROTOCOL \
-	    $(LOCK_PROTOCOL) > $@
+	    $(LOCK_PROTOCOL) > $(srcdir)/locking/lock_daemon_dispatch_stubs.h


 NETDEV_CONF_SOURCES =						\
@@ -302,35 +302,39 @@ CONF_SOURCES =							\

 # The remote RPC driver, covering domains, storage, networks, etc
 REMOTE_DRIVER_GENERATED = \
-		$(srcdir)/remote/remote_protocol.c		\
-		$(srcdir)/remote/remote_protocol.h		\
-		$(srcdir)/remote/remote_client_bodies.h		\
-		$(srcdir)/remote/lxc_protocol.c			\
-		$(srcdir)/remote/lxc_protocol.h			\
-		$(srcdir)/remote/lxc_client_bodies.h		\
-		$(srcdir)/remote/qemu_protocol.c		\
-		$(srcdir)/remote/qemu_protocol.h		\
-		$(srcdir)/remote/qemu_client_bodies.h
+		remote/remote_protocol.c		\
+		remote/remote_protocol.h		\
+		remote/remote_client_bodies.h		\
+		remote/lxc_protocol.c			\
+		remote/lxc_protocol.h			\
+		remote/lxc_client_bodies.h		\
+		remote/qemu_protocol.c			\
+		remote/qemu_protocol.h			\
+		remote/qemu_client_bodies.h		\
+		$(NULL)

 REMOTE_PROTOCOL = $(srcdir)/remote/remote_protocol.x
 LXC_PROTOCOL = $(srcdir)/remote/lxc_protocol.x
 QEMU_PROTOCOL = $(srcdir)/remote/qemu_protocol.x
 REMOTE_DRIVER_PROTOCOL = $(REMOTE_PROTOCOL) $(QEMU_PROTOCOL) $(LXC_PROTOCOL)

-$(srcdir)/remote/remote_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
+remote/remote_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
 		$(REMOTE_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=client \
-	  remote REMOTE $(REMOTE_PROTOCOL) > $@
+	  remote REMOTE $(REMOTE_PROTOCOL) \
+	  > $(srcdir)/remote/remote_client_bodies.h

-$(srcdir)/remote/lxc_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
+remote/lxc_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
 		$(LXC_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=client \
-	  lxc LXC $(LXC_PROTOCOL) > $@
+	  lxc LXC $(LXC_PROTOCOL) \
+	  > $(srcdir)/remote/lxc_client_bodies.h

-$(srcdir)/remote/qemu_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
+remote/qemu_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
 		$(QEMU_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=client \
-	  qemu QEMU $(QEMU_PROTOCOL) > $@
+	  qemu QEMU $(QEMU_PROTOCOL) \
+	  > $(srcdir)/remote/qemu_client_bodies.h

 REMOTE_DRIVER_SOURCES =						\
 		gnutls_1_0_compat.h				\
@@ -534,16 +538,16 @@ XEN_DRIVER_SOURCES += xen/xen_inotify.c xen/xen_inotify.h
 endif WITH_XEN_INOTIFY

 LXC_MONITOR_PROTOCOL_GENERATED = \
-	$(srcdir)/lxc/lxc_monitor_protocol.h \
-	$(srcdir)/lxc/lxc_monitor_protocol.c \
+	lxc/lxc_monitor_protocol.h \
+	lxc/lxc_monitor_protocol.c \
 	$(NULL)

 LXC_MONITOR_GENERATED = \
-	$(srcdir)/lxc/lxc_monitor_dispatch.h \
+	lxc/lxc_monitor_dispatch.h \
 	$(NULL)

 LXC_CONTROLLER_GENERATED = \
-	$(srcdir)/lxc/lxc_controller_dispatch.h \
+	lxc/lxc_controller_dispatch.h \
 	$(NULL)

 LXC_GENERATED = \
@@ -554,15 +558,17 @@ LXC_GENERATED = \

 LXC_MONITOR_PROTOCOL = $(srcdir)/lxc/lxc_monitor_protocol.x

-$(srcdir)/lxc/lxc_monitor_dispatch.h: $(srcdir)/rpc/gendispatch.pl \
+lxc/lxc_monitor_dispatch.h: $(srcdir)/rpc/gendispatch.pl \
 		$(LXC_MONITOR_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=client \
-	  virLXCMonitor VIR_LXC_MONITOR $(LXC_MONITOR_PROTOCOL) > $@
+	  virLXCMonitor VIR_LXC_MONITOR $(LXC_MONITOR_PROTOCOL) > \
+	  $(srcdir)/lxc/lxc_monitor_dispatch.h

-$(srcdir)/lxc/lxc_controller_dispatch.h: $(srcdir)/rpc/gendispatch.pl \
+lxc/lxc_controller_dispatch.h: $(srcdir)/rpc/gendispatch.pl \
 		$(REMOTE_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=server \
-	  virLXCMonitor VIR_LXC_MONITOR $(LXC_MONITOR_PROTOCOL) > $@
+	  virLXCMonitor VIR_LXC_MONITOR $(LXC_MONITOR_PROTOCOL) > \
+	  $(srcdir)/lxc/lxc_controller_dispatch.h

 EXTRA_DIST += \
 	$(LXC_MONITOR_PROTOCOL) \
@@ -824,12 +830,13 @@ SECURITY_DRIVER_APPARMOR_SOURCES =				\
 		security/security_apparmor.h security/security_apparmor.c

 ACCESS_DRIVER_GENERATED = \
-		$(srcdir)/access/viraccessapicheck.h \
-		$(srcdir)/access/viraccessapicheck.c \
-		$(srcdir)/access/viraccessapicheckqemu.h \
-		$(srcdir)/access/viraccessapicheckqemu.c \
-		$(srcdir)/access/viraccessapichecklxc.h \
-		$(srcdir)/access/viraccessapichecklxc.c
+		access/viraccessapicheck.h \
+		access/viraccessapicheck.c \
+		access/viraccessapicheckqemu.h \
+		access/viraccessapicheckqemu.c \
+		access/viraccessapichecklxc.h \
+		access/viraccessapichecklxc.c \
+		$(NULL)

 ACCESS_DRIVER_SYM_FILES = \
 		libvirt_access.syms \
@@ -1541,32 +1548,38 @@ libvirt_access_lxc.xml: $(srcdir)/rpc/gendispatch.pl \
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=aclapi \
 	  lxc LXC $(LXC_PROTOCOL) > $@

-$(srcdir)/access/viraccessapicheck.h: $(srcdir)/rpc/gendispatch.pl \
+access/viraccessapicheck.h: $(srcdir)/rpc/gendispatch.pl \
 			$(REMOTE_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=aclheader \
-	  remote REMOTE $(REMOTE_PROTOCOL) > $@
-$(srcdir)/access/viraccessapicheck.c: $(srcdir)/rpc/gendispatch.pl \
+	  remote REMOTE $(REMOTE_PROTOCOL) \
+	  > $(srcdir)/access/viraccessapicheck.h
+access/viraccessapicheck.c: $(srcdir)/rpc/gendispatch.pl \
 			$(REMOTE_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=aclbody \
-	  remote REMOTE $(REMOTE_PROTOCOL) access/viraccessapicheck.h > $@
+	  remote REMOTE $(REMOTE_PROTOCOL) access/viraccessapicheck.h \
+	  > $(srcdir)/access/viraccessapicheck.c

-$(srcdir)/access/viraccessapicheckqemu.h: $(srcdir)/rpc/gendispatch.pl \
+access/viraccessapicheckqemu.h: $(srcdir)/rpc/gendispatch.pl \
 			$(QEMU_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=aclheader \
-	  qemu QEMU $(QEMU_PROTOCOL) > $@
-$(srcdir)/access/viraccessapicheckqemu.c: $(srcdir)/rpc/gendispatch.pl \
+	  qemu QEMU $(QEMU_PROTOCOL) \
+	  > $(srcdir)/access/viraccessapicheckqemu.h
+access/viraccessapicheckqemu.c: $(srcdir)/rpc/gendispatch.pl \
 			$(QEMU_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=aclbody \
-	  qemu QEMU $(QEMU_PROTOCOL) access/viraccessapicheckqemu.h > $@
+	  qemu QEMU $(QEMU_PROTOCOL) access/viraccessapicheckqemu.h \
+	  > $(srcdir)/access/viraccessapicheckqemu.c

-$(srcdir)/access/viraccessapichecklxc.h: $(srcdir)/rpc/gendispatch.pl \
+access/viraccessapichecklxc.h: $(srcdir)/rpc/gendispatch.pl \
 			$(LXC_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=aclheader \
-	  lxc LXC $(LXC_PROTOCOL) > $@
-$(srcdir)/access/viraccessapichecklxc.c: $(srcdir)/rpc/gendispatch.pl \
+	  lxc LXC $(LXC_PROTOCOL) \
+	  > $(srcdir)/access/viraccessapichecklxc.h
+access/viraccessapichecklxc.c: $(srcdir)/rpc/gendispatch.pl \
 			$(LXC_PROTOCOL) Makefile.am
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=aclbody \
-	  lxc LXC $(LXC_PROTOCOL) access/viraccessapichecklxc.h > $@
+	  lxc LXC $(LXC_PROTOCOL) access/viraccessapichecklxc.h \
+	  > $(srcdir)/access/viraccessapichecklxc.c

 # Add all conditional sources just in case...
 EXTRA_DIST +=							\
-- 
1.8.3.1




More information about the libvir-list mailing list