Richard W.M. Jones
2017-Mar-06 23:46 UTC
[Libguestfs] [PATCH] lib: Prefer tirpc for XDR, and rationlise how we search for alternatives.
glibc in Fedora is currently configured with `--enable-obsolete-rpc', so I guess we can see the way the wind is blowing. (1) This changes our configure script to prefer libtirpc if it is available. If libtirpc is _not_ available then: (a) Headers must be located in <rpc/xdr.h>, or the user must supply the right CFLAGS. (b) XDR functions must be located in one of -lportablexdr, -lrpc, -lxdr, -lnsl or no library at all (ie. -lc), and the user must set LDFLAGS if needed. (2) We no longer add these paths automatically to $(CFLAGS)/$(LIBS). Any part of libguestfs which needs <rpc/*.h> or the xdr_* functions must use $(RPC_CFLAGS)/$(RPC_LIBS) explicitly. (3) Previously Mac OS X had a workaround for the broken 64 bit support in the supplied rpcgen. This workaround "activates" all the time if you use tirpc, so breaking Linux after the above changes. tirpc is supported on OS X, so I think it's just better to use that rather than the broken rpcgen. Thanks: Roy Keene --- common/protocol/Makefile.am | 14 ++------------ daemon/Makefile.am | 4 +++- docs/guestfs-building.pod | 13 +++++++++++-- fish/Makefile.am | 16 ++++------------ generator/XDR.ml | 15 --------------- lib/Makefile.am | 4 +++- m4/guestfs_libraries.m4 | 32 ++++++++++++++++++-------------- 7 files changed, 41 insertions(+), 57 deletions(-) diff --git a/common/protocol/Makefile.am b/common/protocol/Makefile.am index c426f26..eb935f6 100644 --- a/common/protocol/Makefile.am +++ b/common/protocol/Makefile.am @@ -36,25 +36,15 @@ libprotocol_la_SOURCES = guestfs_protocol.c guestfs_protocol.h libprotocol_la_CFLAGS = \ -Wall -Wno-unused -fno-strict-aliasing $(GCC_VISIBILITY_HIDDEN) -if HAVE_RPCGEN -RPCGEN_DEFS -if HAVE_XDR_U_INT64_T -RPCGEN_DEFS += -DHAVE_XDR_U_INT64_T=1 -else -if HAVE_XDR_UINT64_T -RPCGEN_DEFS += -DHAVE_XDR_UINT64_T=1 -endif -endif - guestfs_protocol.c: guestfs_protocol.x rm -f $@-t $@-t2 - $(RPCGEN) $(RPCGEN_DEFS) -c -o $@-t $< + $(RPCGEN) -c -o $@-t $< $(SED) 's,\.\./\(\.\./\)*lib,.,' < $@-t > $@-t2 rm $@-t mv $@-t2 $@ guestfs_protocol.h: guestfs_protocol.x rm -f $@-t - $(RPCGEN) $(RPCGEN_DEFS) -h -o $@-t $< + $(RPCGEN) -h -o $@-t $< mv $@-t $@ endif diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 5c4ae8e..e3ad053 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -186,7 +186,8 @@ guestfsd_LDADD = \ $(LIBINTL) \ $(SERVENT_LIB) \ $(PCRE_LIBS) \ - $(TSK_LIBS) + $(TSK_LIBS) \ + $(RPC_LIBS) guestfsd_CPPFLAGS = \ -I$(top_srcdir)/gnulib/lib \ @@ -199,6 +200,7 @@ guestfsd_CPPFLAGS = \ -I$(top_builddir)/common/protocol guestfsd_CFLAGS = \ $(WARN_CFLAGS) $(WERROR_CFLAGS) \ + $(RPC_CFLAGS) \ $(AUGEAS_CFLAGS) \ $(HIVEX_CFLAGS) \ $(SD_JOURNAL_CFLAGS) \ diff --git a/docs/guestfs-building.pod b/docs/guestfs-building.pod index 53a4d94..11ffe5f 100644 --- a/docs/guestfs-building.pod +++ b/docs/guestfs-building.pod @@ -87,8 +87,17 @@ below. =item glibc -I<Required>. We use various glibc-isms, and glibc also provides XDR -libraries and the C<rpcgen> tool. +I<Required>. We use the custom printf formatters extension of +glibc (see L<guestfs-hacking(1)/DAEMON CUSTOM PRINTF FORMATTERS>). + +=item XDR (tirpc, glibc or other) + +I<Required>. We use the XDR implementation from +C<E<lt>rpc/xdr.hE<gt>>, which may come from glibc, tirpc or another +library. + +The C<rpcgen> tool is optional, except if you want to compile from git +and/or patch libguestfs with new APIs. =item Gcc or Clang diff --git a/fish/Makefile.am b/fish/Makefile.am index 44c6ccd..d689fa8 100644 --- a/fish/Makefile.am +++ b/fish/Makefile.am @@ -133,6 +133,7 @@ guestfish_CPPFLAGS = \ guestfish_CFLAGS = \ $(WARN_CFLAGS) $(WERROR_CFLAGS) \ + $(RPC_CFLAGS) \ $(LIBCONFIG_CFLAGS) \ $(LIBXML2_CFLAGS) @@ -147,32 +148,23 @@ guestfish_LDADD = \ $(LIBREADLINE) \ $(LIBTINFO_LIBS) \ $(LTLIBINTL) \ + $(RPC_LIBS) \ -lm # Make guestfish use the convenience libraries. noinst_LTLIBRARIES = libcmds.la librc_protocol.la guestfish_LDADD += libcmds.la librc_protocol.la ../gnulib/lib/libgnu.la -if HAVE_RPCGEN -RPCGEN_DEFS -if HAVE_XDR_U_INT64_T -RPCGEN_DEFS += -DHAVE_XDR_U_INT64_T=1 -else -if HAVE_XDR_UINT64_T -RPCGEN_DEFS += -DHAVE_XDR_UINT64_T=1 -endif -endif - rc_protocol.c: rc_protocol.x rm -f $@-t $@-t2 - $(RPCGEN) $(RPCGEN_DEFS) -c -o $@-t $< + $(RPCGEN) -c -o $@-t $< $(SED) 's,\.\./\(\.\./\)*fish,.,' < $@-t > $@-t2 rm $@-t mv $@-t2 $@ rc_protocol.h: rc_protocol.x rm -f $@-t - $(RPCGEN) $(RPCGEN_DEFS) -h -o $@-t $< + $(RPCGEN) -h -o $@-t $< mv $@-t $@ endif diff --git a/generator/XDR.ml b/generator/XDR.ml index 575be46..634a4f3 100644 --- a/generator/XDR.ml +++ b/generator/XDR.ml @@ -51,21 +51,6 @@ let generate_xdr () pr "%%#include <config.h>\n"; pr "\n"; - pr "/* This has to be defined to get around a limitation in Mac OS X's rpcgen. */\n"; - pr "#if HAVE_XDR_U_INT64_T\n"; - pr "#define uint64_t u_int64_t\n"; - pr "%%#if HAVE_XDR_UINT64_T\n"; - pr "%%#define xdr_u_int64_t xdr_uint64_t\n"; - pr "%%#define u_int64_t uint64_t\n"; - pr "%%#endif\n"; - pr "#else\n"; - pr "%%#if HAVE_XDR_U_INT64_T\n"; - pr "%%#define xdr_uint64_t xdr_u_int64_t\n"; - pr "%%#define uint64_t u_int64_t\n"; - pr "%%#endif\n"; - pr "#endif\n"; - pr "\n"; - pr "/* This has to be defined to get around a limitation in Sun's rpcgen. */\n"; pr "typedef string guestfs_str<>;\n"; pr "\n"; diff --git a/lib/Makefile.am b/lib/Makefile.am index 774274b..063706f 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -141,6 +141,7 @@ libguestfs_la_CPPFLAGS = \ libguestfs_la_CFLAGS = \ $(WARN_CFLAGS) $(WERROR_CFLAGS) \ + $(RPC_CFLAGS) \ $(GCC_VISIBILITY_HIDDEN) \ $(PCRE_CFLAGS) \ $(LIBVIRT_CFLAGS) \ @@ -164,7 +165,8 @@ libguestfs_la_LIBADD = \ $(LTLIBINTL) \ $(LTLIBTHREAD) \ $(LTLIBICONV) \ - $(SERVENT_LIB) + $(SERVENT_LIB) \ + $(RPC_LIBS) # Force libtool to name the library 'libguestfs.so.0.$(MAX_PROC_NR).0'. # Include the version script to limit which symbols are exported. diff --git a/m4/guestfs_libraries.m4 b/m4/guestfs_libraries.m4 index c265b29..4e58ba0 100644 --- a/m4/guestfs_libraries.m4 +++ b/m4/guestfs_libraries.m4 @@ -171,22 +171,26 @@ AC_CHECK_HEADERS([dlfcn.h],[have_dlfcn=yes],[have_dlfcn=no]) AM_CONDITIONAL([HAVE_LIBDL], [test "x$have_libdl" = "xyes" && test "x$have_dlfcn" = "xyes"]) -dnl Check for rpcgen and XDR library. rpcgen is optional. +dnl Check for an XDR library (required) and rpcgen binary (optional). +PKG_CHECK_MODULES([RPC], [libtirpc], [], [ + dnl If we don't have libtirpc, then we must have <rpc/xdr.h> and + dnl some library to link to in libdir. + RPC_CFLAGS="" + AC_CHECK_HEADER([rpc/xdr.h],[],[ + AC_MSG_ERROR([XDR header files are required])]) + + old_LIBS="$LIBS" + LIBS="" + AC_SEARCH_LIBS([xdrmem_create],[portablexdr rpc xdr nsl]) + RPC_LIBS="$LIBS" + LIBS="$old_LIBS" + + AC_SUBST([RPC_CFLAGS]) + AC_SUBST([RPC_LIBS]) +]) + AC_CHECK_PROG([RPCGEN],[rpcgen],[rpcgen],[no]) AM_CONDITIONAL([HAVE_RPCGEN],[test "x$RPCGEN" != "xno"]) -AC_CHECK_LIB([portablexdr],[xdrmem_create],[],[ - AC_SEARCH_LIBS([xdrmem_create],[rpc xdr nsl]) -]) -AC_SEARCH_LIBS([xdr_u_int64_t],[portablexdr rpc xdr nsl],[ - AC_DEFINE([HAVE_XDR_U_INT64_T],[1],[Define to 1 if xdr_u_int64_t() exists.]) -]) -AC_SEARCH_LIBS([xdr_uint64_t],[portablexdr rpc xdr nsl],[ - AC_DEFINE([HAVE_XDR_UINT64_T],[1],[Define to 1 if xdr_uint64_t() exists.]) -]) -AM_CONDITIONAL([HAVE_XDR_U_INT64_T], - [test "x$ac_cv_search_xdr_u_int64_t" != "xno"]) -AM_CONDITIONAL([HAVE_XDR_UINT64_T], - [test "x$ac_cv_search_xdr_uint64_t" != "xno"]) dnl Check for libselinux (optional). AC_CHECK_HEADERS([selinux/selinux.h]) -- 2.9.3
Seemingly Similar Threads
- [PATCH v2] lib: Prefer tirpc for XDR, and rationalise how we search for alternatives.
- [PATCH v2 1/7] lib: Share common protocol and errnostring libraries with the library and daemon.
- [PATCH] Mac OS X: Fixed combination of running autogen.sh on Linux and building on Mac OS X
- [PATCH 01/12] configure: Add -nographic command line option to qemu.
- [PATCH] build: Reference RPC_CFLAGS where needed