From e38dff5b4e0f0a25db664810fc3617eac44673ce Mon Sep 17 00:00:00 2001 From: Kaleb S KEITHLEY Date: Tue, 26 Apr 2016 17:04:04 -0400 Subject: build: out-of-tree builds generates files in the wrong directory And minor cleanup of a few of the Makefile.am files while we're at it. Rewrite the make rules to do what xdrgen does. Now we can get rid of xdrgen. Note 1. netbsd6's sed doesn't do -i. Why are we still running smoke tests on netbsd6 and not netbsd7? We barely support netbsd7 as it is. Note 2. Why is/was libgfxdr.so (.../rpc/xdr/src/...) linked with libglusterfs? A cut-and-paste mistake? It has no references to symbols in libglusterfs. Note3. "/#ifndef\|#define\|#endif/" (note the '\'s) is a _basic_ regex that matches the same lines as the _extended_ regex "/#(ifndef|define|endif)/". To match the extended regex sed needs to be run with -r on Linux; with -E on *BSD. However NetBSD's and FreeBSD's sed helpfully also provide -r for compatibility. Using a basic regex avoids having to use a kludge in order to run sed with the correct option on OS X. Note 4. Not copying the bit of xdrgen that inserts copyright/license boilerplate. AFAIK it's silly to pretend that machine generated files like these can be copyrighted or need license boilerplate. The XDR source files have their own copyright and license; and their copyrights are bound to be more up to date than old boilerplate inserted by a script. From what I've seen of other Open Source projects -- e.g. gcc and its C parser files generated by yacc and lex -- IIRC they don't bother to add copyright/license boilerplate to their generated files. It appears that it's a long-standing feature of make (SysV, BSD, gnu) for out-of-tree builds to helpfully pretend that the source files it can find in the VPATH "exist" as if they are in the $cwd. rpcgen doesn't work well in this situation and generates files with "bad" #include directives. E.g. if you `rpcgen ../../../../$srcdir/rpc/xdr/src/glusterfs3-xdr.x`, you get an #include directive in the generated .c file like this: ... #include "../../../../$srcdir/rpc/xdr/src/glusterfs3-xdr.h" ... which (obviously) results in compile errors on out-of-tree build because the (generated) header file doesn't exist at that location. Compared to `rpcgen ./glusterfs3-xdr.x` where you get: ... #include "glusterfs3-xdr.h" ... Which is what we need. We have to resort to some Stupid Make Tricks like the addition of various .PHONY targets to work around the VPATH "help". Warning: When doing an in-tree build, -I$(top_builddir)/rpc/xdr/... looks exactly like -I$(top_srcdir)/rpc/xdr/... Don't be fooled though. And don't delete the -I$(top_builddir)/rpc/xdr/... bits Change-Id: Iba6ab96b2d0a17c5a7e9f92233993b318858b62e BUG: 1330604 Signed-off-by: Kaleb S KEITHLEY Reviewed-on: http://review.gluster.org/14085 Tested-by: Niels de Vos Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Niels de Vos --- rpc/rpc-lib/src/Makefile.am | 1 + rpc/rpc-transport/rdma/src/Makefile.am | 6 +- rpc/rpc-transport/socket/src/Makefile.am | 6 +- rpc/xdr/src/Makefile.am | 103 ++++++++++--------------------- rpc/xdr/src/acl3-xdr.x | 4 ++ rpc/xdr/src/changelog-xdr.x | 15 +++++ rpc/xdr/src/cli1-xdr.x | 15 +++++ rpc/xdr/src/glusterd1-xdr.x | 15 +++++ rpc/xdr/src/glusterfs-fops.x | 15 +++++ rpc/xdr/src/glusterfs3-xdr.x | 14 +++++ rpc/xdr/src/mount3udp.x | 5 ++ rpc/xdr/src/nlm4-xdr.x | 5 ++ rpc/xdr/src/nsm-xdr.x | 15 +++++ rpc/xdr/src/portmap-xdr.x | 14 +++++ rpc/xdr/src/rpc-common-xdr.x | 15 +++++ rpc/xdr/src/rpc-pragmas.h | 28 +++++++++ 16 files changed, 202 insertions(+), 74 deletions(-) create mode 100644 rpc/xdr/src/rpc-pragmas.h (limited to 'rpc') diff --git a/rpc/rpc-lib/src/Makefile.am b/rpc/rpc-lib/src/Makefile.am index 8d0ef9a01b8..b9e55c7ab8a 100644 --- a/rpc/rpc-lib/src/Makefile.am +++ b/rpc/rpc-lib/src/Makefile.am @@ -15,6 +15,7 @@ libgfrpc_ladir = $(includedir)/glusterfs/rpc AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ -I$(top_srcdir)/rpc/xdr/src \ + -I$(top_builddir)/rpc/xdr/src \ -DRPC_TRANSPORTDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/rpc-transport\" \ -I$(top_srcdir)/contrib/rbtree diff --git a/rpc/rpc-transport/rdma/src/Makefile.am b/rpc/rpc-transport/rdma/src/Makefile.am index b5fb06f4f01..fedf304c5fe 100644 --- a/rpc/rpc-transport/rdma/src/Makefile.am +++ b/rpc/rpc-transport/rdma/src/Makefile.am @@ -12,8 +12,10 @@ rdma_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \ noinst_HEADERS = rdma.h name.h rpc-trans-rdma-messages.h AM_CPPFLAGS = $(GF_CPPFLAGS) \ - -I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src/ \ - -I$(top_srcdir)/rpc/xdr/src + -I$(top_srcdir)/libglusterfs/src \ + -I$(top_srcdir)/rpc/rpc-lib/src/ \ + -I$(top_srcdir)/rpc/xdr/src \ + -I$(top_builddir)/rpc/xdr/src AM_CFLAGS = -Wall $(GF_CFLAGS) diff --git a/rpc/rpc-transport/socket/src/Makefile.am b/rpc/rpc-transport/socket/src/Makefile.am index 5e909aceac8..ed0697635da 100644 --- a/rpc/rpc-transport/socket/src/Makefile.am +++ b/rpc/rpc-transport/socket/src/Makefile.am @@ -9,8 +9,10 @@ socket_la_SOURCES = socket.c name.c socket_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la -lssl AM_CPPFLAGS = $(GF_CPPFLAGS) \ - -I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src/ \ - -I$(top_srcdir)/rpc/xdr/src/ + -I$(top_srcdir)/libglusterfs/src \ + -I$(top_srcdir)/rpc/rpc-lib/src/ \ + -I$(top_srcdir)/rpc/xdr/src/ \ + -I$(top_builddir)/rpc/xdr/src/ AM_CFLAGS = -Wall $(GF_CFLAGS) diff --git a/rpc/xdr/src/Makefile.am b/rpc/xdr/src/Makefile.am index e0f9c28be86..73640614c55 100644 --- a/rpc/xdr/src/Makefile.am +++ b/rpc/xdr/src/Makefile.am @@ -9,9 +9,10 @@ lib_LTLIBRARIES = libgfxdr.la libgfxdr_la_CFLAGS = -Wall $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) libgfxdr_la_CPPFLAGS = $(GF_CPPFLAGS) -D__USE_FILE_OFFSET64 \ - -I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src + -I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src \ + -I$(top_builddir)/rpc/xdr/src -libgfxdr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la +# libgfxdr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la libgfxdr_la_LDFLAGS = -version-info $(LIBGFXDR_LT_VERSION) @@ -19,82 +20,44 @@ libgfxdr_la_SOURCES = xdr-generic.c xdr-nfs3.c msg-nfs3.c nodist_libgfxdr_la_SOURCES = $(XDRSOURCES) libgfxdr_la_HEADERS = xdr-generic.h xdr-nfs3.h msg-nfs3.h glusterfs3.h \ - $(XDRHEADERS) + rpc-pragmas.h $(XDRHEADERS) libgfxdr_ladir = $(includedir)/glusterfs/rpc -BUILT_SOURCES = $(XDRSOURCES) $(XDRHEADERS) +# trick automake into doing BUILT_SOURCES magic +BUILT_SOURCES = $(XDRHEADERS) EXTRA_DIST = $(XDRGENFILES) CLEANFILES = $(XDRSOURCES) $(XDRHEADERS) xdrsrc=$(top_srcdir)/rpc/xdr/src -glusterfs-fops.c: glusterfs-fops.x glusterfs-fops.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` -glusterfs-fops.h: glusterfs-fops.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` +# make's dependency resolution may mean that it decides to run +# rpcgen again (unnecessarily), but as the .c file already exists, +# rpcgen will exit with an error, resulting in a build error. We +# could use a '-' (i.e. -@rpcgen ...) and suffer with noisy warnings +# in the build. Or we do this crufty thing instead. +$(XDRSOURCES): $(XDRHEADERS) + @rpcgen -c -o $(@:.c=.tmp) $(@:.c=.x) && mv $(@:.c=.tmp) $@ + +# d*mn sed in netbsd6 doesn't do -i (inline) +# (why are we still running smoke on netbsd6 and not netbsd7?) +$(XDRHEADERS): $(XDRGENFILES) + @rpcgen -h -o $(@:.h=.tmp) $(@:.h=.x) + @sed -e '/#ifndef/ s/-/_/g' -e '/#define/ s/-/_/g' -e '/#endif/ s/-/_/' \ + $(@:.h=.tmp) > $@ && rm -f $(@:.h=.tmp) + +# link .x files when doing out-of-tree builds +# have to use .PHONY here to force it; all versions of make +# will think the file already exists "here" by virtue of the +# VPATH. And we have to have the .x file in $cwd in order to +# have rpcgen generate "nice" #include directives +# i.e. (nice): +# #include "acl3-xdr.h" +# versus (not nice): +# #include "../../../../foo/src/rpc/xdr/src/acl3-xdr.h" +.PHONY : $(XDRGENFILES) +$(XDRGENFILES): + @if [ ! -e $@ ]; then ln -s $(xdrsrc)/$@ . ; fi; -$(top_srcdir)/libglusterfs/src/glusterfs-fops.h: glusterfs-fops.h - cp $(xdrsrc)/`basename $@` $(top_srcdir)/libglusterfs/src/ - -glusterfs3-xdr.c: glusterfs3-xdr.x glusterfs3-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -glusterfs3-xdr.h: glusterfs3-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -cli1-xdr.c: cli1-xdr.x cli1-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -cli1-xdr.h: cli1-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -nlm4-xdr.c: nlm4-xdr.x nlm4-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -nlm4-xdr.h: nlm4-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -nsm-xdr.c: nsm-xdr.x nsm-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -nsm-xdr.h: nsm-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -rpc-common-xdr.c: rpc-common-xdr.x rpc-common-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -rpc-common-xdr.h: rpc-common-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -glusterd1-xdr.c: glusterd1-xdr.x glusterd1-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -glusterd1-xdr.h: glusterd1-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -acl3-xdr.c: acl3-xdr.x acl3-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -acl3-xdr.h: acl3-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -portmap-xdr.c: portmap-xdr.x portmap-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -portmap-xdr.h: portmap-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -mount3udp.c: mount3udp.x mount3udp.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -mount3udp.h: mount3udp.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` - -changelog-xdr.c: changelog-xdr.x changelog-xdr.h - $(top_srcdir)/build-aux/xdrgen source $(xdrsrc)/`basename ${@:.c=.x}` - -changelog-xdr.h: changelog-xdr.x - $(top_srcdir)/build-aux/xdrgen header $(xdrsrc)/`basename ${@:.h=.x}` diff --git a/rpc/xdr/src/acl3-xdr.x b/rpc/xdr/src/acl3-xdr.x index 39388e07c7e..bd9972c7c53 100644 --- a/rpc/xdr/src/acl3-xdr.x +++ b/rpc/xdr/src/acl3-xdr.x @@ -8,6 +8,10 @@ * cases as published by the Free Software Foundation. */ +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" %#include "xdr-nfs3.h" struct aclentry { diff --git a/rpc/xdr/src/changelog-xdr.x b/rpc/xdr/src/changelog-xdr.x index ba1ebd27836..0bd6564a7f0 100644 --- a/rpc/xdr/src/changelog-xdr.x +++ b/rpc/xdr/src/changelog-xdr.x @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + /* XDR: libgfchangelog -> changelog */ struct changelog_probe_req { diff --git a/rpc/xdr/src/cli1-xdr.x b/rpc/xdr/src/cli1-xdr.x index 80151d48822..55a9b3de19c 100644 --- a/rpc/xdr/src/cli1-xdr.x +++ b/rpc/xdr/src/cli1-xdr.x @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + enum gf_cli_defrag_type { GF_DEFRAG_CMD_START = 1, GF_DEFRAG_CMD_STOP, diff --git a/rpc/xdr/src/glusterd1-xdr.x b/rpc/xdr/src/glusterd1-xdr.x index f5c45c9e45f..1ce57392b5b 100644 --- a/rpc/xdr/src/glusterd1-xdr.x +++ b/rpc/xdr/src/glusterd1-xdr.x @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + enum glusterd_volume_status { GLUSTERD_STATUS_NONE = 0, GLUSTERD_STATUS_STARTED, diff --git a/rpc/xdr/src/glusterfs-fops.x b/rpc/xdr/src/glusterfs-fops.x index 4bfdd4b50ea..3b73499814d 100644 --- a/rpc/xdr/src/glusterfs-fops.x +++ b/rpc/xdr/src/glusterfs-fops.x @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + /* NOTE: add members ONLY at the end (just before _MAXVALUE) */ /* * OTHER NOTE: fop_enum_to_str and fop_enum_to_pri_str (in common-utils.h) also diff --git a/rpc/xdr/src/glusterfs3-xdr.x b/rpc/xdr/src/glusterfs3-xdr.x index 37fda8551b4..d6fb1bee037 100644 --- a/rpc/xdr/src/glusterfs3-xdr.x +++ b/rpc/xdr/src/glusterfs3-xdr.x @@ -1,3 +1,17 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" %#include "rpc-common-xdr.h" %#include "glusterfs-fops.h" diff --git a/rpc/xdr/src/mount3udp.x b/rpc/xdr/src/mount3udp.x index 7fbe3ff523d..4fafaa053f8 100644 --- a/rpc/xdr/src/mount3udp.x +++ b/rpc/xdr/src/mount3udp.x @@ -8,6 +8,11 @@ cases as published by the Free Software Foundation. */ +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + /* This is used by rpcgen to auto generate the rpc stubs. * mount3udp_svc.c is heavily modified though */ diff --git a/rpc/xdr/src/nlm4-xdr.x b/rpc/xdr/src/nlm4-xdr.x index 9c308d80474..47538235171 100644 --- a/rpc/xdr/src/nlm4-xdr.x +++ b/rpc/xdr/src/nlm4-xdr.x @@ -8,6 +8,11 @@ cases as published by the Free Software Foundation. */ +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + /* .x file defined as according to the RFC */ %#include "xdr-common.h" diff --git a/rpc/xdr/src/nsm-xdr.x b/rpc/xdr/src/nsm-xdr.x index 8f97b1aaa1f..81b0b8cdea2 100644 --- a/rpc/xdr/src/nsm-xdr.x +++ b/rpc/xdr/src/nsm-xdr.x @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + /* * This defines the maximum length of the string * identifying the caller. diff --git a/rpc/xdr/src/portmap-xdr.x b/rpc/xdr/src/portmap-xdr.x index 0e694f3359b..66a86a1dae1 100644 --- a/rpc/xdr/src/portmap-xdr.x +++ b/rpc/xdr/src/portmap-xdr.x @@ -1,3 +1,17 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" struct pmap_port_by_brick_req { string brick<>; diff --git a/rpc/xdr/src/rpc-common-xdr.x b/rpc/xdr/src/rpc-common-xdr.x index c2b25705d20..464a7478c73 100644 --- a/rpc/xdr/src/rpc-common-xdr.x +++ b/rpc/xdr/src/rpc-common-xdr.x @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. + * This file is part of GlusterFS. + * + * This file is licensed to you under your choice of the GNU Lesser + * General Public License, version 3 or any later version (LGPLv3 or + * later), or the GNU General Public License, version 2 (GPLv2), in all + * cases as published by the Free Software Foundation. + */ + +#ifdef RPC_XDR +%#include "rpc-pragmas.h" +#endif +%#include "compat.h" + /* This file has definition of few XDR structures which are * not captured in any section specific file */ diff --git a/rpc/xdr/src/rpc-pragmas.h b/rpc/xdr/src/rpc-pragmas.h new file mode 100644 index 00000000000..4c54cf6f1df --- /dev/null +++ b/rpc/xdr/src/rpc-pragmas.h @@ -0,0 +1,28 @@ +/* + Copyright (c) 2016 Red Hat, Inc. + This file is part of GlusterFS. + + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. +*/ + +#ifndef GLUSTERFS_RPC_PRAGMAS_H +#define GLUSTERFS_RPC_PRAGMAS_H + +#if defined(__GNUC__) +#if __GNUC__ >= 4 +#if !defined(__clang__) +#if !defined(__NetBSD__) +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#pragma GCC diagnostic ignored "-Wunused-variable" +#endif +#else +#pragma clang diagnostic ignored "-Wunused-variable" +#pragma clang diagnostic ignored "-Wunused-value" +#endif +#endif +#endif + +#endif /* GLUSTERFS_RPC_PRAGMAS_H */ -- cgit