From cd2209b75e137ca10fa90f73722f0cd3457e80aa Mon Sep 17 00:00:00 2001 From: Olaf Faaland Date: Fri, 31 Mar 2017 09:32:00 -0700 Subject: [PATCH] glibc 2.5 compat: use correct header for makedev() et al. In glibc 2.5, makedev(), major(), and minor() are defined in sys/sysmacros.h. They are also defined in types.h for backward compatability, but using these definitions triggers a compile warning. This breaks the ZFS build, as it builds with -Werror. autoconf email threads indicate these macros may be defined in sys/mkdev.h in some cases. This commit adds configure checks to detect where makedev() is defined: sys/sysmacros.h sys/mkdev.h It assumes major() and minor() are defined in the same place. The libspl types.h then includes sys/sysmacros.h (preferred) or sys/mkdev.h (2nd choice) if one of those defines makedev(). This is done before including the system types.h. An alternative would be to remove uses of major, minor, and makedev, instead comparing the st_dev returned from stat64. These configure checks would then be unnecessary. This change revealed that __NORETURN was being defined unnecessarily in libspl/include/sys/sysmacros.h. That definition is removed. The files in which __NORETURN are used all include types.h, and so all will get the definition provided by feature_tests.h Reviewed-by: Brian Behlendorf Signed-off-by: Olaf Faaland Closes #5945 --- config/user-makedev.m4 | 39 ++++++++++++++++++++++++++++++ config/user.m4 | 2 ++ lib/libspl/include/sys/sysmacros.h | 1 - lib/libspl/include/sys/types.h | 6 +++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 config/user-makedev.m4 diff --git a/config/user-makedev.m4 b/config/user-makedev.m4 new file mode 100644 index 0000000000..4383681a8f --- /dev/null +++ b/config/user-makedev.m4 @@ -0,0 +1,39 @@ +dnl # +dnl # glibc 2.25 +dnl # +AC_DEFUN([ZFS_AC_CONFIG_USER_MAKEDEV_IN_SYSMACROS], [ + AC_MSG_CHECKING([makedev() is declared in sys/sysmacros.h]) + AC_TRY_COMPILE( + [ + #include + ],[ + int k; + k = makedev(0,0); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_MAKEDEV_IN_SYSMACROS, 1, + [makedev() is declared in sys/sysmacros.h]) + ],[ + AC_MSG_RESULT(no) + ]) +]) + +dnl # +dnl # glibc X < Y < 2.25 +dnl # +AC_DEFUN([ZFS_AC_CONFIG_USER_MAKEDEV_IN_MKDEV], [ + AC_MSG_CHECKING([makedev() is declared in sys/mkdev.h]) + AC_TRY_COMPILE( + [ + #include + ],[ + int k; + k = makedev(0,0); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_MAKEDEV_IN_MKDEV, 1, + [makedev() is declared in sys/mkdev.h]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/user.m4 b/config/user.m4 index 7f79420825..e1c1408bec 100644 --- a/config/user.m4 +++ b/config/user.m4 @@ -13,6 +13,8 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [ ZFS_AC_CONFIG_USER_LIBBLKID ZFS_AC_CONFIG_USER_FRAME_LARGER_THAN ZFS_AC_CONFIG_USER_RUNSTATEDIR + ZFS_AC_CONFIG_USER_MAKEDEV_IN_SYSMACROS + ZFS_AC_CONFIG_USER_MAKEDEV_IN_MKDEV dnl # dnl # Checks for library functions AC_CHECK_FUNCS([mlockall]) diff --git a/lib/libspl/include/sys/sysmacros.h b/lib/libspl/include/sys/sysmacros.h index 5d10657be5..1e4d823249 100644 --- a/lib/libspl/include/sys/sysmacros.h +++ b/lib/libspl/include/sys/sysmacros.h @@ -42,7 +42,6 @@ #define makedevice(maj, min) makedev(maj, min) #define _sysconf(a) sysconf(a) -#define __NORETURN __attribute__((noreturn)) /* * Compatibility macros/typedefs needed for Solaris -> Linux port diff --git a/lib/libspl/include/sys/types.h b/lib/libspl/include/sys/types.h index 25d56bed5d..aa0da2274d 100644 --- a/lib/libspl/include/sys/types.h +++ b/lib/libspl/include/sys/types.h @@ -27,6 +27,12 @@ #ifndef _LIBSPL_SYS_TYPES_H #define _LIBSPL_SYS_TYPES_H +#if defined(HAVE_MAKEDEV_IN_SYSMACROS) +#include +#elif defined(HAVE_MAKEDEV_IN_MKDEV) +#include +#endif + #include #include #include_next