meson: do a full usage-based compile check for sysinfo

On Solaris, sys/sysinfo.h is a completely different file and doesn't
resemble the linux file at all. There is also a sysinfo() function, but
it takes a totally different call signature, which asks for:

- the field you wish to receive
- a `char *buf` to copy the data to

and is very useful IFF you want to know, say, the hardware provider. Or,
get *specific* fields from uname(2).

https://docs.oracle.com/cd/E86824_01/html/E54765/sysinfo-2.html

It is surely possible to do this manually via `sysconf(3)` without the
nice API. I can't find anything more direct. Either way, I'm not very
attached to Solaris, so someone who cares can add it. Either way, it's
wrong to assume that sysinfo.h contains what we are looking for.

Check that sysinfo.h defines the struct we actually utilize in
builtins/gc.c, which will correctly fail on systems that don't have it.

Signed-off-by: Eli Schwartz <eschwartz@gentoo.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
next
Eli Schwartz 2025-04-25 01:25:42 -04:00 committed by Junio C Hamano
parent 945090de2d
commit f5e3c6c57d
1 changed files with 4 additions and 4 deletions

View File

@ -1058,10 +1058,6 @@ if compiler.has_header('alloca.h')
libgit_c_args += '-DHAVE_ALLOCA_H'
endif

if compiler.has_header('sys/sysinfo.h')
libgit_c_args += '-DHAVE_SYSINFO'
endif

# Windows has libgen.h and a basename implementation, but we still need our own
# implementation to threat things like drive prefixes specially.
if host_machine.system() == 'windows' or not compiler.has_header('libgen.h')
@ -1267,6 +1263,10 @@ if host_machine.system() != 'windows'
endif
endif

if compiler.has_member('struct sysinfo', 'totalram', prefix: '#include <sys/sysinfo.h>')
libgit_c_args += '-DHAVE_SYSINFO'
endif

if compiler.has_member('struct stat', 'st_mtimespec.tv_nsec', prefix: '#include <sys/stat.h>')
libgit_c_args += '-DUSE_ST_TIMESPEC'
elif not compiler.has_member('struct stat', 'st_mtim.tv_nsec', prefix: '#include <sys/stat.h>')