From 716c7bb1dd6ec7d3e19a11e4a3de1cf744d8ac60 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Tue, 17 Sep 2013 05:29:23 -0600 Subject: [PATCH] build: fix VPATH build of remote driver Commit 073e1575 tried to set things up so that 1) generated files to be shipped in the tarball always live in srcdir, and 2) we have no files in SOURCES that depend on any other files with a literal $(srcdir) in the name, because that situation can cause confusing results for the make expansion of $@ depending on whether the file is found locally or via VPATH. But all my testing for that patch was done incrementally, where all the protocol.[ch] files had already been generated prior to the patch and were up-to-date in the srcdir, and thus I missed one case where $@ causes grief in a VPATH build from a fresh checkout: We have a pattern rule for generating remote_protocol.[ch], and what's more, the rule for protocol.c depends on protocol.h AND on the protocol.x file. The pattern for protocol.c is only satisfied via the VPATH lookup for protocol.x, and if protocol.h doesn't yet exist, the VPATH rule kicks in and we end up with a dependency on a file with $(srcdir) in the name. Based on make's rules for $@, this resulted in make building remote_protocol.h into srcdir (where we want it), then remote_protocol.c into builddir (oops, not so good for the tarball), and also causes the build to fail (the compiler can't find the .h if it lives in a different directory than the .c): CC remote/libvirt_driver_remote_la-remote_protocol.lo remote/remote_protocol.c:7:29: fatal error: remote_protocol.h: No such file or directory #include "remote_protocol.h" ^ compilation terminated. As before, the fix is to hard-code the output file to go into srcdir in spite of $@; but since this is in a pattern rule, we are forced to use $@ in the recipe, so the patch is a bit trickier than what was done in commit 073e1575. * src/Makefile.am (%protocol.c, %protocol.h): Force output to srcdir. Signed-off-by: Eric Blake --- src/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index da6f7a17b8..1388c5fdb5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1014,11 +1014,11 @@ endif WITH_REMOTE %protocol.c: %protocol.x %protocol.h $(srcdir)/rpc/genprotocol.pl $(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -c \ - $< $@ + $< $(srcdir)/$(subst $(srcdir)/,,$@) %protocol.h: %protocol.x $(srcdir)/rpc/genprotocol.pl $(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/genprotocol.pl $(RPCGEN) -h \ - $< $@ + $< $(srcdir)/$(subst $(srcdir)/,,$@) if WITH_XEN noinst_LTLIBRARIES += libvirt_driver_xen_impl.la