On 2021-10-18, Gary Johnson wrote:
> On 2021-10-18, Bram Moolenaar wrote:
> > Gary Johnson wrote:
> >
> > > > > On 2021-10-17, Dominique Pell=C3=A9 wrote:
> > > > > > Gary Johnson <[email protected]> wrote:
> > > > > >
> > > > > > > I have an older Ubuntu 10.04.4 system that I cannot upgrade for
> > > > > > > various reasons. It's what I can run on that hardware. A recent
> > > > > > > update of Vim failed to build. A git bisect narrowed it down to
> > > > > > > the
> > > > > > > 8.2.3510 commit. Here is the gcc command that failed.
> > > > > > >
> > > > > > >
> > > > > > > gcc -std=gnu99 -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK
> > > > > > > -pthread -D_REENTRANT -I/usr/include/gtk-2.0
> > > > > > > -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0
> > > > > > > -I/usr/include/cairo -I/usr/include/pango-1.0
> > > > > > > -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0
> > > > > > > -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1
> > > > > > > -I/usr/include/freetype2 -I/usr/include/directfb
> > > > > > > -I/usr/include/libpng12 -g3 -Wno-deprecated-declarations
> > > > > > > -DFEAT_BROWSE -DFEAT_CONCEAL -DFEAT_MOUSE_SGR -DFEAT_VARTABS
> > > > > > > -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -o
> > > > > > > objects/fileio.o fileio.c
> > > > > > > In file included from vim.h:151,
> > > > > > > from fileio.c:14:
> > > > > > > feature.h:656:1: warning: "FEAT_BROWSE" redefined
> > > > > > > <command-line>: warning: this is the location of the previous
> > > > > > > definition
> > > > > > > fileio.c: In function ‘time_differs’:
> > > > > > > fileio.c:3130: error: ‘stat_T’ has no member named ‘st_mtim’
> > > > > > > fileio.c: In function ‘buf_store_time’:
> > > > > > > fileio.c:4483: error: ‘stat_T’ has no member named ‘st_mtim’
> > > > > > > fileio.c: In function ‘vim_opentempdir’:
> > > > > > > fileio.c:5033: warning: implicit declaration of function ‘dirfd’
> > > > > > > make[2]: *** [objects/fileio.o] Error 1
> > > > > > > make[2]: Leaving directory
> > > > > > > `/mnt/home-common/gary/src/vim-new/vim/src'
> > > > > > > make[1]: *** [reconfig] Error 2
> > > > > > > make[1]: Leaving directory
> > > > > > > `/mnt/home-common/gary/src/vim-new/vim/src'
> > > > > > > make: *** [first] Error 2
> > > > > > >
> > > > > > >
> > > > > > > gcc is (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3.
> > > > > >
> > > > > > That compilation error (st_mtim -> st_mtime) is meant to be fixed
> > > > > > by Vim 8.2.215. Consider posting the compilation error (if any) with
> > > > > > the latest vim 8.2.3531.
> > > > >
> > > > > That's when I first noticed it, is when I updated today to 8.2.3531.
> > > > > Here's the error message from that build.
> > > > >
> > > > >
> > > > > gcc -std=gnu99 -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK
> > > > > -pthread -D_REENTRANT -I/usr/include/gtk-2.0
> > > > > -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0
> > > > > -I/usr/include/cairo -I/usr/include/pango-1.0
> > > > > -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0
> > > > > -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1
> > > > > -I/usr/include/freetype2 -I/usr/include/directfb
> > > > > -I/usr/include/libpng12 -g3 -Wno-deprecated-declarations
> > > > > -DFEAT_BROWSE -DFEAT_CONCEAL -DFEAT_MOUSE_SGR -DFEAT_VARTABS
> > > > > -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -o
> > > > > objects/getchar.o getchar.c
> > > > > In file included from vim.h:151,
> > > > > from getchar.c:19:
> > > > > feature.h:656:1: warning: "FEAT_BROWSE" redefined
> > > > > <command-line>: warning: this is the location of the previous
> > > > > definition
> > > > > fileio.c: In function ‘time_differs’:
> > > > > fileio.c:3126: error: ‘stat_T’ has no member named ‘st_mtim’
> > > > > fileio.c: In function ‘buf_store_time’:
> > > > > fileio.c:4484: error: ‘stat_T’ has no member named ‘st_mtim’
> > > > > fileio.c: In function ‘vim_opentempdir’:
> > > > > fileio.c:5034: warning: implicit declaration of function ‘dirfd’
> > > > > make[2]: *** [objects/fileio.o] Error 1
> > > > > make[2]: *** Waiting for unfinished jobs....
> > > > > make[2]: Leaving directory `/mnt/home-common/gary/src/vim-new/vim/src'
> > > > > make[1]: *** [reconfig] Error 2
> > > > > make[1]: Leaving directory `/mnt/home-common/gary/src/vim-new/vim/src'
> > > > > make: *** [first] Error 2
> > > >
> > > > This looks like configure defined ST_MTIM_NSEC to st_mtim.tv_nsec even
> > > > though it does not work. Please check the output of configure, should
> > > > be in src/auto/config.log
> > >
> > > I assume that this is the part of config.log you're interested in.
> > >
> > >
> > > configure:13152: checking for nanoseconds field of struct stat
> > > configure:13180: gcc -std=gnu99 -c -g3 -Wno-deprecated-declarations
> > > -DFEAT_BROWSE -DFEAT_CONCEAL -DFEAT_MOUSE_SGR -DFEAT_VARTABS
> > > -DST_MTIM_NSEC=st_mtim.tv_nsec conftest.c >&5
> > > configure:13180: $? = 0
> > > configure:13188: result: st_mtim.tv_nsec
> > >
> > >
> > > I can work around the problem by commenting-out this #define in
> > > vim/src/auto/config.h:
> > >
> > > /* Define to nanoseconds field of struct stat */
> > > #define ST_MTIM_NSEC st_mtim.tv_nsec
> > >
> > > but I haven't worked with configure recently and don't know
> > > immediately how to fix the root problem.
> >
> > Find this line in auto/configure:
> >
> > for ac_val in st_mtim.tv_nsec st_mtim._tv_nsec st_mtim.st__tim.tv_nsec
> > st_mtime_n st_mtimespec.tv_nsec; do
> >
> > Try changing the order of the entries. I guess it might work better if
> > st_mtimespec.tv_nsec comes first.
> >
> > Still, it is weird that the configure test would find st_mtim.tv_nsec
> > but it is not found when compiling. Perhaps the order of include files
> > matters.
>
> 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 these
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(__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 these
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.
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/20211024204631.GA18213%40phoenix.