A gettext bug report <https://savannah.gnu.org/bugs/?65958>
found that GNU gettext, when compiled on mingw with builddir = srcdir,
produces a compilation error due to the symbol
'close_used_without_requesting_gnulib_module_close'.

What happens, is that:

  * Under the scope of the same configure.ac, there are two gnulib-tool
    invocations:
      - one that produces gnulib-lib/unistd.h, with module 'close'
        included and thus @GNULIB_CLOSE@ expanding to 1,
      - one that produces libgrep/unistd.h, with module 'close' excluded
        and thus @GNULIB_CLOSE@ expanding to 0.
    This is supported since April 2021.

  * The -I options mention directory libgrep before directory gnulib-lib.
    Thus, in the #include_next chain, both unistd.h files are included,
    and the outermost one is libgrep/unistd.h.

  * Thus, the prevailing definition of the symbol 'close' is the one
    from libgrep/unistd.h, namely
      #define close close_used_without_requesting_gnulib_module_close

But it is wrong to assume that if gnulib module 'close' is not used
in *this* gnulib-tool invocation, it is not used in other gnulib-tool
invocations either.

The fix is therefore to avoid doing
  #define close close_used_without_requesting_gnulib_module_close
if at least one of the gnulib-tool invocations used module 'close'.

The patch below does this. It thus avoids the error, if the -I options
are so that multiple unistd.h files are included. It _may_ omit a
safeguard if there is only one -I option; but a missed safeguard is
better than a false error.


2024-07-24  Bruno Haible  <br...@clisp.org>

        Avoid false error close_used_without_requesting_gnulib_module_close.
        Reported by Frédéric at <https://savannah.gnu.org/bugs/?65958>.
        * modules/close (configure.ac): Invoke gl_MODULE_INDICATOR.
        * lib/unistd.in.h (close): Don't define to
        close_used_without_requesting_gnulib_module_close if the gnulib module
        'close' is in use under the same configure.ac.

diff --git a/lib/unistd.in.h b/lib/unistd.in.h
index e01629af25..688988e9e2 100644
--- a/lib/unistd.in.h
+++ b/lib/unistd.in.h
@@ -412,8 +412,10 @@ _GL_CXXALIAS_SYS (close, int, (int fd));
 # endif
 _GL_CXXALIASWARN (close);
 #elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
-# undef close
-# define close close_used_without_requesting_gnulib_module_close
+# if !GNULIB_CLOSE
+#  undef close
+#  define close close_used_without_requesting_gnulib_module_close
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef close
 /* Assume close is always declared.  */
diff --git a/modules/close b/modules/close
index 926ea85501..fbb54063c6 100644
--- a/modules/close
+++ b/modules/close
@@ -14,6 +14,7 @@ configure.ac:
 gl_FUNC_CLOSE
 gl_CONDITIONAL([GL_COND_OBJ_CLOSE], [test $REPLACE_CLOSE = 1])
 gl_UNISTD_MODULE_INDICATOR([close])
+gl_MODULE_INDICATOR([close])
 
 Makefile.am:
 if GL_COND_OBJ_CLOSE




Reply via email to