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.
