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 -- hundred-and-one symptoms of being an internet addict: 238. You think faxes are old-fashioned. /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// -- -- 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/20211024212109.74B48C80053%40moolenaar.net.
