On 08/03/16 02:18, Mike Frysinger wrote:
lib/mountlist.c assumes that sys/types.h includes sys/sysmacros.h directly in order to provide makedev(). when it doesn't, things fall apart like: mountlist.c: In function 'read_file_system_list': mountlist.c:532:26: warning: implicit declaration of function 'makedev' [-Wimplicit-function-declaration] me->me_dev = makedev (devmaj, devmin); ... .../libgnulib.a(mountlist.o): In function `read_file_system_list': .../mountlist.c:532: undefined reference to `makedev' collect2: error: ld returned 1 exit statusconfigure output looks like: checking sys/mkdev.h usability... no checking sys/mkdev.h presence... no checking for sys/mkdev.h... no checking whether sys/types.h defines makedev... no checking for sys/mkdev.h... (cached) no checking sys/sysmacros.h usability... yes checking sys/sysmacros.h presence... yes checking for sys/sysmacros.h... yes autoconf provides a AC_HEADER_MAJOR helper specifically for this: If sys/types.h does not define major, minor, and makedev, but sys/mkdev.h does, define MAJOR_IN_MKDEV; otherwise, if sys/sysmacros.h does, define MAJOR_IN_SYSMACROS. lib/ptsname_r.c could probably do with a bit of cleanup in this area too. -mike
This would be for BSD userspace on Linux kernel I suppose. Yes I noted previously that if ever porting this part of read_file_system_list() that it would be worth creating a makedev gnulib module to wrap all these differences. The basis would be this from coreutils: /* Since major is a function on SVR4, we can't use 'ifndef major'. */ #if MAJOR_IN_MKDEV # include <sys/mkdev.h> # define HAVE_MAJOR #endif #if MAJOR_IN_SYSMACROS # include <sys/sysmacros.h> # define HAVE_MAJOR #endif #ifdef major /* Might be defined in sys/types.h. */ # define HAVE_MAJOR #endif #ifndef HAVE_MAJOR # define major(dev) (((dev) >> 8) & 0xff) # define minor(dev) ((dev) & 0xff) # define makedev(maj, min) (((maj) << 8) | (min)) #endif #undef HAVE_MAJOR #if ! defined makedev && defined mkdev # define makedev(maj, min) mkdev (maj, min) #endif cheers, Pádraig
