Thanks for looking into this, Bruno. I altered the patch to reflect your comments, with the following further ideas:
On 03/19/2011 06:49 AM, Bruno Haible wrote: > the 'Include' statement of the socklen module should be changed ... to > > #include <sys/types.h> > #if HAVE_SYS_SOCKET_H > #include <sys/socket.h> > #endif Given the changes you proposed in the other part of your comment, I expect it should be changed to the following instead. That reflects what the revised test does. #include <sys/types.h> #if HAVE_SYS_SOCKET_H # include <sys/socket.h> #elif HAVE_WS2TCPIP_H # include <ws2tcpip.h> #endif > Also a test that defines HAVE_SYS_SOCKET_H needs to be added, then. That shouldn't be needed, since the test is already present in the proposed patch: gl_TYPE_SOCKLEN_T requires gl_PREREQ_TYPE_SOCKLEN_T, which invokes AC_CHECK_HEADERS_ONCE([sys/socket.h]), which arranges to #define HAVE_SYS_SOCKET_H. Here's the revised proposed patch. diff --git a/ChangeLog b/ChangeLog index 1b42d3c..15ec20b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2011-03-19 Paul Eggert <[email protected]> + + socklen: do not depend on sys_socket + While trying to modify Emacs to use gnulib's socklen module, + I discovered a circular dependency: socklen depends on sys_socket + and vice versa. Emacs can use socklen, but it does not need + sys_socket because it has its own substitute for sys/socket.h. + This patch incorporates improvements suggested by Bruno Haible + <http://lists.gnu.org/archive/html/bug-gnulib/2011-03/msg00211.html>. + * m4/socklen.m4 (gl_PREREQ_TYPE_SOCKLEN_T): New macro, taken from + parts of gl_PREREQ_SYS_H_SOCKET. + (gl_TYPE_SOCKLEN_T): Require it instead of requiring + gl_PREREQ_SYS_H_SOCKET. + * m4/sys_socket_h.m4 (gl_PREREQ_SYS_H_SOCKET): Require + gl_PREREQ_TYPE_SOCKLEN_T instead of doing its work ourselves. + * modules/socklen (Depends-on): Do not depend on sys_socket. + (Include): Adjust to match the test used in gl_PREREQ_TYPE_SOCKLEN_T. + 2011-03-19 Jim Meyering <[email protected]> maint.mk: fix po-file syntax-check rule diff --git a/m4/socklen.m4 b/m4/socklen.m4 index 95d4804..be012f5 100644 --- a/m4/socklen.m4 +++ b/m4/socklen.m4 @@ -1,4 +1,4 @@ -# socklen.m4 serial 9 +# socklen.m4 serial 10 dnl Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -13,11 +13,10 @@ dnl HP-UX 10.20, IRIX 6.5, OSF/1 4.0, Interix 3.5, BeOS. dnl So we have to test to find something that will work. dnl On mingw32, socklen_t is in ws2tcpip.h ('int'), so we try to find -dnl it there first. That file is included by gnulib's sys_socket.in.h, which -dnl all users of this module should include. Cygwin must not include -dnl ws2tcpip.h. +dnl it there too. Users of this module should use the same include +dnl pattern that this test does. AC_DEFUN([gl_TYPE_SOCKLEN_T], - [AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl + [AC_REQUIRE([gl_PREREQ_TYPE_SOCKLEN_T])dnl AC_CHECK_TYPE([socklen_t], , [AC_MSG_CHECKING([for socklen_t equivalent]) AC_CACHE_VAL([gl_cv_socklen_t_equiv], @@ -51,3 +50,13 @@ AC_DEFUN([gl_TYPE_SOCKLEN_T], #elif HAVE_WS2TCPIP_H # include <ws2tcpip.h> #endif])]) + +AC_DEFUN([gl_PREREQ_TYPE_SOCKLEN_T], + [AC_CHECK_HEADERS_ONCE([sys/socket.h]) + if test $ac_cv_header_sys_socket_h = no; then + dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make + dnl the check for those headers unconditional; yet cygwin reports + dnl that the headers are present but cannot be compiled (since on + dnl cygwin, all socket information should come from sys/socket.h). + AC_CHECK_HEADERS([ws2tcpip.h]) + fi]) diff --git a/m4/sys_socket_h.m4 b/m4/sys_socket_h.m4 index 12dc05d..0ba6109 100644 --- a/m4/sys_socket_h.m4 +++ b/m4/sys_socket_h.m4 @@ -1,4 +1,4 @@ -# sys_socket_h.m4 serial 21 +# sys_socket_h.m4 serial 22 dnl Copyright (C) 2005-2011 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -101,17 +101,12 @@ AC_DEFUN([gl_HEADER_SYS_SOCKET], AC_DEFUN([gl_PREREQ_SYS_H_SOCKET], [ dnl Check prerequisites of the <sys/socket.h> replacement. - gl_CHECK_NEXT_HEADERS([sys/socket.h]) + AC_REQUIRE([gl_PREREQ_TYPE_SOCKLEN_T]) if test $ac_cv_header_sys_socket_h = yes; then HAVE_SYS_SOCKET_H=1 HAVE_WS2TCPIP_H=0 else HAVE_SYS_SOCKET_H=0 - dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make - dnl the check for those headers unconditional; yet cygwin reports - dnl that the headers are present but cannot be compiled (since on - dnl cygwin, all socket information should come from sys/socket.h). - AC_CHECK_HEADERS([ws2tcpip.h]) if test $ac_cv_header_ws2tcpip_h = yes; then HAVE_WS2TCPIP_H=1 else diff --git a/modules/socklen b/modules/socklen index 4986f10..556336b 100644 --- a/modules/socklen +++ b/modules/socklen @@ -5,7 +5,6 @@ Files: m4/socklen.m4 Depends-on: -sys_socket configure.ac: gl_TYPE_SOCKLEN_T @@ -13,8 +12,12 @@ gl_TYPE_SOCKLEN_T Makefile.am: Include: -<sys/types.h> -<sys/socket.h> +#include <sys/types.h> +#if HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#elif HAVE_WS2TCPIP_H +# include <ws2tcpip.h> +#endif License: unlimited
