Deal with backported bool type for RHEL5's 2.6.18 kernel
authorIan Abbott <abbotti@mev.co.uk>
Mon, 5 Sep 2011 12:17:20 +0000 (13:17 +0100)
committerIan Abbott <abbotti@mev.co.uk>
Mon, 5 Sep 2011 12:17:20 +0000 (13:17 +0100)
RHEL5's 2.6.18 kernel includes a change backported from 2.6.19 that
declares a generic 'bool' type in <linux/types.h> and declares the
'false' and 'true' enum values in <linux/stddef.h>.  Comedi's
compatibility header for <linux/stddef.h> declared the 'false' and
'true' enum values for any kernel version below 2.6.19.  This resulted
in comedi failing to build due to redeclaration errors.

Add an autoconf test to see if the generic 'bool' type is defined in
<linux/types.h> and if so define the macro
CONFIG_COMEDI_HAVE_GENERIC_BOOL_TYPE in <config.h>.  Conditionally
declare the 'bool' type in the <linux/types.h> compatibility header and
change the condition for declaring the 'false' and 'true' enum values in
the <linux/stddef.h> compatibility header so they are only declared if
the CONFIG_COMEDI_HAVE_GENERIC_BOOL_TYPE macro is undefined.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
configure.ac
include/linux/stddef.h
include/linux/types.h
m4/as-linux.m4

index fce7325cb0f4fa98ce843611a5dec5725e286a86..85a9f77030c5192735b8f347af9bb8fa05018807 100644 (file)
@@ -158,6 +158,12 @@ if test "$HAVE_CS_TYPES_H" = "yes" ; then
        AC_DEFINE([CONFIG_COMEDI_HAVE_CS_H],[true],[Define if Linux kernel source has pcmcia/cs.h (removed in 2.6.37)])
 fi
 
+COMEDI_CHECK_HAVE_GENERIC_BOOL_TYPE([$LINUX_SRC_DIR],
+      [HAVE_GENERIC_BOOL_TYPE="yes"], [HAVE_GENERIC_BOOL_TYPE="no"])
+if test "$HAVE_GENERIC_BOOL_TYPE" = "yes" ; then
+       AC_DEFINE([CONFIG_COMEDI_HAVE_GENERIC_BOOL_TYPE],[true],[Define if Linux kernel source has generic 'bool' type in linux/types.h])
+fi
+
 AS_CHECK_LINUX_CONFIG_OPTION([CONFIG_USB],[HAVE_USB="yes"],[HAVE_USB="yes"],[HAVE_USB="no"])
 AM_CONDITIONAL([CONFIG_USB],[test "$HAVE_USB" = "yes"])
 AC_ARG_ENABLE([usb],[  --disable-usb           Disable support for USB devices],
index 747ef183785c08f6c8aa39e963bc678478ef14d1..6a1840a7dc6b51a5ada91468a2403e6836b09d86 100644 (file)
@@ -21,7 +21,7 @@
 
 #include <linux/version.h>
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
+#ifndef CONFIG_COMEDI_HAVE_GENERIC_BOOL_TYPE
 typedef enum {
        false,
        true
index 98c012dc2c8745221710a8d51f8fe27d0ee211d9..0afbf71da4ad32288131285d389b66872760ab79 100644 (file)
@@ -27,6 +27,10 @@ typedef unsigned long resource_size_t;
 /* resource_size_t is either u32 or u64, depending on CONFIG_RESOURCES_64BIT */
 #endif
 
+#ifndef CONFIG_COMEDI_HAVE_GENERIC_BOOL_TYPE
+typedef _Bool bool;
+#endif
+
 #include_next <linux/types.h>
 
 #endif
index 2e2ee9d828aed346befde45bbdb5dfe8362ae621..93107ea92627858d5d986ed08aa9f04e57fc9f5d 100644 (file)
@@ -953,3 +953,21 @@ AC_DEFUN([COMEDI_CHECK_HAVE_LINUX_SEMAPHORE_H],
                $3
        fi
 ])
+
+# COMEDI_CHECK_HAVE_GENERIC_BOOL_TYPE([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# -------------------------------------------------------------
+# Check if kernel is new enough to have generic 'bool' type in <linux/types.h>
+# and 'false' and 'true' enum constants in <linux/stddef.h>.  This was added
+# in vanilla 2.6.19, but backported to RHEL5 2.6.18.
+AC_DEFUN([COMEDI_CHECK_HAVE_GENERIC_BOOL_TYPE],
+[
+       AC_MSG_CHECKING([$1 for 'bool' in include/linux/types.h])
+       if grep -q 'bool;' "$1/include/linux/types.h" 2>/dev/null; then
+               AC_MSG_RESULT([yes])
+               $2
+       else
+               AC_MSG_RESULT([no])
+               $3
+       fi
+])