3.10 API change: block_device_operations->release() returns void
[zfs.git] / config / kernel.m4
1 dnl #
2 dnl # Default ZFS kernel configuration 
3 dnl #
4 AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
5         ZFS_AC_KERNEL
6         ZFS_AC_SPL
7         ZFS_AC_TEST_MODULE
8         ZFS_AC_KERNEL_CONFIG
9         ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS
10         ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID
11         ZFS_AC_KERNEL_TYPE_FMODE_T
12         ZFS_AC_KERNEL_KOBJ_NAME_LEN
13         ZFS_AC_KERNEL_3ARG_BLKDEV_GET
14         ZFS_AC_KERNEL_BLKDEV_GET_BY_PATH
15         ZFS_AC_KERNEL_OPEN_BDEV_EXCLUSIVE
16         ZFS_AC_KERNEL_LOOKUP_BDEV
17         ZFS_AC_KERNEL_INVALIDATE_BDEV_ARGS
18         ZFS_AC_KERNEL_BDEV_LOGICAL_BLOCK_SIZE
19         ZFS_AC_KERNEL_BDEV_PHYSICAL_BLOCK_SIZE
20         ZFS_AC_KERNEL_BIO_FAILFAST
21         ZFS_AC_KERNEL_BIO_FAILFAST_DTD
22         ZFS_AC_KERNEL_REQ_FAILFAST_MASK
23         ZFS_AC_KERNEL_BIO_END_IO_T_ARGS
24         ZFS_AC_KERNEL_BIO_RW_SYNC
25         ZFS_AC_KERNEL_BIO_RW_SYNCIO
26         ZFS_AC_KERNEL_REQ_SYNC
27         ZFS_AC_KERNEL_BLK_END_REQUEST
28         ZFS_AC_KERNEL_BLK_QUEUE_FLUSH
29         ZFS_AC_KERNEL_BLK_QUEUE_MAX_HW_SECTORS
30         ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS
31         ZFS_AC_KERNEL_BLK_QUEUE_PHYSICAL_BLOCK_SIZE
32         ZFS_AC_KERNEL_BLK_QUEUE_IO_OPT
33         ZFS_AC_KERNEL_BLK_QUEUE_NONROT
34         ZFS_AC_KERNEL_BLK_QUEUE_DISCARD
35         ZFS_AC_KERNEL_BLK_FETCH_REQUEST
36         ZFS_AC_KERNEL_BLK_REQUEUE_REQUEST
37         ZFS_AC_KERNEL_BLK_RQ_BYTES
38         ZFS_AC_KERNEL_BLK_RQ_POS
39         ZFS_AC_KERNEL_BLK_RQ_SECTORS
40         ZFS_AC_KERNEL_GET_DISK_RO
41         ZFS_AC_KERNEL_GET_GENDISK
42         ZFS_AC_KERNEL_RQ_IS_SYNC
43         ZFS_AC_KERNEL_RQ_FOR_EACH_SEGMENT
44         ZFS_AC_KERNEL_DISCARD_GRANULARITY
45         ZFS_AC_KERNEL_CONST_XATTR_HANDLER
46         ZFS_AC_KERNEL_XATTR_HANDLER_GET
47         ZFS_AC_KERNEL_XATTR_HANDLER_SET
48         ZFS_AC_KERNEL_SHOW_OPTIONS
49         ZFS_AC_KERNEL_FSYNC
50         ZFS_AC_KERNEL_EVICT_INODE
51         ZFS_AC_KERNEL_DIRTY_INODE_WITH_FLAGS
52         ZFS_AC_KERNEL_NR_CACHED_OBJECTS
53         ZFS_AC_KERNEL_FREE_CACHED_OBJECTS
54         ZFS_AC_KERNEL_FALLOCATE
55         ZFS_AC_KERNEL_MKDIR_UMODE_T
56         ZFS_AC_KERNEL_LOOKUP_NAMEIDATA
57         ZFS_AC_KERNEL_CREATE_NAMEIDATA
58         ZFS_AC_KERNEL_TRUNCATE_RANGE
59         ZFS_AC_KERNEL_AUTOMOUNT
60         ZFS_AC_KERNEL_ENCODE_FH_WITH_INODE
61         ZFS_AC_KERNEL_COMMIT_METADATA
62         ZFS_AC_KERNEL_CLEAR_INODE
63         ZFS_AC_KERNEL_INSERT_INODE_LOCKED
64         ZFS_AC_KERNEL_D_MAKE_ROOT
65         ZFS_AC_KERNEL_D_OBTAIN_ALIAS
66         ZFS_AC_KERNEL_D_SET_D_OP
67         ZFS_AC_KERNEL_D_REVALIDATE_NAMEIDATA
68         ZFS_AC_KERNEL_CONST_DENTRY_OPERATIONS
69         ZFS_AC_KERNEL_CHECK_DISK_SIZE_CHANGE
70         ZFS_AC_KERNEL_TRUNCATE_SETSIZE
71         ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY
72         ZFS_AC_KERNEL_CALLBACK_SECURITY_INODE_INIT_SECURITY
73         ZFS_AC_KERNEL_MOUNT_NODEV
74         ZFS_AC_KERNEL_SHRINK
75         ZFS_AC_KERNEL_S_D_OP
76         ZFS_AC_KERNEL_BDI
77         ZFS_AC_KERNEL_BDI_SETUP_AND_REGISTER
78         ZFS_AC_KERNEL_SET_NLINK
79         ZFS_AC_KERNEL_ELEVATOR_CHANGE
80         ZFS_AC_KERNEL_5ARG_SGET
81         ZFS_AC_KERNEL_LSEEK_EXECUTE
82
83         AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
84                 KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
85         ])
86         AC_SUBST(KERNELMAKE_PARAMS)
87
88
89         dnl # -Wall -fno-strict-aliasing -Wstrict-prototypes and other
90         dnl # compiler options are added by the kernel build system.
91         KERNELCPPFLAGS="$KERNELCPPFLAGS $NO_UNUSED_BUT_SET_VARIABLE"
92         KERNELCPPFLAGS="$KERNELCPPFLAGS -DHAVE_SPL -D_KERNEL"
93         KERNELCPPFLAGS="$KERNELCPPFLAGS -DTEXT_DOMAIN=\\\"zfs-linux-kernel\\\""
94
95         AC_SUBST(KERNELCPPFLAGS)
96 ])
97
98 dnl #
99 dnl # Detect name used for Module.symvers file in kernel
100 dnl #
101 AC_DEFUN([ZFS_AC_MODULE_SYMVERS], [
102         modpost=$LINUX/scripts/Makefile.modpost
103         AC_MSG_CHECKING([kernel file name for module symbols])
104         AS_IF([test "x$enable_linux_builtin" != xyes -a -f "$modpost"], [
105                 AS_IF([grep -q Modules.symvers $modpost], [
106                         LINUX_SYMBOLS=Modules.symvers
107                 ], [
108                         LINUX_SYMBOLS=Module.symvers
109                 ])
110
111                 AS_IF([test ! -f "$LINUX_OBJ/$LINUX_SYMBOLS"], [
112                         AC_MSG_ERROR([
113         *** Please make sure the kernel devel package for your distribution
114         *** is installed.  If you are building with a custom kernel, make sure the
115         *** kernel is configured, built, and the '--with-linux=PATH' configure
116         *** option refers to the location of the kernel source.])
117                 ])
118         ], [
119                 LINUX_SYMBOLS=NONE
120         ])
121         AC_MSG_RESULT($LINUX_SYMBOLS)
122         AC_SUBST(LINUX_SYMBOLS)
123 ])
124
125 dnl #
126 dnl # Detect the kernel to be built against
127 dnl #
128 AC_DEFUN([ZFS_AC_KERNEL], [
129         AC_ARG_WITH([linux],
130                 AS_HELP_STRING([--with-linux=PATH],
131                 [Path to kernel source]),
132                 [kernelsrc="$withval"])
133
134         AC_ARG_WITH(linux-obj,
135                 AS_HELP_STRING([--with-linux-obj=PATH],
136                 [Path to kernel build objects]),
137                 [kernelbuild="$withval"])
138
139         AC_MSG_CHECKING([kernel source directory])
140         AS_IF([test -z "$kernelsrc"], [
141                 AS_IF([test -e "/lib/modules/$(uname -r)/source"], [
142                         headersdir="/lib/modules/$(uname -r)/source"
143                         sourcelink=$(readlink -f "$headersdir")
144                 ], [test -e "/lib/modules/$(uname -r)/build"], [
145                         headersdir="/lib/modules/$(uname -r)/build"
146                         sourcelink=$(readlink -f "$headersdir")
147                 ], [
148                         sourcelink=$(ls -1d /usr/src/kernels/* \
149                                      /usr/src/linux-* \
150                                      2>/dev/null | grep -v obj | tail -1)
151                 ])
152
153                 AS_IF([test -n "$sourcelink" && test -e ${sourcelink}], [
154                         kernelsrc=`readlink -f ${sourcelink}`
155                 ], [
156                         kernelsrc="[Not found]"
157                 ])
158         ], [
159                 AS_IF([test "$kernelsrc" = "NONE"], [
160                         kernsrcver=NONE
161                 ])
162         ])
163
164         AC_MSG_RESULT([$kernelsrc])
165         AS_IF([test ! -d "$kernelsrc"], [
166                 AC_MSG_ERROR([
167         *** Please make sure the kernel devel package for your distribution
168         *** is installed and then try again.  If that fails, you can specify the
169         *** location of the kernel source with the '--with-linux=PATH' option.])
170         ])
171
172         AC_MSG_CHECKING([kernel build directory])
173         AS_IF([test -z "$kernelbuild"], [
174                 AS_IF([test -e "/lib/modules/$(uname -r)/build"], [
175                         kernelbuild=`readlink -f /lib/modules/$(uname -r)/build`
176                 ], [test -d ${kernelsrc}-obj/${target_cpu}/${target_cpu}], [
177                         kernelbuild=${kernelsrc}-obj/${target_cpu}/${target_cpu}
178                 ], [test -d ${kernelsrc}-obj/${target_cpu}/default], [
179                         kernelbuild=${kernelsrc}-obj/${target_cpu}/default
180                 ], [test -d `dirname ${kernelsrc}`/build-${target_cpu}], [
181                         kernelbuild=`dirname ${kernelsrc}`/build-${target_cpu}
182                 ], [
183                         kernelbuild=${kernelsrc}
184                 ])
185         ])
186         AC_MSG_RESULT([$kernelbuild])
187
188         AC_MSG_CHECKING([kernel source version])
189         utsrelease1=$kernelbuild/include/linux/version.h
190         utsrelease2=$kernelbuild/include/linux/utsrelease.h
191         utsrelease3=$kernelbuild/include/generated/utsrelease.h
192         AS_IF([test -r $utsrelease1 && fgrep -q UTS_RELEASE $utsrelease1], [
193                 utsrelease=linux/version.h
194         ], [test -r $utsrelease2 && fgrep -q UTS_RELEASE $utsrelease2], [
195                 utsrelease=linux/utsrelease.h
196         ], [test -r $utsrelease3 && fgrep -q UTS_RELEASE $utsrelease3], [
197                 utsrelease=generated/utsrelease.h
198         ])
199
200         AS_IF([test "$utsrelease"], [
201                 kernsrcver=`(echo "#include <$utsrelease>";
202                              echo "kernsrcver=UTS_RELEASE") |
203                              cpp -I $kernelbuild/include |
204                              grep "^kernsrcver=" | cut -d \" -f 2`
205
206                 AS_IF([test -z "$kernsrcver"], [
207                         AC_MSG_RESULT([Not found])
208                         AC_MSG_ERROR([*** Cannot determine kernel version.])
209                 ])
210         ], [
211                 AC_MSG_RESULT([Not found])
212                 if test "x$enable_linux_builtin" != xyes; then
213                         AC_MSG_ERROR([*** Cannot find UTS_RELEASE definition.])
214                 else
215                         AC_MSG_ERROR([
216         *** Cannot find UTS_RELEASE definition.
217         *** Please run 'make prepare' inside the kernel source tree.])
218                 fi
219         ])
220
221         AC_MSG_RESULT([$kernsrcver])
222
223         LINUX=${kernelsrc}
224         LINUX_OBJ=${kernelbuild}
225         LINUX_VERSION=${kernsrcver}
226
227         AC_SUBST(LINUX)
228         AC_SUBST(LINUX_OBJ)
229         AC_SUBST(LINUX_VERSION)
230
231         ZFS_AC_MODULE_SYMVERS
232 ])
233
234
235 dnl #
236 dnl # Detect the SPL module to be built against
237 dnl #
238 AC_DEFUN([ZFS_AC_SPL], [
239         AC_ARG_WITH([spl],
240                 AS_HELP_STRING([--with-spl=PATH],
241                 [Path to spl source]),
242                 [splsrc="$withval"])
243
244         AC_ARG_WITH([spl-obj],
245                 AS_HELP_STRING([--with-spl-obj=PATH],
246                 [Path to spl build objects]),
247                 [splbuild="$withval"])
248
249         AC_ARG_WITH([spl-timeout],
250                 AS_HELP_STRING([--with-spl-timeout=SECS],
251                 [Wait SECS for SPL header and symver file @<:@default=0@:>@]),
252                 [timeout="$withval"], [timeout=0])
253
254         dnl #
255         dnl # The existence of spl.release.in is used to identify a valid
256         dnl # source directory.  In order of preference:
257         dnl #
258         splsrc0="/var/lib/dkms/spl/${VERSION}/build"
259         splsrc1="/usr/src/spl-${VERSION}/${LINUX_VERSION}"
260         splsrc2="/usr/src/spl-${VERSION}"
261         splsrc3="../spl/"
262         splsrc4="$LINUX"
263
264         AC_MSG_CHECKING([spl source directory])
265         AS_IF([test -z "${splsrc}"], [
266                 AS_IF([ test -e "${splsrc0}/spl.release.in"], [
267                         splsrc=${splsrc0}
268                 ], [ test -e "${splsrc1}/spl.release.in"], [
269                         splsrc=${splsrc1}
270                 ], [ test -e "${splsrc2}/spl.release.in"], [
271                         splsrc=${splsrc2}
272                 ], [ test -e "${splsrc3}/spl.release.in"], [
273                         splsrc=$(readlink -f "${splsrc3}")
274                 ], [ test -e "${splsrc4}/spl.release.in" ], [
275                         splsrc=${splsrc4}
276                 ], [
277                         splsrc="[Not found]"
278                 ])
279         ], [
280                 AS_IF([test "$splsrc" = "NONE"], [
281                         splbuild=NONE
282                         splsrcver=NONE
283                 ])
284         ])
285
286         AC_MSG_RESULT([$splsrc])
287         AS_IF([ test ! -e "$splsrc/spl.release.in"], [
288                 AC_MSG_ERROR([
289         *** Please make sure the kmod spl devel package for your distribution
290         *** is installed then try again.  If that fails you can specify the
291         *** location of the spl source with the '--with-spl=PATH' option.])
292         ])
293
294         dnl #
295         dnl # The existence of the spl_config.h is used to identify a valid
296         dnl # spl object directory.  In many cases the object and source
297         dnl # directory are the same, however the objects may also reside
298         dnl # is a subdirectory named after the kernel version.
299         dnl #
300         dnl # This file is supposed to be available after DKMS finishes
301         dnl # building the SPL kernel module for the target kernel.  The
302         dnl # '--with-spl-timeout' option can be passed to pause here,
303         dnl # waiting for the file to appear from a concurrently building
304         dnl # SPL package.
305         dnl #
306         AC_MSG_CHECKING([spl build directory])
307         while true; do
308                 AS_IF([test -z "$splbuild"], [
309                         AS_IF([ test -e "${splsrc}/${LINUX_VERSION}/spl_config.h" ], [
310                                 splbuild="${splsrc}/${LINUX_VERSION}"
311                         ], [ test -e "${splsrc}/spl_config.h" ], [
312                                 splbuild="${splsrc}"
313                         ], [
314                                 splbuild="[Not found]"
315                         ])
316                 ])
317                 AS_IF([test -e "$splbuild/spl_config.h" -o $timeout -le 0], [
318                         break;
319                 ], [
320                         sleep 1
321                         timeout=$((timeout-1))
322                 ])
323         done
324
325         AC_MSG_RESULT([$splbuild])
326         AS_IF([ ! test -e "$splbuild/spl_config.h"], [
327                 AC_MSG_ERROR([
328         *** Please make sure the kmod spl devel <kernel> package for your
329         *** distribution is installed then try again.  If that fails you
330         *** can specify the location of the spl objects with the
331         *** '--with-spl-obj=PATH' option.])
332         ])
333
334         AC_MSG_CHECKING([spl source version])
335         AS_IF([test -r $splbuild/spl_config.h &&
336                 fgrep -q SPL_META_VERSION $splbuild/spl_config.h], [
337
338                 splsrcver=`(echo "#include <spl_config.h>";
339                             echo "splsrcver=SPL_META_VERSION-SPL_META_RELEASE") |
340                             cpp -I $splbuild |
341                             grep "^splsrcver=" | tr -d \" | cut -d= -f2`
342         ])
343
344         AS_IF([test -z "$splsrcver"], [
345                 AC_MSG_RESULT([Not found])
346                 AC_MSG_ERROR([
347         *** Cannot determine the version of the spl source.
348         *** Please prepare the spl source before running this script])
349         ])
350
351         AC_MSG_RESULT([$splsrcver])
352
353         SPL=${splsrc}
354         SPL_OBJ=${splbuild}
355         SPL_VERSION=${splsrcver}
356
357         AC_SUBST(SPL)
358         AC_SUBST(SPL_OBJ)
359         AC_SUBST(SPL_VERSION)
360
361         dnl #
362         dnl # Detect the name used for the SPL Module.symvers file.  If one
363         dnl # does not exist this is likely because the SPL has been configured
364         dnl # but not built.  The '--with-spl-timeout' option can be passed
365         dnl # to pause here, waiting for the file to appear from a concurrently
366         dnl # building SPL package.  If the file does not appear in time, a good
367         dnl # guess is made as to what this file will be named based on what it
368         dnl # is named in the kernel build products.  This file will first be
369         dnl # used at link time so if the guess is wrong the build will fail
370         dnl # then.  This unfortunately means the ZFS package does not contain a
371         dnl # reliable mechanism to detect symbols exported by the SPL at
372         dnl # configure time.
373         dnl #
374         AC_MSG_CHECKING([spl file name for module symbols])
375         SPL_SYMBOLS=NONE
376
377         while true; do
378                 AS_IF([test -r $SPL_OBJ/Module.symvers], [
379                         SPL_SYMBOLS=Module.symvers
380                 ], [test -r $SPL_OBJ/Modules.symvers], [
381                         SPL_SYMBOLS=Modules.symvers
382                 ], [test -r $SPL_OBJ/module/Module.symvers], [
383                         SPL_SYMBOLS=Module.symvers
384                 ], [test -r $SPL_OBJ/module/Modules.symvers], [
385                         SPL_SYMBOLS=Modules.symvers
386                 ])
387
388                 AS_IF([test $SPL_SYMBOLS != NONE -o $timeout -le 0], [
389                         break;
390                 ], [
391                         sleep 1
392                         timeout=$((timeout-1))
393                 ])
394         done
395
396         AS_IF([test "$SPL_SYMBOLS" = NONE], [
397                 SPL_SYMBOLS=$LINUX_SYMBOLS
398         ])
399
400         AC_MSG_RESULT([$SPL_SYMBOLS])
401         AC_SUBST(SPL_SYMBOLS)
402 ])
403
404 dnl #
405 dnl # Basic toolchain sanity check.
406 dnl #
407 AC_DEFUN([ZFS_AC_TEST_MODULE],
408         [AC_MSG_CHECKING([whether modules can be built])
409         ZFS_LINUX_TRY_COMPILE([],[],[
410                 AC_MSG_RESULT([yes])
411         ],[
412                 AC_MSG_RESULT([no])
413                 if test "x$enable_linux_builtin" != xyes; then
414                         AC_MSG_ERROR([*** Unable to build an empty module.])
415                 else
416                         AC_MSG_ERROR([
417         *** Unable to build an empty module.
418         *** Please run 'make scripts' inside the kernel source tree.])
419                 fi
420         ])
421 ])
422
423 dnl #
424 dnl # Certain kernel build options are not supported.  These must be
425 dnl # detected at configure time and cause a build failure.  Otherwise
426 dnl # modules may be successfully built that behave incorrectly.
427 dnl #
428 AC_DEFUN([ZFS_AC_KERNEL_CONFIG], [
429
430         AS_IF([test "$ZFS_META_LICENSE" = GPL], [
431                 AC_DEFINE([HAVE_GPL_ONLY_SYMBOLS], [1],
432                         [Define to 1 if licensed under the GPL])
433         ])
434
435         ZFS_AC_KERNEL_CONFIG_DEBUG_LOCK_ALLOC
436 ])
437
438 dnl #
439 dnl # Check CONFIG_DEBUG_LOCK_ALLOC
440 dnl #
441 dnl # This is typically only set for debug kernels because it comes with
442 dnl # a performance penalty.  However, when it is set it maps the non-GPL
443 dnl # symbol mutex_lock() to the GPL-only mutex_lock_nested() symbol.
444 dnl # This will cause a failure at link time which we'd rather know about
445 dnl # at compile time.
446 dnl #
447 dnl # Since we plan to pursue making mutex_lock_nested() a non-GPL symbol
448 dnl # with the upstream community we add a check to detect this case.
449 dnl #
450 AC_DEFUN([ZFS_AC_KERNEL_CONFIG_DEBUG_LOCK_ALLOC], [
451
452         ZFS_LINUX_CONFIG([DEBUG_LOCK_ALLOC], [
453                 AC_MSG_CHECKING([whether mutex_lock() is GPL-only])
454                 tmp_flags="$EXTRA_KCFLAGS"
455                 ZFS_LINUX_TRY_COMPILE([
456                         #include <linux/module.h>
457                         #include <linux/mutex.h>
458
459                         MODULE_LICENSE("$ZFS_META_LICENSE");
460                 ],[
461                         struct mutex lock;
462
463                         mutex_init(&lock);
464                         mutex_lock(&lock);
465                         mutex_unlock(&lock);
466                 ],[
467                         AC_MSG_RESULT(no)
468                 ],[
469                         AC_MSG_RESULT(yes)
470                         AC_MSG_ERROR([
471         *** Kernel built with CONFIG_DEBUG_LOCK_ALLOC which is incompatible
472         *** with the CDDL license and will prevent the module linking stage
473         *** from succeeding.  You must rebuild your kernel without this
474         *** option enabled.])
475                 ])
476                 EXTRA_KCFLAGS="$tmp_flags"
477         ], [])
478 ])
479
480 dnl #
481 dnl # ZFS_LINUX_CONFTEST
482 dnl #
483 AC_DEFUN([ZFS_LINUX_CONFTEST], [
484 cat confdefs.h - <<_ACEOF >conftest.c
485 $1
486 _ACEOF
487 ])
488
489 dnl #
490 dnl # ZFS_LANG_PROGRAM(C)([PROLOGUE], [BODY])
491 dnl #
492 m4_define([ZFS_LANG_PROGRAM], [
493 $1
494 int
495 main (void)
496 {
497 dnl Do *not* indent the following line: there may be CPP directives.
498 dnl Don't move the `;' right after for the same reason.
499 $2
500   ;
501   return 0;
502 }
503 ])
504
505 dnl #
506 dnl # ZFS_LINUX_COMPILE_IFELSE / like AC_COMPILE_IFELSE
507 dnl #
508 AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [
509         m4_ifvaln([$1], [ZFS_LINUX_CONFTEST([$1])])
510         rm -Rf build && mkdir -p build && touch build/conftest.mod.c
511         echo "obj-m := conftest.o" >build/Makefile
512         modpost_flag=''
513         test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
514         AS_IF(
515                 [AC_TRY_COMMAND(cp conftest.c build && make [$2] -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag) >/dev/null && AC_TRY_COMMAND([$3])],
516                 [$4],
517                 [_AC_MSG_LOG_CONFTEST m4_ifvaln([$5],[$5])]
518         )
519         rm -Rf build
520 ])
521
522 dnl #
523 dnl # ZFS_LINUX_TRY_COMPILE like AC_TRY_COMPILE
524 dnl #
525 AC_DEFUN([ZFS_LINUX_TRY_COMPILE],
526         [ZFS_LINUX_COMPILE_IFELSE(
527         [AC_LANG_SOURCE([ZFS_LANG_PROGRAM([[$1]], [[$2]])])],
528         [modules],
529         [test -s build/conftest.o],
530         [$3], [$4])
531 ])
532
533 dnl #
534 dnl # ZFS_LINUX_CONFIG
535 dnl #
536 AC_DEFUN([ZFS_LINUX_CONFIG],
537         [AC_MSG_CHECKING([whether Linux was built with CONFIG_$1])
538         ZFS_LINUX_TRY_COMPILE([
539                 #include <linux/module.h>
540         ],[
541                 #ifndef CONFIG_$1
542                 #error CONFIG_$1 not #defined
543                 #endif
544         ],[
545                 AC_MSG_RESULT([yes])
546                 $2
547         ],[
548                 AC_MSG_RESULT([no])
549                 $3
550         ])
551 ])
552
553 dnl #
554 dnl # ZFS_CHECK_SYMBOL_EXPORT
555 dnl # check symbol exported or not
556 dnl #
557 AC_DEFUN([ZFS_CHECK_SYMBOL_EXPORT], [
558         grep -q -E '[[[:space:]]]$1[[[:space:]]]' \
559                 $LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null
560         rc=$?
561         if test $rc -ne 0; then
562                 export=0
563                 for file in $2; do
564                         grep -q -E "EXPORT_SYMBOL.*($1)" \
565                                 "$LINUX/$file" 2>/dev/null
566                         rc=$?
567                         if test $rc -eq 0; then
568                                 export=1
569                                 break;
570                         fi
571                 done
572                 if test $export -eq 0; then :
573                         $4
574                 else :
575                         $3
576                 fi
577         else :
578                 $3
579         fi
580 ])
581
582 dnl #
583 dnl # ZFS_LINUX_TRY_COMPILE_SYMBOL
584 dnl # like ZFS_LINUX_TRY_COMPILE, except ZFS_CHECK_SYMBOL_EXPORT
585 dnl # is called if not compiling for builtin
586 dnl #
587 AC_DEFUN([ZFS_LINUX_TRY_COMPILE_SYMBOL], [
588         ZFS_LINUX_TRY_COMPILE([$1], [$2], [rc=0], [rc=1])
589         if test $rc -ne 0; then :
590                 $6
591         else
592                 if test "x$enable_linux_builtin" != xyes; then
593                         ZFS_CHECK_SYMBOL_EXPORT([$3], [$4], [rc=0], [rc=1])
594                 fi
595                 if test $rc -ne 0; then :
596                         $6
597                 else :
598                         $5
599                 fi
600         fi
601 ])