xref: /freebsd-src/sys/contrib/openzfs/config/kernel.m4 (revision dd21556857e8d40f66bf5ad54754d9d52669ebf7)
1eda14cbcSMatt Macydnl #
2eda14cbcSMatt Macydnl # Default ZFS kernel configuration
3eda14cbcSMatt Macydnl #
4eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
5eda14cbcSMatt Macy	AM_COND_IF([BUILD_LINUX], [
6eda14cbcSMatt Macy		dnl # Setup the kernel build environment.
7eda14cbcSMatt Macy		ZFS_AC_KERNEL
8eda14cbcSMatt Macy		ZFS_AC_QAT
9eda14cbcSMatt Macy
10eda14cbcSMatt Macy		dnl # Sanity checks for module building and CONFIG_* defines
11eda14cbcSMatt Macy		ZFS_AC_KERNEL_CONFIG_DEFINED
12716fd348SMartin Matuska		ZFS_AC_MODULE_SYMVERS
13eda14cbcSMatt Macy
14eda14cbcSMatt Macy		dnl # Sequential ZFS_LINUX_TRY_COMPILE tests
15eda14cbcSMatt Macy		ZFS_AC_KERNEL_FPU_HEADER
167877fdebSMatt Macy		ZFS_AC_KERNEL_OBJTOOL_HEADER
17eda14cbcSMatt Macy		ZFS_AC_KERNEL_MISC_MINOR
18eda14cbcSMatt Macy		ZFS_AC_KERNEL_DECLARE_EVENT_CLASS
19eda14cbcSMatt Macy
20eda14cbcSMatt Macy		dnl # Parallel ZFS_LINUX_TEST_SRC / ZFS_LINUX_TEST_RESULT tests
21eda14cbcSMatt Macy		ZFS_AC_KERNEL_TEST_SRC
22eda14cbcSMatt Macy		ZFS_AC_KERNEL_TEST_RESULT
23eda14cbcSMatt Macy
24eda14cbcSMatt Macy		AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
25eda14cbcSMatt Macy			KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ"
26eda14cbcSMatt Macy		])
27eda14cbcSMatt Macy
28eda14cbcSMatt Macy		AC_SUBST(KERNEL_MAKE)
29eda14cbcSMatt Macy	])
30eda14cbcSMatt Macy])
31eda14cbcSMatt Macy
32eda14cbcSMatt Macydnl #
33eda14cbcSMatt Macydnl # Generate and compile all of the kernel API test cases to determine
34eda14cbcSMatt Macydnl # which interfaces are available.  By invoking the kernel build system
35eda14cbcSMatt Macydnl # only once the compilation can be done in parallel significantly
36eda14cbcSMatt Macydnl # speeding up the process.
37eda14cbcSMatt Macydnl #
38eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
39aca928a5SMartin Matuska	ZFS_AC_KERNEL_SRC_TYPES
40eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_OBJTOOL
41eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_ACCESS_OK_TYPE
42eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_PDE_DATA
43c7046f76SMartin Matuska	ZFS_AC_KERNEL_SRC_GENERIC_FADVISE
44eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SCHED
45eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_USLEEP_RANGE
46eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_VMALLOC_PAGE_KERNEL
47eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_INODE_TIMES
48eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_PROC_OPERATIONS
49eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS
50eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_BIO
51eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_BLKDEV
52eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_BLK_QUEUE
53716fd348SMartin Matuska	ZFS_AC_KERNEL_SRC_GENHD_FLAGS
547877fdebSMatt Macy	ZFS_AC_KERNEL_SRC_REVALIDATE_DISK
55eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_GET_DISK_RO
56eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_DISCARD_GRANULARITY
57eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_INODE_OWNER_OR_CAPABLE
58eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_XATTR
59eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_ACL
60d411c1d6SMartin Matuska	ZFS_AC_KERNEL_SRC_INODE_SETATTR
61eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_INODE_GETATTR
62eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SHOW_OPTIONS
63eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SHRINKER
64f9693befSMartin Matuska	ZFS_AC_KERNEL_SRC_MKDIR
65eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_LOOKUP_FLAGS
66f9693befSMartin Matuska	ZFS_AC_KERNEL_SRC_CREATE
67716fd348SMartin Matuska	ZFS_AC_KERNEL_SRC_PERMISSION
68eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_TMPFILE
69eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_AUTOMOUNT
70eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_COMMIT_METADATA
71eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SETATTR_PREPARE
72eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_INSERT_INODE_LOCKED
73eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_TRUNCATE_SETSIZE
74eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SECURITY_INODE
75eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_FST_MOUNT
76eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SET_NLINK
77eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SGET
78716fd348SMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_FILEMAP_DIRTY_FOLIO
79e3aa18adSMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_READ_FOLIO
805c65a0a9SMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_MIGRATE_FOLIO
81eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_VFS_FSYNC_2ARGS
82e3aa18adSMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_READPAGES
83e3aa18adSMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
847877fdebSMatt Macy	ZFS_AC_KERNEL_SRC_VFS_IOV_ITER
85315ee00fSMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_GENERIC_COPY_FILE_RANGE
86783d3ff6SMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_SPLICE_COPY_FILE_RANGE
87315ee00fSMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_REMAP_FILE_RANGE
88315ee00fSMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE
89315ee00fSMartin Matuska	ZFS_AC_KERNEL_SRC_VFS_DEDUPE_FILE_RANGE
90eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_KMAP_ATOMIC_ARGS
9175e1fea6SMartin Matuska	ZFS_AC_KERNEL_SRC_KMAP_LOCAL_PAGE
92eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_FOLLOW_DOWN_ONE
93eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN
94eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT
95eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_FPU
96eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_FMODE_T
97eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_KUIDGID_T
98eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_KUID_HELPERS
99f9693befSMartin Matuska	ZFS_AC_KERNEL_SRC_RENAME
100eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_TOTALRAM_PAGES_FUNC
101eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_TOTALHIGH_PAGES
102eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_PERCPU
103d411c1d6SMartin Matuska	ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR
104f9693befSMartin Matuska	ZFS_AC_KERNEL_SRC_MKNOD
105f9693befSMartin Matuska	ZFS_AC_KERNEL_SRC_SYMLINK
106f9693befSMartin Matuska	ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS
10716038816SMartin Matuska	ZFS_AC_KERNEL_SRC_SIGINFO
108716fd348SMartin Matuska	ZFS_AC_KERNEL_SRC_SYSFS
10953b70c86SMartin Matuska	ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
110fd45b686SMartin Matuska	ZFS_AC_KERNEL_SRC_STRLCPY
111681ce946SMartin Matuska	ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT
112c03c5b1cSMartin Matuska	ZFS_AC_KERNEL_SRC_ADD_DISK
113c03c5b1cSMartin Matuska	ZFS_AC_KERNEL_SRC_KTHREAD
114da5137abSMartin Matuska	ZFS_AC_KERNEL_SRC_ZERO_PAGE
115716fd348SMartin Matuska	ZFS_AC_KERNEL_SRC___COPY_FROM_USER_INATOMIC
116dbd5678dSMartin Matuska	ZFS_AC_KERNEL_SRC_IDMAP_MNT_API
117fd45b686SMartin Matuska	ZFS_AC_KERNEL_SRC_IDMAP_NO_USERNS
118dbd5678dSMartin Matuska	ZFS_AC_KERNEL_SRC_IATTR_VFSID
119d411c1d6SMartin Matuska	ZFS_AC_KERNEL_SRC_WRITEPAGE_T
1204e8d558cSMartin Matuska	ZFS_AC_KERNEL_SRC_RECLAIMED
121315ee00fSMartin Matuska	ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE
12229dc9349SMartin Matuska	ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_SZ
12329dc9349SMartin Matuska	ZFS_AC_KERNEL_SRC_PROC_HANDLER_CTL_TABLE_CONST
124315ee00fSMartin Matuska	ZFS_AC_KERNEL_SRC_COPY_SPLICE_READ
125abcdc1b9SMartin Matuska	ZFS_AC_KERNEL_SRC_SYNC_BDEV
1267a7741afSMartin Matuska	ZFS_AC_KERNEL_SRC_MM_PAGE_FLAGS
127783d3ff6SMartin Matuska	ZFS_AC_KERNEL_SRC_MM_PAGE_SIZE
12829dc9349SMartin Matuska	ZFS_AC_KERNEL_SRC_MM_PAGE_MAPPING
1297a7741afSMartin Matuska	ZFS_AC_KERNEL_SRC_FILE
130*dd215568SMartin Matuska	ZFS_AC_KERNEL_SRC_PIN_USER_PAGES
1312a58b312SMartin Matuska	case "$host_cpu" in
1322a58b312SMartin Matuska		powerpc*)
1332a58b312SMartin Matuska			ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
1342a58b312SMartin Matuska			ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
1352a58b312SMartin Matuska			;;
1363494f7c0SMartin Matuska		riscv*)
1373494f7c0SMartin Matuska			ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
1383494f7c0SMartin Matuska			;;
1392a58b312SMartin Matuska	esac
140eda14cbcSMatt Macy
141eda14cbcSMatt Macy	AC_MSG_CHECKING([for available kernel interfaces])
142eda14cbcSMatt Macy	ZFS_LINUX_TEST_COMPILE_ALL([kabi])
143eda14cbcSMatt Macy	AC_MSG_RESULT([done])
144eda14cbcSMatt Macy])
145eda14cbcSMatt Macy
146eda14cbcSMatt Macydnl #
147eda14cbcSMatt Macydnl # Check results of kernel interface tests.
148eda14cbcSMatt Macydnl #
149eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
150aca928a5SMartin Matuska	ZFS_AC_KERNEL_TYPES
151eda14cbcSMatt Macy	ZFS_AC_KERNEL_ACCESS_OK_TYPE
152eda14cbcSMatt Macy	ZFS_AC_KERNEL_OBJTOOL
153eda14cbcSMatt Macy	ZFS_AC_KERNEL_PDE_DATA
154c7046f76SMartin Matuska	ZFS_AC_KERNEL_GENERIC_FADVISE
155eda14cbcSMatt Macy	ZFS_AC_KERNEL_SCHED
156eda14cbcSMatt Macy	ZFS_AC_KERNEL_USLEEP_RANGE
157eda14cbcSMatt Macy	ZFS_AC_KERNEL_VMALLOC_PAGE_KERNEL
158eda14cbcSMatt Macy	ZFS_AC_KERNEL_INODE_TIMES
159eda14cbcSMatt Macy	ZFS_AC_KERNEL_PROC_OPERATIONS
160eda14cbcSMatt Macy	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS
161eda14cbcSMatt Macy	ZFS_AC_KERNEL_BIO
162eda14cbcSMatt Macy	ZFS_AC_KERNEL_BLKDEV
163eda14cbcSMatt Macy	ZFS_AC_KERNEL_BLK_QUEUE
164716fd348SMartin Matuska	ZFS_AC_KERNEL_GENHD_FLAGS
1657877fdebSMatt Macy	ZFS_AC_KERNEL_REVALIDATE_DISK
166eda14cbcSMatt Macy	ZFS_AC_KERNEL_GET_DISK_RO
167eda14cbcSMatt Macy	ZFS_AC_KERNEL_DISCARD_GRANULARITY
168eda14cbcSMatt Macy	ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE
169eda14cbcSMatt Macy	ZFS_AC_KERNEL_XATTR
170eda14cbcSMatt Macy	ZFS_AC_KERNEL_ACL
171d411c1d6SMartin Matuska	ZFS_AC_KERNEL_INODE_SETATTR
172eda14cbcSMatt Macy	ZFS_AC_KERNEL_INODE_GETATTR
173eda14cbcSMatt Macy	ZFS_AC_KERNEL_SHOW_OPTIONS
174eda14cbcSMatt Macy	ZFS_AC_KERNEL_SHRINKER
175f9693befSMartin Matuska	ZFS_AC_KERNEL_MKDIR
176eda14cbcSMatt Macy	ZFS_AC_KERNEL_LOOKUP_FLAGS
177f9693befSMartin Matuska	ZFS_AC_KERNEL_CREATE
178716fd348SMartin Matuska	ZFS_AC_KERNEL_PERMISSION
179eda14cbcSMatt Macy	ZFS_AC_KERNEL_TMPFILE
180eda14cbcSMatt Macy	ZFS_AC_KERNEL_AUTOMOUNT
181eda14cbcSMatt Macy	ZFS_AC_KERNEL_COMMIT_METADATA
182eda14cbcSMatt Macy	ZFS_AC_KERNEL_SETATTR_PREPARE
183eda14cbcSMatt Macy	ZFS_AC_KERNEL_INSERT_INODE_LOCKED
184eda14cbcSMatt Macy	ZFS_AC_KERNEL_TRUNCATE_SETSIZE
185eda14cbcSMatt Macy	ZFS_AC_KERNEL_SECURITY_INODE
186eda14cbcSMatt Macy	ZFS_AC_KERNEL_FST_MOUNT
187eda14cbcSMatt Macy	ZFS_AC_KERNEL_SET_NLINK
188eda14cbcSMatt Macy	ZFS_AC_KERNEL_SGET
189716fd348SMartin Matuska	ZFS_AC_KERNEL_VFS_FILEMAP_DIRTY_FOLIO
190e3aa18adSMartin Matuska	ZFS_AC_KERNEL_VFS_READ_FOLIO
1915c65a0a9SMartin Matuska	ZFS_AC_KERNEL_VFS_MIGRATE_FOLIO
192eda14cbcSMatt Macy	ZFS_AC_KERNEL_VFS_FSYNC_2ARGS
193e3aa18adSMartin Matuska	ZFS_AC_KERNEL_VFS_READPAGES
194e3aa18adSMartin Matuska	ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
1957877fdebSMatt Macy	ZFS_AC_KERNEL_VFS_IOV_ITER
196315ee00fSMartin Matuska	ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE
197783d3ff6SMartin Matuska	ZFS_AC_KERNEL_VFS_SPLICE_COPY_FILE_RANGE
198315ee00fSMartin Matuska	ZFS_AC_KERNEL_VFS_REMAP_FILE_RANGE
199315ee00fSMartin Matuska	ZFS_AC_KERNEL_VFS_CLONE_FILE_RANGE
200315ee00fSMartin Matuska	ZFS_AC_KERNEL_VFS_DEDUPE_FILE_RANGE
201eda14cbcSMatt Macy	ZFS_AC_KERNEL_KMAP_ATOMIC_ARGS
20275e1fea6SMartin Matuska	ZFS_AC_KERNEL_KMAP_LOCAL_PAGE
203eda14cbcSMatt Macy	ZFS_AC_KERNEL_FOLLOW_DOWN_ONE
204eda14cbcSMatt Macy	ZFS_AC_KERNEL_MAKE_REQUEST_FN
205eda14cbcSMatt Macy	ZFS_AC_KERNEL_GENERIC_IO_ACCT
206eda14cbcSMatt Macy	ZFS_AC_KERNEL_FPU
207eda14cbcSMatt Macy	ZFS_AC_KERNEL_FMODE_T
208eda14cbcSMatt Macy	ZFS_AC_KERNEL_KUIDGID_T
209eda14cbcSMatt Macy	ZFS_AC_KERNEL_KUID_HELPERS
210f9693befSMartin Matuska	ZFS_AC_KERNEL_RENAME
211eda14cbcSMatt Macy	ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC
212eda14cbcSMatt Macy	ZFS_AC_KERNEL_TOTALHIGH_PAGES
213eda14cbcSMatt Macy	ZFS_AC_KERNEL_PERCPU
214d411c1d6SMartin Matuska	ZFS_AC_KERNEL_GENERIC_FILLATTR
215f9693befSMartin Matuska	ZFS_AC_KERNEL_MKNOD
216f9693befSMartin Matuska	ZFS_AC_KERNEL_SYMLINK
217f9693befSMartin Matuska	ZFS_AC_KERNEL_BIO_MAX_SEGS
21816038816SMartin Matuska	ZFS_AC_KERNEL_SIGINFO
219716fd348SMartin Matuska	ZFS_AC_KERNEL_SYSFS
22053b70c86SMartin Matuska	ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
221fd45b686SMartin Matuska	ZFS_AC_KERNEL_STRLCPY
222681ce946SMartin Matuska	ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT
223c03c5b1cSMartin Matuska	ZFS_AC_KERNEL_ADD_DISK
224c03c5b1cSMartin Matuska	ZFS_AC_KERNEL_KTHREAD
225da5137abSMartin Matuska	ZFS_AC_KERNEL_ZERO_PAGE
226716fd348SMartin Matuska	ZFS_AC_KERNEL___COPY_FROM_USER_INATOMIC
227dbd5678dSMartin Matuska	ZFS_AC_KERNEL_IDMAP_MNT_API
228fd45b686SMartin Matuska	ZFS_AC_KERNEL_IDMAP_NO_USERNS
229dbd5678dSMartin Matuska	ZFS_AC_KERNEL_IATTR_VFSID
230d411c1d6SMartin Matuska	ZFS_AC_KERNEL_WRITEPAGE_T
2314e8d558cSMartin Matuska	ZFS_AC_KERNEL_RECLAIMED
232315ee00fSMartin Matuska	ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE
23329dc9349SMartin Matuska	ZFS_AC_KERNEL_REGISTER_SYSCTL_SZ
23429dc9349SMartin Matuska	ZFS_AC_KERNEL_PROC_HANDLER_CTL_TABLE_CONST
235315ee00fSMartin Matuska	ZFS_AC_KERNEL_COPY_SPLICE_READ
236abcdc1b9SMartin Matuska	ZFS_AC_KERNEL_SYNC_BDEV
2377a7741afSMartin Matuska	ZFS_AC_KERNEL_MM_PAGE_FLAGS
238783d3ff6SMartin Matuska	ZFS_AC_KERNEL_MM_PAGE_SIZE
23929dc9349SMartin Matuska	ZFS_AC_KERNEL_MM_PAGE_MAPPING
2407a7741afSMartin Matuska	ZFS_AC_KERNEL_1ARG_ASSIGN_STR
2417a7741afSMartin Matuska	ZFS_AC_KERNEL_FILE
242*dd215568SMartin Matuska	ZFS_AC_KERNEL_PIN_USER_PAGES
2432a58b312SMartin Matuska	case "$host_cpu" in
2442a58b312SMartin Matuska		powerpc*)
2452a58b312SMartin Matuska			ZFS_AC_KERNEL_CPU_HAS_FEATURE
2462a58b312SMartin Matuska			ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
2472a58b312SMartin Matuska			;;
2483494f7c0SMartin Matuska		riscv*)
2493494f7c0SMartin Matuska			ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
2503494f7c0SMartin Matuska			;;
2512a58b312SMartin Matuska	esac
252eda14cbcSMatt Macy])
253eda14cbcSMatt Macy
254eda14cbcSMatt Macydnl #
255eda14cbcSMatt Macydnl # Detect name used for Module.symvers file in kernel
256eda14cbcSMatt Macydnl #
257eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_MODULE_SYMVERS], [
258eda14cbcSMatt Macy	modpost=$LINUX/scripts/Makefile.modpost
259eda14cbcSMatt Macy	AC_MSG_CHECKING([kernel file name for module symbols])
260eda14cbcSMatt Macy	AS_IF([test "x$enable_linux_builtin" != xyes -a -f "$modpost"], [
261eda14cbcSMatt Macy		AS_IF([grep -q Modules.symvers $modpost], [
262eda14cbcSMatt Macy			LINUX_SYMBOLS=Modules.symvers
263eda14cbcSMatt Macy		], [
264eda14cbcSMatt Macy			LINUX_SYMBOLS=Module.symvers
265eda14cbcSMatt Macy		])
266eda14cbcSMatt Macy
267eda14cbcSMatt Macy		AS_IF([test ! -f "$LINUX_OBJ/$LINUX_SYMBOLS"], [
268eda14cbcSMatt Macy			AC_MSG_ERROR([
269eda14cbcSMatt Macy	*** Please make sure the kernel devel package for your distribution
270eda14cbcSMatt Macy	*** is installed.  If you are building with a custom kernel, make sure
271eda14cbcSMatt Macy	*** the kernel is configured, built, and the '--with-linux=PATH'
272eda14cbcSMatt Macy	*** configure option refers to the location of the kernel source.
273eda14cbcSMatt Macy			])
274eda14cbcSMatt Macy		])
275eda14cbcSMatt Macy	], [
276eda14cbcSMatt Macy		LINUX_SYMBOLS=NONE
277eda14cbcSMatt Macy	])
278eda14cbcSMatt Macy	AC_MSG_RESULT($LINUX_SYMBOLS)
279eda14cbcSMatt Macy	AC_SUBST(LINUX_SYMBOLS)
280eda14cbcSMatt Macy])
281eda14cbcSMatt Macy
282eda14cbcSMatt Macydnl #
283eda14cbcSMatt Macydnl # Detect the kernel to be built against
284eda14cbcSMatt Macydnl #
285c03c5b1cSMartin Matuskadnl # Most modern Linux distributions have separate locations for bare
286c03c5b1cSMartin Matuskadnl # source (source) and prebuilt (build) files. Additionally, there are
287c03c5b1cSMartin Matuskadnl # `source` and `build` symlinks in `/lib/modules/$(KERNEL_VERSION)`
288c03c5b1cSMartin Matuskadnl # pointing to them. The directory search order is now:
289c03c5b1cSMartin Matuskadnl #
290c03c5b1cSMartin Matuskadnl # - `configure` command line values if both `--with-linux` and
291c03c5b1cSMartin Matuskadnl #   `--with-linux-obj` were defined
292c03c5b1cSMartin Matuskadnl #
293c03c5b1cSMartin Matuskadnl # - If only `--with-linux` was defined, `--with-linux-obj` is assumed
294c03c5b1cSMartin Matuskadnl #   to have the same value as `--with-linux`
295c03c5b1cSMartin Matuskadnl #
296c03c5b1cSMartin Matuskadnl # - If neither `--with-linux` nor `--with-linux-obj` were defined
297c03c5b1cSMartin Matuskadnl #   autodetection is used:
298c03c5b1cSMartin Matuskadnl #
299c03c5b1cSMartin Matuskadnl #   - `/lib/modules/$(uname -r)/{source,build}` respectively, if exist.
300c03c5b1cSMartin Matuskadnl #
301c03c5b1cSMartin Matuskadnl #   - If only `/lib/modules/$(uname -r)/build` exists, it is assumed
302c03c5b1cSMartin Matuskadnl #     to be both source and build directory.
303c03c5b1cSMartin Matuskadnl #
304c03c5b1cSMartin Matuskadnl #   - The first directory in `/lib/modules` with the highest version
305c03c5b1cSMartin Matuskadnl #     number according to `sort -V` which contains both `source` and
306c03c5b1cSMartin Matuskadnl #     `build` symlinks/directories. If module directory contains only
307c03c5b1cSMartin Matuskadnl #     `build` component, it is assumed to be both source and build
308c03c5b1cSMartin Matuskadnl #     directory.
309c03c5b1cSMartin Matuskadnl #
310c03c5b1cSMartin Matuskadnl #   - Last resort: the first directory matching `/usr/src/kernels/*`
311c03c5b1cSMartin Matuskadnl #     and `/usr/src/linux-*` with the highest version number according
312c03c5b1cSMartin Matuskadnl #     to `sort -V` is assumed to be both source and build directory.
313c03c5b1cSMartin Matuskadnl #
314eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL], [
315eda14cbcSMatt Macy	AC_ARG_WITH([linux],
316eda14cbcSMatt Macy		AS_HELP_STRING([--with-linux=PATH],
317eda14cbcSMatt Macy		[Path to kernel source]),
318eda14cbcSMatt Macy		[kernelsrc="$withval"])
319eda14cbcSMatt Macy
320eda14cbcSMatt Macy	AC_ARG_WITH(linux-obj,
321eda14cbcSMatt Macy		AS_HELP_STRING([--with-linux-obj=PATH],
322eda14cbcSMatt Macy		[Path to kernel build objects]),
323eda14cbcSMatt Macy		[kernelbuild="$withval"])
324eda14cbcSMatt Macy
325c03c5b1cSMartin Matuska	AC_MSG_CHECKING([kernel source and build directories])
326c03c5b1cSMartin Matuska	AS_IF([test -n "$kernelsrc" && test -z "$kernelbuild"], [
327c03c5b1cSMartin Matuska		kernelbuild="$kernelsrc"
328c03c5b1cSMartin Matuska	], [test -z "$kernelsrc"], [
329c03c5b1cSMartin Matuska		AS_IF([test -e "/lib/modules/$(uname -r)/source" && \
330c03c5b1cSMartin Matuska		       test -e "/lib/modules/$(uname -r)/build"], [
331c03c5b1cSMartin Matuska			src="/lib/modules/$(uname -r)/source"
332c03c5b1cSMartin Matuska			build="/lib/modules/$(uname -r)/build"
333eda14cbcSMatt Macy		], [test -e "/lib/modules/$(uname -r)/build"], [
334c03c5b1cSMartin Matuska			build="/lib/modules/$(uname -r)/build"
335c03c5b1cSMartin Matuska			src="$build"
336eda14cbcSMatt Macy		], [
337c03c5b1cSMartin Matuska			src=
338c03c5b1cSMartin Matuska
339c03c5b1cSMartin Matuska			for d in $(ls -1d /lib/modules/* 2>/dev/null | sort -Vr); do
340c03c5b1cSMartin Matuska				if test -e "$d/source" && test -e "$d/build"; then
341c03c5b1cSMartin Matuska					src="$d/source"
342c03c5b1cSMartin Matuska					build="$d/build"
343c03c5b1cSMartin Matuska					break
344c03c5b1cSMartin Matuska				fi
345c03c5b1cSMartin Matuska
346c03c5b1cSMartin Matuska				if test -e "$d/build"; then
347c03c5b1cSMartin Matuska					src="$d/build"
348c03c5b1cSMartin Matuska					build="$d/build"
349c03c5b1cSMartin Matuska					break
350c03c5b1cSMartin Matuska				fi
351c03c5b1cSMartin Matuska			done
352c03c5b1cSMartin Matuska
353c03c5b1cSMartin Matuska			# the least reliable method
354c03c5b1cSMartin Matuska			if test -z "$src"; then
355c03c5b1cSMartin Matuska				src=$(ls -1d /usr/src/kernels/* /usr/src/linux-* \
356c03c5b1cSMartin Matuska				      2>/dev/null | grep -v obj | sort -Vr | head -1)
357c03c5b1cSMartin Matuska				build="$src"
358c03c5b1cSMartin Matuska			fi
359eda14cbcSMatt Macy		])
360eda14cbcSMatt Macy
361c03c5b1cSMartin Matuska		AS_IF([test -n "$src" && test -e "$src"], [
362c03c5b1cSMartin Matuska			kernelsrc=$(readlink -e "$src")
363eda14cbcSMatt Macy		], [
364eda14cbcSMatt Macy			kernelsrc="[Not found]"
365eda14cbcSMatt Macy		])
366c03c5b1cSMartin Matuska		AS_IF([test -n "$build" && test -e "$build"], [
367c03c5b1cSMartin Matuska			kernelbuild=$(readlink -e "$build")
368c03c5b1cSMartin Matuska		], [
369c03c5b1cSMartin Matuska			kernelbuild="[Not found]"
370c03c5b1cSMartin Matuska		])
371eda14cbcSMatt Macy	], [
372eda14cbcSMatt Macy		AS_IF([test "$kernelsrc" = "NONE"], [
373eda14cbcSMatt Macy			kernsrcver=NONE
374eda14cbcSMatt Macy		])
375eda14cbcSMatt Macy		withlinux=yes
376eda14cbcSMatt Macy	])
377eda14cbcSMatt Macy
378c03c5b1cSMartin Matuska	AC_MSG_RESULT([done])
379c03c5b1cSMartin Matuska	AC_MSG_CHECKING([kernel source directory])
380eda14cbcSMatt Macy	AC_MSG_RESULT([$kernelsrc])
381c03c5b1cSMartin Matuska	AC_MSG_CHECKING([kernel build directory])
382c03c5b1cSMartin Matuska	AC_MSG_RESULT([$kernelbuild])
383c03c5b1cSMartin Matuska	AS_IF([test ! -d "$kernelsrc" || test ! -d "$kernelbuild"], [
384eda14cbcSMatt Macy		AC_MSG_ERROR([
385eda14cbcSMatt Macy	*** Please make sure the kernel devel package for your distribution
386eda14cbcSMatt Macy	*** is installed and then try again.  If that fails, you can specify the
387c03c5b1cSMartin Matuska	*** location of the kernel source and build with the '--with-linux=PATH' and
388c03c5b1cSMartin Matuska	*** '--with-linux-obj=PATH' options respectively.])
389eda14cbcSMatt Macy	])
390eda14cbcSMatt Macy
391eda14cbcSMatt Macy	AC_MSG_CHECKING([kernel source version])
392eda14cbcSMatt Macy	utsrelease1=$kernelbuild/include/linux/version.h
393eda14cbcSMatt Macy	utsrelease2=$kernelbuild/include/linux/utsrelease.h
394eda14cbcSMatt Macy	utsrelease3=$kernelbuild/include/generated/utsrelease.h
395716fd348SMartin Matuska	AS_IF([test -r $utsrelease1 && grep -qF UTS_RELEASE $utsrelease1], [
3967877fdebSMatt Macy		utsrelease=$utsrelease1
397716fd348SMartin Matuska	], [test -r $utsrelease2 && grep -qF UTS_RELEASE $utsrelease2], [
3987877fdebSMatt Macy		utsrelease=$utsrelease2
399716fd348SMartin Matuska	], [test -r $utsrelease3 && grep -qF UTS_RELEASE $utsrelease3], [
4007877fdebSMatt Macy		utsrelease=$utsrelease3
401eda14cbcSMatt Macy	])
402eda14cbcSMatt Macy
4037877fdebSMatt Macy	AS_IF([test -n "$utsrelease"], [
4047877fdebSMatt Macy		kernsrcver=$($AWK '/UTS_RELEASE/ { gsub(/"/, "", $[3]); print $[3] }' $utsrelease)
405eda14cbcSMatt Macy		AS_IF([test -z "$kernsrcver"], [
406eda14cbcSMatt Macy			AC_MSG_RESULT([Not found])
407eda14cbcSMatt Macy			AC_MSG_ERROR([
408eda14cbcSMatt Macy	*** Cannot determine kernel version.
409eda14cbcSMatt Macy			])
410eda14cbcSMatt Macy		])
411eda14cbcSMatt Macy	], [
412eda14cbcSMatt Macy		AC_MSG_RESULT([Not found])
413eda14cbcSMatt Macy		if test "x$enable_linux_builtin" != xyes; then
414eda14cbcSMatt Macy			AC_MSG_ERROR([
415eda14cbcSMatt Macy	*** Cannot find UTS_RELEASE definition.
416eda14cbcSMatt Macy			])
417eda14cbcSMatt Macy		else
418eda14cbcSMatt Macy			AC_MSG_ERROR([
419eda14cbcSMatt Macy	*** Cannot find UTS_RELEASE definition.
420eda14cbcSMatt Macy	*** Please run 'make prepare' inside the kernel source tree.])
421eda14cbcSMatt Macy		fi
422eda14cbcSMatt Macy	])
423eda14cbcSMatt Macy
424eda14cbcSMatt Macy	AC_MSG_RESULT([$kernsrcver])
425eda14cbcSMatt Macy
4267a7741afSMartin Matuska	AX_COMPARE_VERSION([$kernsrcver], [ge], [$ZFS_META_KVER_MIN], [], [
427eda14cbcSMatt Macy		AC_MSG_ERROR([
428eda14cbcSMatt Macy	*** Cannot build against kernel version $kernsrcver.
429eda14cbcSMatt Macy	*** The minimum supported kernel version is $ZFS_META_KVER_MIN.
430eda14cbcSMatt Macy		])
431eda14cbcSMatt Macy	])
432eda14cbcSMatt Macy
4337a7741afSMartin Matuska	AC_ARG_ENABLE([linux-experimental],
4347a7741afSMartin Matuska		AS_HELP_STRING([--enable-linux-experimental],
4357a7741afSMartin Matuska		[Allow building against some unsupported kernel versions]))
4367a7741afSMartin Matuska
4377a7741afSMartin Matuska	AX_COMPARE_VERSION([$kernsrcver], [ge], [$ZFS_META_KVER_MAX], [
4387a7741afSMartin Matuska		AX_COMPARE_VERSION([$kernsrcver], [eq2], [$ZFS_META_KVER_MAX], [
4397a7741afSMartin Matuska			kern_max_version_ok=yes
4407a7741afSMartin Matuska		], [
4417a7741afSMartin Matuska			kern_max_version_ok=no
4427a7741afSMartin Matuska		])
4437a7741afSMartin Matuska	], [
4447a7741afSMartin Matuska		kern_max_version_ok=yes
4457a7741afSMartin Matuska	])
4467a7741afSMartin Matuska
4477a7741afSMartin Matuska	AS_IF([test "x$kern_max_version_ok" != "xyes"], [
4487a7741afSMartin Matuska		AS_IF([test "x$enable_linux_experimental" == "xyes"], [
4497a7741afSMartin Matuska			AC_DEFINE(HAVE_LINUX_EXPERIMENTAL, 1,
4507a7741afSMartin Matuska			    [building against unsupported kernel version])
4517a7741afSMartin Matuska		], [
4527a7741afSMartin Matuska			AC_MSG_ERROR([
4537a7741afSMartin Matuska	*** Cannot build against kernel version $kernsrcver.
4547a7741afSMartin Matuska	*** The maximum supported kernel version is $ZFS_META_KVER_MAX.
4557a7741afSMartin Matuska			])
4567a7741afSMartin Matuska		])
4577a7741afSMartin Matuska	])
4587a7741afSMartin Matuska
459eda14cbcSMatt Macy	LINUX=${kernelsrc}
460eda14cbcSMatt Macy	LINUX_OBJ=${kernelbuild}
461eda14cbcSMatt Macy	LINUX_VERSION=${kernsrcver}
462eda14cbcSMatt Macy
463eda14cbcSMatt Macy	AC_SUBST(LINUX)
464eda14cbcSMatt Macy	AC_SUBST(LINUX_OBJ)
465eda14cbcSMatt Macy	AC_SUBST(LINUX_VERSION)
466eda14cbcSMatt Macy])
467eda14cbcSMatt Macy
4687a7741afSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VERSION_WARNING], [
4697a7741afSMartin Matuska	AS_IF([test "x$enable_linux_experimental" = "xyes" && \
4707a7741afSMartin Matuska	    test "x$kern_max_version_ok" != "xyes"], [
4717a7741afSMartin Matuska		AC_MSG_WARN([
4727a7741afSMartin Matuska
4737a7741afSMartin Matuska	You are building OpenZFS against Linux version $kernsrcver.
4747a7741afSMartin Matuska
4757a7741afSMartin Matuska	This combination is considered EXPERIMENTAL by the OpenZFS project.
4767a7741afSMartin Matuska	Even if it appears to build and run correctly, there may be bugs that
4777a7741afSMartin Matuska	can cause SERIOUS DATA LOSS.
4787a7741afSMartin Matuska
4797a7741afSMartin Matuska	YOU HAVE BEEN WARNED!
4807a7741afSMartin Matuska
4817a7741afSMartin Matuska	If you choose to continue, we'd appreciate if you could report your
4827a7741afSMartin Matuska	results on the OpenZFS issue tracker at:
4837a7741afSMartin Matuska
4847a7741afSMartin Matuska	    https://github.com/openzfs/zfs/issues/new
4857a7741afSMartin Matuska
4867a7741afSMartin Matuska	Your feedback will help us prepare a new OpenZFS release that supports
4877a7741afSMartin Matuska	this version of Linux.
4887a7741afSMartin Matuska		])
4897a7741afSMartin Matuska	])
4907a7741afSMartin Matuska])
4917a7741afSMartin Matuska
492eda14cbcSMatt Macydnl #
493eda14cbcSMatt Macydnl # Detect the QAT module to be built against, QAT provides hardware
494eda14cbcSMatt Macydnl # acceleration for data compression:
495eda14cbcSMatt Macydnl #
496eda14cbcSMatt Macydnl # https://01.org/intel-quickassist-technology
497eda14cbcSMatt Macydnl #
498eda14cbcSMatt Macydnl # 1) Download and install QAT driver from the above link
499eda14cbcSMatt Macydnl # 2) Start QAT driver in your system:
500eda14cbcSMatt Macydnl # 	 service qat_service start
501eda14cbcSMatt Macydnl # 3) Enable QAT in ZFS, e.g.:
502eda14cbcSMatt Macydnl # 	 ./configure --with-qat=<qat-driver-path>/QAT1.6
503eda14cbcSMatt Macydnl # 	 make
504eda14cbcSMatt Macydnl # 4) Set GZIP compression in ZFS dataset:
505eda14cbcSMatt Macydnl # 	 zfs set compression = gzip <dataset>
506eda14cbcSMatt Macydnl #
507eda14cbcSMatt Macydnl # Then the data written to this ZFS pool is compressed by QAT accelerator
508eda14cbcSMatt Macydnl # automatically, and de-compressed by QAT when read from the pool.
509eda14cbcSMatt Macydnl #
510eda14cbcSMatt Macydnl # 1) Get QAT hardware statistics with:
511eda14cbcSMatt Macydnl #	 cat /proc/icp_dh895xcc_dev/qat
512eda14cbcSMatt Macydnl # 2) To disable QAT:
513eda14cbcSMatt Macydnl # 	 insmod zfs.ko zfs_qat_disable=1
514eda14cbcSMatt Macydnl #
515eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_QAT], [
516eda14cbcSMatt Macy	AC_ARG_WITH([qat],
517eda14cbcSMatt Macy		AS_HELP_STRING([--with-qat=PATH],
518eda14cbcSMatt Macy		[Path to qat source]),
519eda14cbcSMatt Macy		AS_IF([test "$withval" = "yes"],
520eda14cbcSMatt Macy			AC_MSG_ERROR([--with-qat=PATH requires a PATH]),
521eda14cbcSMatt Macy			[qatsrc="$withval"]))
522eda14cbcSMatt Macy
523eda14cbcSMatt Macy	AC_ARG_WITH([qat-obj],
524eda14cbcSMatt Macy		AS_HELP_STRING([--with-qat-obj=PATH],
525eda14cbcSMatt Macy		[Path to qat build objects]),
526eda14cbcSMatt Macy		[qatbuild="$withval"])
527eda14cbcSMatt Macy
528eda14cbcSMatt Macy	AS_IF([test ! -z "${qatsrc}"], [
529eda14cbcSMatt Macy		AC_MSG_CHECKING([qat source directory])
530eda14cbcSMatt Macy		AC_MSG_RESULT([$qatsrc])
531eda14cbcSMatt Macy		QAT_SRC="${qatsrc}/quickassist"
532eda14cbcSMatt Macy		AS_IF([ test ! -e "$QAT_SRC/include/cpa.h"], [
533eda14cbcSMatt Macy			AC_MSG_ERROR([
534eda14cbcSMatt Macy	*** Please make sure the qat driver package is installed
535eda14cbcSMatt Macy	*** and specify the location of the qat source with the
536eda14cbcSMatt Macy	*** '--with-qat=PATH' option then try again. Failed to
537eda14cbcSMatt Macy	*** find cpa.h in:
538eda14cbcSMatt Macy	${QAT_SRC}/include])
539eda14cbcSMatt Macy		])
540eda14cbcSMatt Macy	])
541eda14cbcSMatt Macy
542eda14cbcSMatt Macy	AS_IF([test ! -z "${qatsrc}"], [
543eda14cbcSMatt Macy		AC_MSG_CHECKING([qat build directory])
544eda14cbcSMatt Macy		AS_IF([test -z "$qatbuild"], [
545eda14cbcSMatt Macy			qatbuild="${qatsrc}/build"
546eda14cbcSMatt Macy		])
547eda14cbcSMatt Macy
548eda14cbcSMatt Macy		AC_MSG_RESULT([$qatbuild])
549eda14cbcSMatt Macy		QAT_OBJ=${qatbuild}
550eda14cbcSMatt Macy		AS_IF([ ! test -e "$QAT_OBJ/icp_qa_al.ko" && ! test -e "$QAT_OBJ/qat_api.ko"], [
551eda14cbcSMatt Macy			AC_MSG_ERROR([
552eda14cbcSMatt Macy	*** Please make sure the qat driver is installed then try again.
553eda14cbcSMatt Macy	*** Failed to find icp_qa_al.ko or qat_api.ko in:
554eda14cbcSMatt Macy	$QAT_OBJ])
555eda14cbcSMatt Macy		])
556eda14cbcSMatt Macy
557eda14cbcSMatt Macy		AC_SUBST(QAT_SRC)
558eda14cbcSMatt Macy		AC_SUBST(QAT_OBJ)
559eda14cbcSMatt Macy
560eda14cbcSMatt Macy		AC_DEFINE(HAVE_QAT, 1,
561eda14cbcSMatt Macy		[qat is enabled and existed])
562eda14cbcSMatt Macy	])
563eda14cbcSMatt Macy
564eda14cbcSMatt Macy	dnl #
565eda14cbcSMatt Macy	dnl # Detect the name used for the QAT Module.symvers file.
566eda14cbcSMatt Macy	dnl #
567eda14cbcSMatt Macy	AS_IF([test ! -z "${qatsrc}"], [
568eda14cbcSMatt Macy		AC_MSG_CHECKING([qat file for module symbols])
569eda14cbcSMatt Macy		QAT_SYMBOLS=$QAT_SRC/lookaside/access_layer/src/Module.symvers
570eda14cbcSMatt Macy
571eda14cbcSMatt Macy		AS_IF([test -r $QAT_SYMBOLS], [
572eda14cbcSMatt Macy			AC_MSG_RESULT([$QAT_SYMBOLS])
573eda14cbcSMatt Macy			AC_SUBST(QAT_SYMBOLS)
574eda14cbcSMatt Macy		],[
575eda14cbcSMatt Macy			AC_MSG_ERROR([
576eda14cbcSMatt Macy	*** Please make sure the qat driver is installed then try again.
577eda14cbcSMatt Macy	*** Failed to find Module.symvers in:
578eda14cbcSMatt Macy	$QAT_SYMBOLS
579eda14cbcSMatt Macy			])
580eda14cbcSMatt Macy		])
581eda14cbcSMatt Macy	])
582eda14cbcSMatt Macy])
583eda14cbcSMatt Macy
584eda14cbcSMatt Macydnl #
585eda14cbcSMatt Macydnl # ZFS_LINUX_CONFTEST_H
586eda14cbcSMatt Macydnl #
587eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_CONFTEST_H], [
588eda14cbcSMatt Macytest -d build/$2 || mkdir -p build/$2
589eda14cbcSMatt Macycat - <<_ACEOF >build/$2/$2.h
590eda14cbcSMatt Macy$1
591eda14cbcSMatt Macy_ACEOF
592eda14cbcSMatt Macy])
593eda14cbcSMatt Macy
594eda14cbcSMatt Macydnl #
595eda14cbcSMatt Macydnl # ZFS_LINUX_CONFTEST_C
596eda14cbcSMatt Macydnl #
597eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_CONFTEST_C], [
598eda14cbcSMatt Macytest -d build/$2 || mkdir -p build/$2
599eda14cbcSMatt Macycat confdefs.h - <<_ACEOF >build/$2/$2.c
600eda14cbcSMatt Macy$1
601eda14cbcSMatt Macy_ACEOF
602eda14cbcSMatt Macy])
603eda14cbcSMatt Macy
604eda14cbcSMatt Macydnl #
605eda14cbcSMatt Macydnl # ZFS_LINUX_CONFTEST_MAKEFILE
606eda14cbcSMatt Macydnl #
607eda14cbcSMatt Macydnl # $1 - test case name
608eda14cbcSMatt Macydnl # $2 - add to top-level Makefile
609eda14cbcSMatt Macydnl # $3 - additional build flags
610eda14cbcSMatt Macydnl #
611eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_CONFTEST_MAKEFILE], [
612eda14cbcSMatt Macy	test -d build || mkdir -p build
613eda14cbcSMatt Macy	test -d build/$1 || mkdir -p build/$1
614eda14cbcSMatt Macy
615eda14cbcSMatt Macy	file=build/$1/Makefile
616eda14cbcSMatt Macy
617eda14cbcSMatt Macy	dnl # Example command line to manually build source.
618eda14cbcSMatt Macy	cat - <<_ACEOF >$file
619eda14cbcSMatt Macy# Example command line to manually build source
620eda14cbcSMatt Macy# make modules -C $LINUX_OBJ $ARCH_UM M=$PWD/build/$1
621eda14cbcSMatt Macy
622eda14cbcSMatt Macyccflags-y := -Werror $FRAME_LARGER_THAN
623eda14cbcSMatt Macy_ACEOF
624eda14cbcSMatt Macy
625eda14cbcSMatt Macy	dnl # Additional custom CFLAGS as requested.
626eda14cbcSMatt Macy	m4_ifval($3, [echo "ccflags-y += $3" >>$file], [])
627eda14cbcSMatt Macy
628eda14cbcSMatt Macy	dnl # Test case source
629eda14cbcSMatt Macy	echo "obj-m := $1.o" >>$file
630eda14cbcSMatt Macy
631eda14cbcSMatt Macy	AS_IF([test "x$2" = "xyes"], [echo "obj-m += $1/" >>build/Makefile], [])
632eda14cbcSMatt Macy])
633eda14cbcSMatt Macy
634eda14cbcSMatt Macydnl #
635eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_PROGRAM(C)([PROLOGUE], [BODY])
636eda14cbcSMatt Macydnl #
637eda14cbcSMatt Macym4_define([ZFS_LINUX_TEST_PROGRAM], [
6387877fdebSMatt Macy#include <linux/module.h>
639eda14cbcSMatt Macy$1
6407877fdebSMatt Macy
641eda14cbcSMatt Macyint
642eda14cbcSMatt Macymain (void)
643eda14cbcSMatt Macy{
644eda14cbcSMatt Macy$2
645eda14cbcSMatt Macy	;
646eda14cbcSMatt Macy	return 0;
647eda14cbcSMatt Macy}
6487877fdebSMatt Macy
6497877fdebSMatt MacyMODULE_DESCRIPTION("conftest");
6507877fdebSMatt MacyMODULE_AUTHOR(ZFS_META_AUTHOR);
6517877fdebSMatt MacyMODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE);
6527877fdebSMatt MacyMODULE_LICENSE($3);
653eda14cbcSMatt Macy])
654eda14cbcSMatt Macy
655eda14cbcSMatt Macydnl #
656eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_REMOVE
657eda14cbcSMatt Macydnl #
658eda14cbcSMatt Macydnl # Removes the specified test source and results.
659eda14cbcSMatt Macydnl #
660eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_REMOVE], [
661eda14cbcSMatt Macy	test -d build/$1 && rm -Rf build/$1
662eda14cbcSMatt Macy	test -f build/Makefile && sed '/$1/d' build/Makefile
663eda14cbcSMatt Macy])
664eda14cbcSMatt Macy
665eda14cbcSMatt Macydnl #
666eda14cbcSMatt Macydnl # ZFS_LINUX_COMPILE
667eda14cbcSMatt Macydnl #
668eda14cbcSMatt Macydnl # $1 - build dir
669eda14cbcSMatt Macydnl # $2 - test command
670eda14cbcSMatt Macydnl # $3 - pass command
671eda14cbcSMatt Macydnl # $4 - fail command
672eda14cbcSMatt Macydnl # $5 - set KBUILD_MODPOST_NOFINAL='yes'
673eda14cbcSMatt Macydnl # $6 - set KBUILD_MODPOST_WARN='yes'
674eda14cbcSMatt Macydnl #
675eda14cbcSMatt Macydnl # Used internally by ZFS_LINUX_TEST_{COMPILE,MODPOST}
676eda14cbcSMatt Macydnl #
677eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_COMPILE], [
678c03c5b1cSMartin Matuska	AC_ARG_VAR([KERNEL_CC], [C compiler for
679c03c5b1cSMartin Matuska		building kernel modules])
680c03c5b1cSMartin Matuska	AC_ARG_VAR([KERNEL_LD], [Linker for
681c03c5b1cSMartin Matuska		building kernel modules])
682c03c5b1cSMartin Matuska	AC_ARG_VAR([KERNEL_LLVM], [Binary option to
683c03c5b1cSMartin Matuska		build kernel modules with LLVM/CLANG toolchain])
684*dd215568SMartin Matuska	AC_ARG_VAR([KERNEL_CROSS_COMPILE], [Cross compile prefix
685*dd215568SMartin Matuska		for kernel module builds])
686*dd215568SMartin Matuska	AC_ARG_VAR([KERNEL_ARCH], [Architecture to build kernel modules for])
687eda14cbcSMatt Macy	AC_TRY_COMMAND([
688eda14cbcSMatt Macy	    KBUILD_MODPOST_NOFINAL="$5" KBUILD_MODPOST_WARN="$6"
689716fd348SMartin Matuska	    make modules -k -j$TEST_JOBS ${KERNEL_CC:+CC=$KERNEL_CC}
690716fd348SMartin Matuska	    ${KERNEL_LD:+LD=$KERNEL_LD} ${KERNEL_LLVM:+LLVM=$KERNEL_LLVM}
691716fd348SMartin Matuska	    CONFIG_MODULES=y CFLAGS_MODULE=-DCONFIG_MODULES
692*dd215568SMartin Matuska	    ${KERNEL_CROSS_COMPILE:+CROSS_COMPILE=$KERNEL_CROSS_COMPILE}
693*dd215568SMartin Matuska	    ${KERNEL_ARCH:+ARCH=$KERNEL_ARCH}
694716fd348SMartin Matuska	    -C $LINUX_OBJ $ARCH_UM M=$PWD/$1 >$1/build.log 2>&1])
695eda14cbcSMatt Macy	AS_IF([AC_TRY_COMMAND([$2])], [$3], [$4])
696eda14cbcSMatt Macy])
697eda14cbcSMatt Macy
698eda14cbcSMatt Macydnl #
699eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_COMPILE
700eda14cbcSMatt Macydnl #
701eda14cbcSMatt Macydnl # Perform a full compile excluding the final modpost phase.
702eda14cbcSMatt Macydnl #
703eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_COMPILE], [
704eda14cbcSMatt Macy	ZFS_LINUX_COMPILE([$2], [test -f $2/build.log], [
705eda14cbcSMatt Macy		mv $2/Makefile $2/Makefile.compile.$1
706eda14cbcSMatt Macy		mv $2/build.log $2/build.log.$1
707eda14cbcSMatt Macy	],[
708eda14cbcSMatt Macy	        AC_MSG_ERROR([
709eda14cbcSMatt Macy        *** Unable to compile test source to determine kernel interfaces.])
710eda14cbcSMatt Macy	], [yes], [])
711eda14cbcSMatt Macy])
712eda14cbcSMatt Macy
713eda14cbcSMatt Macydnl #
714eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_MODPOST
715eda14cbcSMatt Macydnl #
716eda14cbcSMatt Macydnl # Perform a full compile including the modpost phase.  This may
717eda14cbcSMatt Macydnl # be an incremental build if the objects have already been built.
718eda14cbcSMatt Macydnl #
719eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_MODPOST], [
720eda14cbcSMatt Macy	ZFS_LINUX_COMPILE([$2], [test -f $2/build.log], [
721eda14cbcSMatt Macy		mv $2/Makefile $2/Makefile.modpost.$1
722eda14cbcSMatt Macy		cat $2/build.log >>build/build.log.$1
723eda14cbcSMatt Macy	],[
724eda14cbcSMatt Macy	        AC_MSG_ERROR([
725eda14cbcSMatt Macy        *** Unable to modpost test source to determine kernel interfaces.])
726eda14cbcSMatt Macy	], [], [yes])
727eda14cbcSMatt Macy])
728eda14cbcSMatt Macy
729eda14cbcSMatt Macydnl #
730eda14cbcSMatt Macydnl # Perform the compilation of the test cases in two phases.
731eda14cbcSMatt Macydnl #
732eda14cbcSMatt Macydnl # Phase 1) attempt to build the object files for all of the tests
733eda14cbcSMatt Macydnl #          defined by the ZFS_LINUX_TEST_SRC macro.  But do not
734eda14cbcSMatt Macydnl #          perform the final modpost stage.
735eda14cbcSMatt Macydnl #
736eda14cbcSMatt Macydnl # Phase 2) disable all tests which failed the initial compilation,
737eda14cbcSMatt Macydnl #          then invoke the final modpost step for the remaining tests.
738eda14cbcSMatt Macydnl #
739eda14cbcSMatt Macydnl # This allows us efficiently build the test cases in parallel while
740eda14cbcSMatt Macydnl # remaining resilient to build failures which are expected when
741eda14cbcSMatt Macydnl # detecting the available kernel interfaces.
742eda14cbcSMatt Macydnl #
743eda14cbcSMatt Macydnl # The maximum allowed parallelism can be controlled by setting the
744eda14cbcSMatt Macydnl # TEST_JOBS environment variable.  Otherwise, it default to $(nproc).
745eda14cbcSMatt Macydnl #
746eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_COMPILE_ALL], [
747eda14cbcSMatt Macy	dnl # Phase 1 - Compilation only, final linking is skipped.
748eda14cbcSMatt Macy	ZFS_LINUX_TEST_COMPILE([$1], [build])
749eda14cbcSMatt Macy
750eda14cbcSMatt Macy	dnl #
751eda14cbcSMatt Macy	dnl # Phase 2 - When building external modules disable test cases
752eda14cbcSMatt Macy	dnl # which failed to compile and invoke modpost to verify the
753eda14cbcSMatt Macy	dnl # final linking.
754eda14cbcSMatt Macy	dnl #
755eda14cbcSMatt Macy	dnl # Test names suffixed with '_license' call modpost independently
756eda14cbcSMatt Macy	dnl # to ensure that a single incompatibility does not result in the
757eda14cbcSMatt Macy	dnl # modpost phase exiting early.  This check is not performed on
758eda14cbcSMatt Macy	dnl # every symbol since the majority are compatible and doing so
759eda14cbcSMatt Macy	dnl # would significantly slow down this phase.
760eda14cbcSMatt Macy	dnl #
761eda14cbcSMatt Macy	dnl # When configuring for builtin (--enable-linux-builtin)
762eda14cbcSMatt Macy	dnl # fake the linking step artificially create the expected .ko
763eda14cbcSMatt Macy	dnl # files for tests which did compile.  This is required for
764eda14cbcSMatt Macy	dnl # kernels which do not have loadable module support or have
765eda14cbcSMatt Macy	dnl # not yet been built.
766eda14cbcSMatt Macy	dnl #
767eda14cbcSMatt Macy	AS_IF([test "x$enable_linux_builtin" = "xno"], [
768eda14cbcSMatt Macy		for dir in $(awk '/^obj-m/ { print [$]3 }' \
769eda14cbcSMatt Macy		    build/Makefile.compile.$1); do
770eda14cbcSMatt Macy			name=${dir%/}
771eda14cbcSMatt Macy			AS_IF([test -f build/$name/$name.o], [
772eda14cbcSMatt Macy				AS_IF([test "${name##*_}" = "license"], [
773eda14cbcSMatt Macy					ZFS_LINUX_TEST_MODPOST([$1],
774eda14cbcSMatt Macy					    [build/$name])
775eda14cbcSMatt Macy					echo "obj-n += $dir" >>build/Makefile
776eda14cbcSMatt Macy				], [
777eda14cbcSMatt Macy					echo "obj-m += $dir" >>build/Makefile
778eda14cbcSMatt Macy				])
779eda14cbcSMatt Macy			], [
780eda14cbcSMatt Macy				echo "obj-n += $dir" >>build/Makefile
781eda14cbcSMatt Macy			])
782eda14cbcSMatt Macy		done
783eda14cbcSMatt Macy
784eda14cbcSMatt Macy		ZFS_LINUX_TEST_MODPOST([$1], [build])
785eda14cbcSMatt Macy	], [
786eda14cbcSMatt Macy		for dir in $(awk '/^obj-m/ { print [$]3 }' \
787eda14cbcSMatt Macy		    build/Makefile.compile.$1); do
788eda14cbcSMatt Macy			name=${dir%/}
789eda14cbcSMatt Macy			AS_IF([test -f build/$name/$name.o], [
790eda14cbcSMatt Macy				touch build/$name/$name.ko
791eda14cbcSMatt Macy			])
792eda14cbcSMatt Macy		done
793eda14cbcSMatt Macy	])
794eda14cbcSMatt Macy])
795eda14cbcSMatt Macy
796eda14cbcSMatt Macydnl #
797eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_SRC
798eda14cbcSMatt Macydnl #
799eda14cbcSMatt Macydnl # $1 - name
800eda14cbcSMatt Macydnl # $2 - global
801eda14cbcSMatt Macydnl # $3 - source
802eda14cbcSMatt Macydnl # $4 - extra cflags
803eda14cbcSMatt Macydnl # $5 - check license-compatibility
804eda14cbcSMatt Macydnl #
8057877fdebSMatt Macydnl # Check if the test source is buildable at all and then if it is
8067877fdebSMatt Macydnl # license compatible.
8077877fdebSMatt Macydnl #
808eda14cbcSMatt Macydnl # N.B because all of the test cases are compiled in parallel they
809eda14cbcSMatt Macydnl # must never depend on the results of previous tests.  Each test
810eda14cbcSMatt Macydnl # needs to be entirely independent.
811eda14cbcSMatt Macydnl #
812eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_SRC], [
8137877fdebSMatt Macy	ZFS_LINUX_CONFTEST_C([ZFS_LINUX_TEST_PROGRAM([[$2]], [[$3]],
8147877fdebSMatt Macy	    [["Dual BSD/GPL"]])], [$1])
815eda14cbcSMatt Macy	ZFS_LINUX_CONFTEST_MAKEFILE([$1], [yes], [$4])
816eda14cbcSMatt Macy
817eda14cbcSMatt Macy	AS_IF([ test -n "$5" ], [
8187877fdebSMatt Macy		ZFS_LINUX_CONFTEST_C([ZFS_LINUX_TEST_PROGRAM(
8197877fdebSMatt Macy		    [[$2]], [[$3]], [[$5]])], [$1_license])
820eda14cbcSMatt Macy		ZFS_LINUX_CONFTEST_MAKEFILE([$1_license], [yes], [$4])
821eda14cbcSMatt Macy	])
822eda14cbcSMatt Macy])
823eda14cbcSMatt Macy
824eda14cbcSMatt Macydnl #
825eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_RESULT
826eda14cbcSMatt Macydnl #
827eda14cbcSMatt Macydnl # $1 - name of a test source (ZFS_LINUX_TEST_SRC)
828eda14cbcSMatt Macydnl # $2 - run on success (valid .ko generated)
829eda14cbcSMatt Macydnl # $3 - run on failure (unable to compile)
830eda14cbcSMatt Macydnl #
831eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_RESULT], [
832eda14cbcSMatt Macy	AS_IF([test -d build/$1], [
833eda14cbcSMatt Macy		AS_IF([test -f build/$1/$1.ko], [$2], [$3])
834eda14cbcSMatt Macy	], [
835eda14cbcSMatt Macy		AC_MSG_ERROR([
836eda14cbcSMatt Macy	*** No matching source for the "$1" test, check that
837eda14cbcSMatt Macy	*** both the test source and result macros refer to the same name.
838eda14cbcSMatt Macy		])
839eda14cbcSMatt Macy	])
840eda14cbcSMatt Macy])
841eda14cbcSMatt Macy
842eda14cbcSMatt Macydnl #
843eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_ERROR
844eda14cbcSMatt Macydnl #
845eda14cbcSMatt Macydnl # Generic error message which can be used when none of the expected
846eda14cbcSMatt Macydnl # kernel interfaces were detected.
847eda14cbcSMatt Macydnl #
848eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_ERROR], [
849eda14cbcSMatt Macy	AC_MSG_ERROR([
850eda14cbcSMatt Macy	*** None of the expected "$1" interfaces were detected.
851eda14cbcSMatt Macy	*** This may be because your kernel version is newer than what is
852eda14cbcSMatt Macy	*** supported, or you are using a patched custom kernel with
853eda14cbcSMatt Macy	*** incompatible modifications.
854eda14cbcSMatt Macy	***
855eda14cbcSMatt Macy	*** ZFS Version: $ZFS_META_ALIAS
856eda14cbcSMatt Macy	*** Compatible Kernels: $ZFS_META_KVER_MIN - $ZFS_META_KVER_MAX
857eda14cbcSMatt Macy	])
858eda14cbcSMatt Macy])
859eda14cbcSMatt Macy
860eda14cbcSMatt Macydnl #
861eda14cbcSMatt Macydnl # ZFS_LINUX_TEST_RESULT_SYMBOL
862eda14cbcSMatt Macydnl #
863eda14cbcSMatt Macydnl # Like ZFS_LINUX_TEST_RESULT except ZFS_CHECK_SYMBOL_EXPORT is called to
864eda14cbcSMatt Macydnl # verify symbol exports, unless --enable-linux-builtin was provided to
865eda14cbcSMatt Macydnl # configure.
866eda14cbcSMatt Macydnl #
867eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TEST_RESULT_SYMBOL], [
868eda14cbcSMatt Macy	AS_IF([ ! test -f build/$1/$1.ko], [
869eda14cbcSMatt Macy		$5
870eda14cbcSMatt Macy	], [
871eda14cbcSMatt Macy		AS_IF([test "x$enable_linux_builtin" != "xyes"], [
872eda14cbcSMatt Macy			ZFS_CHECK_SYMBOL_EXPORT([$2], [$3], [$4], [$5])
873eda14cbcSMatt Macy		], [
874eda14cbcSMatt Macy			$4
875eda14cbcSMatt Macy		])
876eda14cbcSMatt Macy	])
877eda14cbcSMatt Macy])
878eda14cbcSMatt Macy
879eda14cbcSMatt Macydnl #
880eda14cbcSMatt Macydnl # ZFS_LINUX_COMPILE_IFELSE
881eda14cbcSMatt Macydnl #
882eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [
883eda14cbcSMatt Macy	ZFS_LINUX_TEST_REMOVE([conftest])
884eda14cbcSMatt Macy
885eda14cbcSMatt Macy	m4_ifvaln([$1], [ZFS_LINUX_CONFTEST_C([$1], [conftest])])
886eda14cbcSMatt Macy	m4_ifvaln([$5], [ZFS_LINUX_CONFTEST_H([$5], [conftest])],
887eda14cbcSMatt Macy	    [ZFS_LINUX_CONFTEST_H([], [conftest])])
888eda14cbcSMatt Macy
889eda14cbcSMatt Macy	ZFS_LINUX_CONFTEST_MAKEFILE([conftest], [no],
890eda14cbcSMatt Macy	    [m4_ifvaln([$5], [-I$PWD/build/conftest], [])])
891eda14cbcSMatt Macy	ZFS_LINUX_COMPILE([build/conftest], [$2], [$3], [$4], [], [])
892eda14cbcSMatt Macy])
893eda14cbcSMatt Macy
894eda14cbcSMatt Macydnl #
895eda14cbcSMatt Macydnl # ZFS_LINUX_TRY_COMPILE
896eda14cbcSMatt Macydnl #
897eda14cbcSMatt Macydnl # $1 - global
898eda14cbcSMatt Macydnl # $2 - source
899eda14cbcSMatt Macydnl # $3 - run on success (valid .ko generated)
900eda14cbcSMatt Macydnl # $4 - run on failure (unable to compile)
901eda14cbcSMatt Macydnl #
902eda14cbcSMatt Macydnl # When configuring as builtin (--enable-linux-builtin) for kernels
903eda14cbcSMatt Macydnl # without loadable module support (CONFIG_MODULES=n) only the object
904eda14cbcSMatt Macydnl # file is created.  See ZFS_LINUX_TEST_COMPILE_ALL for details.
905eda14cbcSMatt Macydnl #
906eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TRY_COMPILE], [
907eda14cbcSMatt Macy	AS_IF([test "x$enable_linux_builtin" = "xyes"], [
908eda14cbcSMatt Macy		ZFS_LINUX_COMPILE_IFELSE(
9097877fdebSMatt Macy		    [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
9107877fdebSMatt Macy		    [[ZFS_META_LICENSE]])],
911eda14cbcSMatt Macy		    [test -f build/conftest/conftest.o], [$3], [$4])
912eda14cbcSMatt Macy	], [
913eda14cbcSMatt Macy		ZFS_LINUX_COMPILE_IFELSE(
9147877fdebSMatt Macy		    [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
9157877fdebSMatt Macy		    [[ZFS_META_LICENSE]])],
916eda14cbcSMatt Macy		    [test -f build/conftest/conftest.ko], [$3], [$4])
917eda14cbcSMatt Macy	])
918eda14cbcSMatt Macy])
919eda14cbcSMatt Macy
920eda14cbcSMatt Macydnl #
921eda14cbcSMatt Macydnl # ZFS_CHECK_SYMBOL_EXPORT
922eda14cbcSMatt Macydnl #
923eda14cbcSMatt Macydnl # Check if a symbol is exported on not by consulting the symbols
924eda14cbcSMatt Macydnl # file, or optionally the source code.
925eda14cbcSMatt Macydnl #
926eda14cbcSMatt MacyAC_DEFUN([ZFS_CHECK_SYMBOL_EXPORT], [
927eda14cbcSMatt Macy	grep -q -E '[[[:space:]]]$1[[[:space:]]]' \
928eda14cbcSMatt Macy		$LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null
929eda14cbcSMatt Macy	rc=$?
930eda14cbcSMatt Macy	if test $rc -ne 0; then
931eda14cbcSMatt Macy		export=0
932eda14cbcSMatt Macy		for file in $2; do
933eda14cbcSMatt Macy			grep -q -E "EXPORT_SYMBOL.*($1)" \
934eda14cbcSMatt Macy				"$LINUX/$file" 2>/dev/null
935eda14cbcSMatt Macy			rc=$?
936eda14cbcSMatt Macy			if test $rc -eq 0; then
937eda14cbcSMatt Macy				export=1
938eda14cbcSMatt Macy				break;
939eda14cbcSMatt Macy			fi
940eda14cbcSMatt Macy		done
941eda14cbcSMatt Macy		if test $export -eq 0; then :
942eda14cbcSMatt Macy			$4
943eda14cbcSMatt Macy		else :
944eda14cbcSMatt Macy			$3
945eda14cbcSMatt Macy		fi
946eda14cbcSMatt Macy	else :
947eda14cbcSMatt Macy		$3
948eda14cbcSMatt Macy	fi
949eda14cbcSMatt Macy])
950eda14cbcSMatt Macy
951eda14cbcSMatt Macydnl #
952eda14cbcSMatt Macydnl # ZFS_LINUX_TRY_COMPILE_SYMBOL
953eda14cbcSMatt Macydnl #
954eda14cbcSMatt Macydnl # Like ZFS_LINUX_TRY_COMPILER except ZFS_CHECK_SYMBOL_EXPORT is called
955eda14cbcSMatt Macydnl # to verify symbol exports, unless --enable-linux-builtin was provided
956eda14cbcSMatt Macydnl # to configure.
957eda14cbcSMatt Macydnl #
958eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TRY_COMPILE_SYMBOL], [
959eda14cbcSMatt Macy	ZFS_LINUX_TRY_COMPILE([$1], [$2], [rc=0], [rc=1])
960eda14cbcSMatt Macy	if test $rc -ne 0; then :
961eda14cbcSMatt Macy		$6
962eda14cbcSMatt Macy	else
963eda14cbcSMatt Macy		if test "x$enable_linux_builtin" != xyes; then
964eda14cbcSMatt Macy			ZFS_CHECK_SYMBOL_EXPORT([$3], [$4], [rc=0], [rc=1])
965eda14cbcSMatt Macy		fi
966eda14cbcSMatt Macy		if test $rc -ne 0; then :
967eda14cbcSMatt Macy			$6
968eda14cbcSMatt Macy		else :
969eda14cbcSMatt Macy			$5
970eda14cbcSMatt Macy		fi
971eda14cbcSMatt Macy	fi
972eda14cbcSMatt Macy])
973eda14cbcSMatt Macy
974eda14cbcSMatt Macydnl #
975eda14cbcSMatt Macydnl # ZFS_LINUX_TRY_COMPILE_HEADER
976eda14cbcSMatt Macydnl # like ZFS_LINUX_TRY_COMPILE, except the contents conftest.h are
977eda14cbcSMatt Macydnl # provided via the fifth parameter
978eda14cbcSMatt Macydnl #
979eda14cbcSMatt MacyAC_DEFUN([ZFS_LINUX_TRY_COMPILE_HEADER], [
980dbd5678dSMartin Matuska	AS_IF([test "x$enable_linux_builtin" = "xyes"], [
981eda14cbcSMatt Macy		ZFS_LINUX_COMPILE_IFELSE(
982dbd5678dSMartin Matuska		    [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
983dbd5678dSMartin Matuska		    [[ZFS_META_LICENSE]])],
984dbd5678dSMartin Matuska		    [test -f build/conftest/conftest.o], [$3], [$4], [$5])
985dbd5678dSMartin Matuska	], [
986dbd5678dSMartin Matuska		ZFS_LINUX_COMPILE_IFELSE(
987dbd5678dSMartin Matuska		    [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
988dbd5678dSMartin Matuska		    [[ZFS_META_LICENSE]])],
989dbd5678dSMartin Matuska		    [test -f build/conftest/conftest.ko], [$3], [$4], [$5])
990dbd5678dSMartin Matuska	])
991eda14cbcSMatt Macy])
99215f0b8c3SMartin Matuska
99315f0b8c3SMartin Matuskadnl #
99415f0b8c3SMartin Matuskadnl # AS_VERSION_COMPARE_LE
99515f0b8c3SMartin Matuskadnl # like AS_VERSION_COMPARE_LE, but runs $3 if (and only if) $1 <= $2
99615f0b8c3SMartin Matuskadnl # AS_VERSION_COMPARE_LE (version-1, version-2, [action-if-less-or-equal], [action-if-greater])
99715f0b8c3SMartin Matuskadnl #
99815f0b8c3SMartin MatuskaAC_DEFUN([AS_VERSION_COMPARE_LE], [
99915f0b8c3SMartin Matuska	AS_VERSION_COMPARE([$1], [$2], [$3], [$3], [$4])
100015f0b8c3SMartin Matuska])
100115f0b8c3SMartin Matuska
100215f0b8c3SMartin Matuskadnl #
100315f0b8c3SMartin Matuskadnl # ZFS_LINUX_REQUIRE_API
100415f0b8c3SMartin Matuskadnl # like ZFS_LINUX_TEST_ERROR, except only fails if the kernel is
100515f0b8c3SMartin Matuskadnl # at least some specified version.
100615f0b8c3SMartin Matuskadnl #
100715f0b8c3SMartin MatuskaAC_DEFUN([ZFS_LINUX_REQUIRE_API], [
100815f0b8c3SMartin Matuska	AS_VERSION_COMPARE_LE([$2], [$kernsrcver], [
100915f0b8c3SMartin Matuska		AC_MSG_ERROR([
101015f0b8c3SMartin Matuska		*** None of the expected "$1" interfaces were detected. This
101115f0b8c3SMartin Matuska		*** interface is expected for kernels version "$2" and above.
101215f0b8c3SMartin Matuska		*** This may be because your kernel version is newer than what is
101315f0b8c3SMartin Matuska		*** supported, or you are using a patched custom kernel with
101415f0b8c3SMartin Matuska		*** incompatible modifications.  Newer kernels may have incompatible
101515f0b8c3SMartin Matuska		*** APIs.
101615f0b8c3SMartin Matuska		***
101715f0b8c3SMartin Matuska		*** ZFS Version: $ZFS_META_ALIAS
101815f0b8c3SMartin Matuska		*** Compatible Kernels: $ZFS_META_KVER_MIN - $ZFS_META_KVER_MAX
101915f0b8c3SMartin Matuska		])
102015f0b8c3SMartin Matuska	], [
102115f0b8c3SMartin Matuska		AC_MSG_RESULT(no)
102215f0b8c3SMartin Matuska	])
102315f0b8c3SMartin Matuska])
1024