Hello Bruno,

Thank you for the response and sorry for the late reply.

Bruno Haible <[email protected]> writes:

>> When trying to update Gnulib submodule in GnuTLS, I came across this error:
>> 
>>   close.c: In function 'rpl_close':
>>   close.c:71:5: error: implicit declaration of function '_gl_unregister_fd' 
>> [-Wimplicit-function-declaration]
>>      71 |     _gl_unregister_fd (fd);
>>         |     ^~~~~~~~~~~~~~~~~
>>   make[4]: *** [Makefile:3602: libgnu_la-close.lo] Error 1
>> 
>> Looks like REPLACE_FCHDIR is defined as 1, while fchdir implementation
>> is not provided by Gnulib (@GNULIB_FCHDIR@ expands to 0, and fchdir.c is
>> not added to the library sources in the genenerated Makefile).
>> 
>> I haven't managed to minimize the reproducer, but you can easily
>> reproduce the issue with podman or docker:
>> 
>>   podman run -ti 
>> registry.gitlab.com/gnutls/build-images:buildenv-mingw-fedora40
>>   git clone https://gitlab.com/gnutls/gnutls.git
>>   (cd gnutls && git submodule deinit gnulib && git rm -rf gnulib)
>>   git clone https://git.sv.gnu.org/git/gnulib.git
>>   cd gnutls
>>   ./bootstrap --skip-po --gnulib-srcdir=$PWD/../gnulib
>>   ./configure --disable-gcc-warnings --host=x86_64-w64-mingw32 
>> --target=x86_64-w64-mingw32 --with-included-unistring 
>> --disable-full-test-suite --disable-doc
>>   make
>
> I can't really reproduce the issue, because the bootstrapping phase fails:

Sorry, I forgot to mention that the issue is only observed when
cross-compiling to mingw on a specific distro installation, as mentioned
above at the podman command line.

> $ git clone https://gitlab.com/gnutls/gnutls.git
> $ cd gnutls
> $ sed -i -e '/^gtkdocize/d' bootstrap.conf
> $ ./bootstrap --skip-po --no-git --gnulib-srcdir=$GNULIB_SRCDIR 2>&1 | tee 
> log0
> ...
> configure.ac:55: warning: The macro 'AC_PROG_CC_C99' is obsolete.
> configure.ac:55: You should run autoupdate.
> ./lib/autoconf/c.m4:1662: AC_PROG_CC_C99 is expanded from...
> configure.ac:55: the top level
> configure.ac:139: warning: The macro 'AC_HEADER_STDC' is obsolete.
> configure.ac:139: You should run autoupdate.
> ./lib/autoconf/headers.m4:663: AC_HEADER_STDC is expanded from...
> configure.ac:139: the top level
> configure.ac:374: warning: The macro 'AC_TRY_COMPILE' is obsolete.
> configure.ac:374: You should run autoupdate.
> ./lib/autoconf/general.m4:2845: AC_TRY_COMPILE is expanded from...
> m4/hooks.m4:34: LIBGNUTLS_HOOKS is expanded from...
> configure.ac:374: the top level
> configure.ac:57: error: possibly undefined macro: AC_MSG_WARN
>       If this token and others are legitimate, please use m4_pattern_allow.
>       See the Autoconf documentation.
> configure.ac:71: error: possibly undefined macro: AS_IF
> configure.ac:162: error: possibly undefined macro: AC_DEFINE
> configure.ac:496: error: possibly undefined macro: AC_MSG_ERROR
> autoreconf: error: /gnu/bin/autoconf failed with exit status: 1
> ./bootstrap: autoreconf failed
>
> Indeed, you can drop AC_PROG_CC_C99 and AC_HEADER_STDC, since you have
> AC_PROG_CC in configure.ac (assuming autoconf >= 2.70).

Interesting that those errors are not seen with autoconf 2.71 on Fedora:
https://gitlab.com/gnutls/gnutls/-/jobs/8814166667#L3750

I've anyway updated the configure.ac as suggested and also removed the
AC_TRY_COMPILE, which turned to be unnecessary if we check
ac_prog_cc_stdc.

> Anyway, let me analyze it without reproducing.
>
> The problem is obviously an interaction between the 'close' and the 'fchdir'
> modules.
>
> In this package, you have 3 gnulib-tool invocations, under one configure.ac:
>
> 1. m4/gnulib-cache.m4
>    'close' included, 'fchdir' not included.
>
> 2. lib/unistring/m4/gnulib-cache.m4
>    Neither of the two included.
>
> 3. src/gl/m4/gnulib-cache.m4
>    'close' included, 'fchdir' included (as a dependency of
>    chdir-long, fdopendir, fstatat, openat, save-cwd).
>
> The problem is that the gnulib code from #3 creates file descriptors that
> refer to directories (this is needed on native Windows for fstatat, openat,
> etc.) and thus the library code (#1) supposedly needs support for such
> file descriptors.
>
> Can a file descriptor be passed to the library code, that comes from src/
> and thus can refer to a directory? If yes, then add the module 'fchdir'
> to the library (but careful about LGPLv2+!)
> If you can guarantee that this is not the case, the fix/workaround is to
> separate these two parts of the package a bit more. Two ways come to mind:
>
>   - Instead of one configure.ac, use two. One for the library, one for the
>     rest. So that each has its own config.h, and the '#define REPLACE_FCHDIR 
> 1'
>     in the src config.h has no effect on the library.
>
>   - Keep a single configure.ac, but at the end of config.h add, via 
> AH_VERBATIM,
>     a definition like this:
>
>       #if BUILDING_THE_LIBRARY
>       # undef /**/ REPLACE_FCHDIR
>       #endif

Thank you for the explanation and the suggestion.  I took the second
approach in:
https://gitlab.com/gnutls/gnutls/-/merge_requests/1921
and it seems to work.

>> After bisecting, the first commit that introduced the issue seems to be:
>> 
>>   commit f59ff6beeb3e5f437a4c847b9e1a785b30363e5b
>>   Author: Bruno Haible <[email protected]>
>>   Date:   Mon Aug 12 16:15:50 2024 +0200
>> 
>>       fdutimensat, utimensat tests: Fix test failures on Cygwin.
>> 
>> Reverting this change fixes the issue locally.
>
> This bisect result is not helpful in understanding the situation.

I suspect the change has introduced some indirect dependency on fchdir
through the test modules.

Regards,
-- 
Daiki Ueno

Reply via email to