On 2021-10-24, Bram Moolenaar wrote:
> On 2021-10-18, Gary Johnson wrote:
> 
> [...]
> 
> > > I read auto/configure more carefully to understand it better.  Then
> > > I copied conftest.c for that test to another directory and
> > > successfully compiled it there with
> > >
> > >     #define ST_MTIM_NSEC st_mtim.tv_nsec
> > >
> > > So I should be able to build fileio.c with ST_MTIM_NSEC defined.
> > > I'm thinking now that the problem is in fileio.c or vim.h or in some
> > > other configure test.
> > >
> > > I'm out of time this morning, but I'll look at fileio.c, vim.h and
> > > auto/configure later and try to find what stat_T really is.
> > 
> > I found cause of the problem.
> > 
> > The problem is that on this system, an i686 running Ubuntu 10.04.4,
> > vim's stat_T is configured to not include "struct timespec st_mtim",
> > but that struct is required by patch 8.2.3510, so the build fails.
> > 
> > On this system, stat_T is "struct stat", which is defined in
> > /usr/include/bits/stat.h.  That struct includes "struct timespec
> > st_mtime" only if __USE_MISC is defined.  __USE_MISC is defined in
> > /usr/include/features.h if either _BSD_SOURCE or _SVID_SOURCE is
> > defined.  Those two macros are defined by default by other rules in
> > /usr/include/features.h which is why Vim's configure script decides
> > that "struct stat" contains "struct timespec st_mtime" and sets
> > ST_MTIM_NSEC accordingly.
> > 
> > The cause of the problem is here in Vim's vim.h:
> > 
> >     39 # if (defined(__linux__) && !defined(__ANDROID__)) || 
> > defined(__CYGWIN__)
> >     40 // Needed for strptime().  Needs to be done early, since header 
> > files can
> >     41 // include other header files and end up including time.h, where the 
> > se symbols
> >     42 // matter for Vim.
> >     43 // 700 is needed for mkdtemp().
> >     44 #  ifndef _XOPEN_SOURCE
> >     45 #   define _XOPEN_SOURCE    700
> >     46 #  endif
> >     47 # endif
> > 
> > Because /usr/include/features.h sees that _XOPEN_SOURCE is defined,
> > it defines neither _BSD_SOURCE nor _SVID_SOURCE and consequently
> > doesn't define __USE_MISC, so "struct stat" does not contain "struct
> > timespec st_mtime" and the build of fileio.c fails.
> > 
> > On my Ubuntu 20.04.3 x86_64 system, Vim builds fine because stat_T
> > is "struct stat64", defined in
> > /usr/include/x86_64-linux-gnu/bits/stat.h, and includes "struct
> > timespec st_mtime" only if __USE_XOPEN2K8 is defined, which it is
> > when vim is built as well as when configure is run.
> > 
> > I don't understand all the ins and outs of defining various
> > _*_SOURCE macros, but this problem could be fixed by having vim.h
> > define _BSD_SOURCE and _SVID_SOURCE when it defines _XOPEN_SOURCE,
> > e.g., by changing the above snippet to:
> > 
> >     39 # if (defined(__linux__) && !defined(__ANDROID__)) || defined(__CYGW=
> > IN__)
> >     40 // Needed for strptime().  Needs to be done early, since header file=
> > s can
> >     41 // include other header files and end up including time.h, where the=
> > se symbols
> >     42 // matter for Vim.
> >     43 // 700 is needed for mkdtemp().
> >     44 #  ifndef _XOPEN_SOURCE
> >     45 #   define _XOPEN_SOURCE    700
> >     46 #   define _BSD_SOURCE        1
> >     47 #   define _SVID_SOURCE       1
> >     47 #   define _DEFAULT_SOURCE    1
> >     48 #  endif
> >     47 # endif
> > 
> > The define of _DEFAULT_SOURCE is needed to avoid warnings from the
> > compiler that _BSD_SOURCE and _SVID_SOURCE are now deprecated.
> > 
> > I realize that only one of _BSD_SOURCE and _SVID_SOURCE need to be
> > defined, but I didn't see a reason to choose one over the other, so
> > I defined both.
> 
> Hmm, complicated.  I don't think the extra defines would be a problem,
> normally _DEFAULT_SOURCE would be defined already.  We can add #ifndef
> to avoid any warnings when they are already defined:
> 
> #  ifndef _XOPEN_SOURCE
> #   define _XOPEN_SOURCE    700
> 
> // On old systems defining _XOPEN_SOURCE causes _BSD_SOURCE, _SVID_SOURCE
> // and/or _DEFAULT_SOURCE not to be defined, so do that here.
> #   ifndef _BSD_SOURCE
> #    define _BSD_SOURCE 1
> #   endif
> #   ifndef _SVID_SOURCE
> #    define _SVID_SOURCE 1
> #   endif
> #   ifndef _DEFAULT_SOURCE
> #    define _DEFAULT_SOURCE 1
> #   endif
> #  endif

That works on both my old and new systems.

Regards,
Gary

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20211025013600.GB18213%40phoenix.

Raspunde prin e-mail lui