+#include <linux/kernel.h>
+#include <linux/module.h>
+$1
+int
+main (void)
+{
+dnl Do *not* indent the following line: there may be CPP directives.
+dnl Don't move the `;' right after for the same reason.
+$2
+ ;
+ return 0;
+};
+MODULE_LICENSE("GPL");])
+
+#
+# LB_LINUX_COMPILE_IFELSE
+#
+# like AC_COMPILE_IFELSE
+#
+# $1 - AC_LANG_SOURCE()
+# $2 - make target
+# $3 - check command
+# $4 - do 'yes'
+# $5 - do 'no'
+#
+AC_DEFUN([LB_LINUX_COMPILE_IFELSE],
+[m4_ifvaln([$1], [AC_LANG_CONFTEST([AC_LANG_SOURCE([$1])])])dnl
+rm -f build/conftest.o build/conftest.mod.c build/conftest.ko
+SUBARCH=$(echo $target_cpu | sed -e 's/powerpc.*/powerpc/' -e 's/ppc.*/powerpc/' -e 's/x86_64/x86/' -e 's/i.86/x86/' -e 's/k1om/x86/' -e 's/aarch64.*/arm64/' -e 's/armv7.*/arm/')
+AS_IF([AC_TRY_COMMAND(cp conftest.c build && make -d [$2] LDFLAGS= ${LD:+LD="$LD"} CC="$CC" -f $PWD/build/Makefile LUSTRE_LINUX_CONFIG=$LINUX_CONFIG LINUXINCLUDE="$EXTRA_CHECK_INCLUDE -I$LINUX/arch/$SUBARCH/include -Iinclude -Iarch/$SUBARCH/include/generated -I$LINUX/include -Iinclude2 -I$LINUX/include/uapi -Iinclude/generated -I$LINUX/arch/$SUBARCH/include/uapi -Iarch/$SUBARCH/include/generated/uapi -I$LINUX/include/uapi -Iinclude/generated/uapi ${SPL_OBJ:+-include $SPL_OBJ/spl_config.h} ${ZFS_OBJ:+-include $ZFS_OBJ/zfs_config.h} ${SPL:+-I$SPL/include } ${ZFS:+-I$ZFS -I$ZFS/include -I${SPL:-$ZFS/include/spl}} -include $CONFIG_INCLUDE" KBUILD_EXTRA_SYMBOLS=${ZFS_OBJ:+$ZFS_OBJ/Module.symvers} -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $MODULE_TARGET=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])],
+ [$4],
+ [_AC_MSG_LOG_CONFTEST
+m4_ifvaln([$5],[$5])dnl])
+rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.ko m4_ifval([$1], [build/conftest.c conftest.c])[]dnl
+])
+
+#
+# LB_LINUX_TRY_COMPILE
+#
+# like AC_TRY_COMPILE
+#
+AC_DEFUN([LB_LINUX_TRY_COMPILE], [
+LB_LINUX_COMPILE_IFELSE(
+ [AC_LANG_SOURCE([LB_LANG_PROGRAM([[$1]], [[$2]])])],
+ [modules], [test -s build/conftest.o],
+ [$3], [$4])
+])
+
+#
+# LB_LINUX_TRY_MAKE
+#
+# like LB_LINUX_TRY_COMPILE, but with different arguments
+#
+AC_DEFUN([LB_LINUX_TRY_MAKE], [
+LB_LINUX_COMPILE_IFELSE(
+ [AC_LANG_SOURCE([LB_LANG_PROGRAM([[$1]], [[$2]])])],
+ [$3], [$4], [$5], [$6])
+])
+
+#
+# LB_CHECK_COMPILE
+# $1 - checking message
+# $2 - variable name
+# $3 - header
+# $4 - body
+# $5 - do 'yes'
+# $6 - do 'no'
+#
+AC_DEFUN([LB_CHECK_COMPILE], [
+AS_VAR_PUSHDEF([lb_compile], [lb_cv_compile_$2])dnl
+AC_CACHE_CHECK([$1], lb_compile, [
+ LB_LINUX_TRY_COMPILE([$3], [$4],
+ [AS_VAR_SET([lb_compile], [yes])],
+ [AS_VAR_SET([lb_compile], [no])])
+])
+AS_VAR_IF([lb_compile], [yes], [$5], [$6])[]dnl
+AS_VAR_POPDEF([lb_compile])dnl
+]) # LB_CHECK_COMPILE
+
+#
+# LB_CHECK_LINUX_HEADER
+#
+# Like AC_CHECK_HEADER but checks for a kernel-space header
+#
+m4_define([LB_CHECK_LINUX_HEADER], [
+AS_VAR_PUSHDEF([lb_header], [lb_cv_header_$1])dnl
+AC_CACHE_CHECK([for $1], lb_header, [
+ LB_LINUX_COMPILE_IFELSE([LB_LANG_PROGRAM([@%:@include <$1>])],
+ [modules], [test -s build/conftest.o],
+ [AS_VAR_SET([lb_header], [yes])],
+ [AS_VAR_SET([lb_header], [no])])