xref: /src/sys/contrib/openzfs/config/zfs-build.m4 (revision 80aae8a3f8aa70712930664572be9e6885dc0be7)
1dnl # SPDX-License-Identifier: CDDL-1.0
2AC_DEFUN([ZFS_AC_LICENSE], [
3	AC_MSG_CHECKING([zfs author])
4	AC_MSG_RESULT([$ZFS_META_AUTHOR])
5
6	AC_MSG_CHECKING([zfs license])
7	AC_MSG_RESULT([$ZFS_META_LICENSE])
8])
9
10AC_DEFUN([ZFS_AC_DEBUG_ENABLE], [
11	DEBUG_CFLAGS="-Werror"
12	DEBUG_CPPFLAGS="-DDEBUG -UNDEBUG"
13	DEBUG_LDFLAGS=""
14	DEBUG_ZFS="_with_debug"
15	WITH_DEBUG="true"
16	AC_DEFINE(ZFS_DEBUG, 1, [zfs debugging enabled])
17
18	KERNEL_DEBUG_CFLAGS="-Werror"
19	KERNEL_DEBUG_CPPFLAGS="-DDEBUG -UNDEBUG"
20])
21
22AC_DEFUN([ZFS_AC_DEBUG_DISABLE], [
23	DEBUG_CFLAGS=""
24	DEBUG_CPPFLAGS="-UDEBUG -DNDEBUG"
25	DEBUG_LDFLAGS=""
26	DEBUG_ZFS="_without_debug"
27	WITH_DEBUG=""
28
29	KERNEL_DEBUG_CFLAGS=""
30	KERNEL_DEBUG_CPPFLAGS="-UDEBUG -DNDEBUG"
31])
32
33dnl #
34dnl # When debugging is enabled:
35dnl # - Enable all ASSERTs (-DDEBUG)
36dnl # - Promote all compiler warnings to errors (-Werror)
37dnl #
38dnl # (If INVARIANTS is detected, we need to force DEBUG, or strange panics
39dnl # can ensue.)
40dnl #
41AC_DEFUN([ZFS_AC_DEBUG], [
42	AC_MSG_CHECKING([whether assertion support will be enabled])
43	AC_ARG_ENABLE([debug],
44		[AS_HELP_STRING([--enable-debug],
45		[Enable compiler and code assertions @<:@default=no@:>@])],
46		[],
47		[enable_debug=no])
48
49	AS_CASE(["x$enable_debug"],
50		["xyes"],
51		[ZFS_AC_DEBUG_ENABLE],
52		["xno"],
53		[ZFS_AC_DEBUG_DISABLE],
54		[AC_MSG_ERROR([Unknown option $enable_debug])])
55
56	AS_CASE(["x$enable_invariants"],
57		["xyes"],
58		[],
59		["xno"],
60		[],
61		[ZFS_AC_DEBUG_INVARIANTS_DETECT])
62
63	AS_CASE(["x$enable_invariants"],
64		["xyes"],
65		[ZFS_AC_DEBUG_ENABLE],
66		["xno"],
67		[],
68		[AC_MSG_ERROR([Unknown option $enable_invariants])])
69
70	AC_SUBST(DEBUG_CFLAGS)
71	AC_SUBST(DEBUG_CPPFLAGS)
72	AC_SUBST(DEBUG_LDFLAGS)
73	AC_SUBST(DEBUG_ZFS)
74	AC_SUBST(WITH_DEBUG)
75
76	AC_SUBST(KERNEL_DEBUG_CFLAGS)
77	AC_SUBST(KERNEL_DEBUG_CPPFLAGS)
78
79	AC_MSG_RESULT([$enable_debug])
80])
81
82AC_DEFUN([ZFS_AC_DEBUGINFO_ENABLE], [
83	DEBUG_CFLAGS="$DEBUG_CFLAGS -g -fno-inline $NO_IPA_SRA"
84
85	KERNEL_DEBUG_CFLAGS="$KERNEL_DEBUG_CFLAGS -fno-inline $KERNEL_NO_IPA_SRA"
86	KERNEL_MAKE="$KERNEL_MAKE CONFIG_DEBUG_INFO=y"
87
88	DEBUGINFO_ZFS="_with_debuginfo"
89])
90
91AC_DEFUN([ZFS_AC_DEBUGINFO_DISABLE], [
92	DEBUGINFO_ZFS="_without_debuginfo"
93])
94
95AC_DEFUN([ZFS_AC_DEBUGINFO], [
96	AC_MSG_CHECKING([whether debuginfo support will be forced])
97	AC_ARG_ENABLE([debuginfo],
98		[AS_HELP_STRING([--enable-debuginfo],
99		[Force generation of debuginfo @<:@default=no@:>@])],
100		[],
101		[enable_debuginfo=no])
102
103	AS_CASE(["x$enable_debuginfo"],
104		["xyes"],
105		[ZFS_AC_DEBUGINFO_ENABLE],
106		["xno"],
107		[ZFS_AC_DEBUGINFO_DISABLE],
108		[AC_MSG_ERROR([Unknown option $enable_debuginfo])])
109
110	AC_SUBST(DEBUG_CFLAGS)
111	AC_SUBST(DEBUGINFO_ZFS)
112
113	AC_SUBST(KERNEL_DEBUG_CFLAGS)
114	AC_SUBST(KERNEL_MAKE)
115
116	AC_MSG_RESULT([$enable_debuginfo])
117])
118
119dnl #
120dnl # Disabled by default, provides basic memory tracking.  Track the total
121dnl # number of bytes allocated with kmem_alloc() and freed with kmem_free().
122dnl # Then at module unload time if any bytes were leaked it will be reported
123dnl # on the console.
124dnl #
125AC_DEFUN([ZFS_AC_DEBUG_KMEM], [
126	AC_MSG_CHECKING([whether basic kmem accounting is enabled])
127	AC_ARG_ENABLE([debug-kmem],
128		[AS_HELP_STRING([--enable-debug-kmem],
129		[Enable basic kmem accounting @<:@default=no@:>@])],
130		[],
131		[enable_debug_kmem=no])
132
133	AS_IF([test "x$enable_debug_kmem" = xyes], [
134		KERNEL_DEBUG_CPPFLAGS="${KERNEL_DEBUG_CPPFLAGS} -DDEBUG_KMEM"
135		DEBUG_KMEM_ZFS="_with_debug_kmem"
136	], [
137		DEBUG_KMEM_ZFS="_without_debug_kmem"
138	])
139
140	AC_SUBST(KERNEL_DEBUG_CPPFLAGS)
141	AC_SUBST(DEBUG_KMEM_ZFS)
142
143	AC_MSG_RESULT([$enable_debug_kmem])
144])
145
146dnl #
147dnl # Disabled by default, provides detailed memory tracking.  This feature
148dnl # also requires --enable-debug-kmem to be set.  When enabled not only will
149dnl # total bytes be tracked but also the location of every kmem_alloc() and
150dnl # kmem_free().  When the module is unloaded a list of all leaked addresses
151dnl # and where they were allocated will be dumped to the console.  Enabling
152dnl # this feature has a significant impact on performance but it makes finding
153dnl # memory leaks straight forward.
154dnl #
155AC_DEFUN([ZFS_AC_DEBUG_KMEM_TRACKING], [
156	AC_MSG_CHECKING([whether detailed kmem tracking is enabled])
157	AC_ARG_ENABLE([debug-kmem-tracking],
158		[AS_HELP_STRING([--enable-debug-kmem-tracking],
159		[Enable detailed kmem tracking  @<:@default=no@:>@])],
160		[],
161		[enable_debug_kmem_tracking=no])
162
163	AS_IF([test "x$enable_debug_kmem_tracking" = xyes], [
164		KERNEL_DEBUG_CPPFLAGS="${KERNEL_DEBUG_CPPFLAGS} -DDEBUG_KMEM_TRACKING"
165		DEBUG_KMEM_TRACKING_ZFS="_with_debug_kmem_tracking"
166	], [
167		DEBUG_KMEM_TRACKING_ZFS="_without_debug_kmem_tracking"
168	])
169
170	AC_SUBST(KERNEL_DEBUG_CPPFLAGS)
171	AC_SUBST(DEBUG_KMEM_TRACKING_ZFS)
172
173	AC_MSG_RESULT([$enable_debug_kmem_tracking])
174])
175
176AC_DEFUN([ZFS_AC_DEBUG_INVARIANTS_DETECT_FREEBSD], [
177	AS_IF([sysctl -n kern.conftxt | grep -Fqx $'options\tINVARIANTS'],
178		[enable_invariants="yes"],
179		[enable_invariants="no"])
180])
181
182AC_DEFUN([ZFS_AC_DEBUG_INVARIANTS_DETECT], [
183	AM_COND_IF([BUILD_FREEBSD],
184		[ZFS_AC_DEBUG_INVARIANTS_DETECT_FREEBSD],
185		[enable_invariants="no"])
186])
187
188dnl #
189dnl # Detected for the running kernel by default, enables INVARIANTS features
190dnl # in the FreeBSD kernel module.  This feature must be used when building
191dnl # for a FreeBSD kernel with "options INVARIANTS" in the KERNCONF and must
192dnl # not be used when the INVARIANTS option is absent.
193dnl #
194AC_DEFUN([ZFS_AC_DEBUG_INVARIANTS], [
195	AC_MSG_CHECKING([whether FreeBSD kernel INVARIANTS checks are enabled])
196	AC_ARG_ENABLE([invariants],
197		[AS_HELP_STRING([--enable-invariants],
198		[Enable FreeBSD kernel INVARIANTS checks [[default: detect]]])],
199		[], [ZFS_AC_DEBUG_INVARIANTS_DETECT])
200
201	AS_IF([test "x$enable_invariants" = xyes],
202		[WITH_INVARIANTS="true"],
203		[WITH_INVARIANTS=""])
204	AC_SUBST(WITH_INVARIANTS)
205
206	AC_MSG_RESULT([$enable_invariants])
207])
208
209dnl # Disabled by default. If enabled allows a configured "turn objtools
210dnl # warnings into errors" (CONFIG_OBJTOOL_WERROR) behavior to take effect.
211dnl # If disabled, objtool warnings are never turned into errors. It can't
212dnl # be enabled if the kernel wasn't compiled with CONFIG_OBJTOOL_WERROR=y.
213dnl #
214AC_DEFUN([ZFS_AC_OBJTOOL_WERROR], [
215	AC_MSG_CHECKING([whether objtool error on warning behavior is enabled])
216	AC_ARG_ENABLE([objtool-werror],
217		[AS_HELP_STRING([--enable-objtool-werror],
218		[Enable objtool's error on warning behaviour if present @<:@default=no@:>@])],
219		[enable_objtool_werror=$enableval],
220		[enable_objtool_werror=no])
221	AC_MSG_RESULT([$enable_objtool_werror])
222
223	AS_IF([test x$CONFIG_OBJTOOL_WERROR_DEFINED = xyes],[
224		AS_IF([test x$enable_objtool_werror = xyes],[
225			AC_MSG_NOTICE([enable-objtool-werror defined, keeping -Werror ])
226		],[
227			AC_MSG_NOTICE([enable-objtool-werror undefined, disabling -Werror ])
228			OBJTOOL_DISABLE_WERROR=y
229			abs_objtool_binary=$kernelbuild/tools/objtool/objtool
230			AS_IF([test -x $abs_objtool_binary],[],[
231				AC_MSG_ERROR([*** objtool binary $abs_objtool_binary not found])
232			])
233			dnl # The path to the wrapper is defined in modules/Makefile.in.
234		])
235	],[
236		dnl # We can't enable --Werror if it's not there.
237		AS_IF([test x$enable_objtool_werror = xyes],[
238			AC_MSG_ERROR([
239	*** Cannot enable objtool-werror,
240	*** a kernel built with CONFIG_OBJTOOL_WERROR=y is required.
241			])
242		],[])
243	])
244
245	AC_SUBST(OBJTOOL_DISABLE_WERROR)
246	AC_SUBST(abs_objtool_binary)
247])
248
249AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
250	AX_COUNT_CPUS([])
251	AC_SUBST(CPU_COUNT)
252
253	ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED
254	ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION
255	ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION
256	ZFS_AC_CONFIG_ALWAYS_CC_NO_ATOMIC_ALIGNMENT
257	ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH
258	ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN
259	ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION
260	ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH
261	ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_FORMAT_ZERO_LENGTH
262	ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW
263	ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER
264	ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA
265	ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA
266	ZFS_AC_CONFIG_ALWAYS_CC_ASAN
267	ZFS_AC_CONFIG_ALWAYS_CC_UBSAN
268	ZFS_AC_TOOLCHAIN_SIMD
269	ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_CFI_PSEUDO_OP
270	ZFS_AC_CONFIG_ALWAYS_SYSTEM
271	ZFS_AC_CONFIG_ALWAYS_ARCH
272	ZFS_AC_CONFIG_CHECK_ARCH_VAR
273	ZFS_AC_CONFIG_ALWAYS_PYTHON
274	ZFS_AC_CONFIG_ALWAYS_PYZFS
275	ZFS_AC_CONFIG_ALWAYS_SED
276	ZFS_AC_CONFIG_ALWAYS_CPPCHECK
277	ZFS_AC_CONFIG_ALWAYS_SHELLCHECK
278	ZFS_AC_CONFIG_ALWAYS_PARALLEL
279])
280
281AC_DEFUN([ZFS_AC_CONFIG], [
282
283        dnl # Remove the previous build test directory.
284        rm -Rf build
285
286	ZFS_CONFIG=all
287	AC_ARG_WITH([config],
288		AS_HELP_STRING([--with-config=CONFIG],
289		[Config file 'kernel|user|all|srpm']),
290		[ZFS_CONFIG="$withval"])
291	AC_ARG_ENABLE([linux-builtin],
292		[AS_HELP_STRING([--enable-linux-builtin],
293		[Configure for builtin in-tree kernel modules @<:@default=no@:>@])],
294		[],
295		[enable_linux_builtin=no])
296
297	AC_MSG_CHECKING([zfs config])
298	AC_MSG_RESULT([$ZFS_CONFIG]);
299	AC_SUBST(ZFS_CONFIG)
300
301	ZFS_AC_CONFIG_ALWAYS
302
303	AM_COND_IF([BUILD_LINUX], [
304		AC_ARG_VAR([TEST_JOBS], [simultaneous jobs during configure])
305		if test "x$ac_cv_env_TEST_JOBS_set" != "xset"; then
306			TEST_JOBS=$CPU_COUNT
307		fi
308		AC_SUBST(TEST_JOBS)
309	])
310
311	ZFS_INIT_SYSV=
312	ZFS_INIT_SYSTEMD=
313	ZFS_WANT_MODULES_LOAD_D=
314
315	case "$ZFS_CONFIG" in
316		kernel) ZFS_AC_CONFIG_KERNEL ;;
317		user)	ZFS_AC_CONFIG_USER   ;;
318		all)    ZFS_AC_CONFIG_USER
319			ZFS_AC_CONFIG_KERNEL ;;
320		dist)                        ;;
321		srpm)                        ;;
322		*)
323		AC_MSG_RESULT([Error!])
324		AC_MSG_ERROR([Bad value "$ZFS_CONFIG" for --with-config,
325		              user kernel|user|all|srpm]) ;;
326	esac
327
328	AM_CONDITIONAL([INIT_SYSV],           [test "x$ZFS_INIT_SYSV" = "xyes"])
329	AM_CONDITIONAL([INIT_SYSTEMD],        [test "x$ZFS_INIT_SYSTEMD" = "xyes"])
330	AM_CONDITIONAL([WANT_MODULES_LOAD_D], [test "x$ZFS_WANT_MODULES_LOAD_D" = "xyes"])
331
332	AM_CONDITIONAL([CONFIG_USER],
333	    [test "$ZFS_CONFIG" = user -o "$ZFS_CONFIG" = all])
334	AM_CONDITIONAL([CONFIG_KERNEL],
335	    [test "$ZFS_CONFIG" = kernel -o "$ZFS_CONFIG" = all] &&
336	    [test "x$enable_linux_builtin" != xyes ])
337	AM_CONDITIONAL([CONFIG_QAT],
338	    [test "$ZFS_CONFIG" = kernel -o "$ZFS_CONFIG" = all] &&
339	    [test "x$qatsrc" != x ])
340	AM_CONDITIONAL([WANT_DEVNAME2DEVID], [test "x$user_libudev" = xyes ])
341	AM_CONDITIONAL([WANT_MMAP_LIBAIO], [test "x$user_libaio" = xyes ])
342	AM_CONDITIONAL([PAM_ZFS_ENABLED], [test "x$enable_pam" = xyes])
343])
344
345dnl #
346dnl # Check for rpm+rpmbuild to build RPM packages.  If these tools
347dnl # are missing it is non-fatal but you will not be able to build
348dnl # RPM packages and will be warned if you try too.
349dnl #
350dnl # By default the generic spec file will be used because it requires
351dnl # minimal dependencies.  Distribution specific spec files can be
352dnl # placed under the 'rpm/<distribution>' directory and enabled using
353dnl # the --with-spec=<distribution> configure option.
354dnl #
355AC_DEFUN([ZFS_AC_RPM], [
356	RPM=rpm
357	RPMBUILD=rpmbuild
358
359	AC_MSG_CHECKING([whether $RPM is available])
360	AS_IF([tmp=$($RPM --version 2>/dev/null)], [
361		RPM_VERSION=$(echo $tmp | $AWK '/RPM/ { print $[3] }')
362		HAVE_RPM=yes
363		AC_MSG_RESULT([$HAVE_RPM ($RPM_VERSION)])
364	],[
365		HAVE_RPM=no
366		AC_MSG_RESULT([$HAVE_RPM])
367	])
368
369	AC_MSG_CHECKING([whether $RPMBUILD is available])
370	AS_IF([tmp=$($RPMBUILD --version 2>/dev/null)], [
371		RPMBUILD_VERSION=$(echo $tmp | $AWK '/RPM/ { print $[3] }')
372		HAVE_RPMBUILD=yes
373		AC_MSG_RESULT([$HAVE_RPMBUILD ($RPMBUILD_VERSION)])
374	],[
375		HAVE_RPMBUILD=no
376		AC_MSG_RESULT([$HAVE_RPMBUILD])
377	])
378
379	RPM_DEFINE_COMMON='--define "$(DEBUG_ZFS) 1"'
380	RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUGINFO_ZFS) 1"'
381	RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUG_KMEM_ZFS) 1"'
382	RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUG_KMEM_TRACKING_ZFS) 1"'
383	RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(ASAN_ZFS) 1"'
384	RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(UBSAN_ZFS) 1"'
385
386	AS_IF([test "x$enable_debuginfo" = xyes], [
387		RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "__strip /bin/true"'
388	])
389
390	RPM_DEFINE_UTIL=' --define "_initconfdir $(initconfdir)"'
391
392	dnl # Make the next three RPM_DEFINE_UTIL additions conditional, since
393	dnl # their values may not be set when running:
394	dnl #
395	dnl #	./configure --with-config=srpm
396	dnl #
397	AS_IF([test -n "$dracutdir" ], [
398		RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_dracutdir $(dracutdir)"'
399	])
400	AS_IF([test -n "$udevdir" ], [
401		RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_udevdir $(udevdir)"'
402	])
403	AS_IF([test -n "$udevruledir" ], [
404		RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_udevruledir $(udevruledir)"'
405	])
406	AS_IF([test -n "$bashcompletiondir" ], [
407		RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_bashcompletiondir $(bashcompletiondir)"'
408	])
409	RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_SYSTEMD)'
410	RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PYZFS)'
411	RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PAM)'
412	RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PYTHON_VERSION)'
413	RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PYTHON_PKG_VERSION)'
414
415	dnl # Override default lib directory on Debian/Ubuntu systems.  The
416	dnl # provided /usr/lib/rpm/platform/<arch>/macros files do not
417	dnl # specify the correct path for multiarch systems as described
418	dnl # by the packaging guidelines.
419	dnl #
420	dnl # https://wiki.ubuntu.com/MultiarchSpec
421	dnl # https://wiki.debian.org/Multiarch/Implementation
422	dnl #
423	AS_IF([test "$DEFAULT_PACKAGE" = "deb"], [
424		MULTIARCH_LIBDIR="lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
425		RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_lib $(MULTIARCH_LIBDIR)"'
426		AC_SUBST(MULTIARCH_LIBDIR)
427	])
428
429	dnl # Make RPM_DEFINE_KMOD additions conditional on CONFIG_KERNEL,
430	dnl # since the values will not be set otherwise. The spec files
431	dnl # provide defaults for them.
432	dnl #
433	RPM_DEFINE_KMOD='--define "_wrong_version_format_terminate_build 0"'
434	AM_COND_IF([CONFIG_KERNEL], [
435		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernels $(LINUX_VERSION)"'
436		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "ksrc $(LINUX)"'
437		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kobj $(LINUX_OBJ)"'
438		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_cc KERNEL_CC=$(KERNEL_CC)"'
439		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_ld KERNEL_LD=$(KERNEL_LD)"'
440		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_llvm KERNEL_LLVM=$(KERNEL_LLVM)"'
441		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_cross_compile KERNEL_CROSS_COMPILE=$(KERNEL_CROSS_COMPILE)"'
442		RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_arch KERNEL_ARCH=$(KERNEL_ARCH)"'
443	])
444
445	RPM_DEFINE_DKMS=''
446
447	SRPM_DEFINE_COMMON='--define "build_src_rpm 1"'
448	SRPM_DEFINE_UTIL=
449	SRPM_DEFINE_KMOD=
450	SRPM_DEFINE_DKMS=
451
452	RPM_SPEC_DIR="rpm/generic"
453	AC_ARG_WITH([spec],
454		AS_HELP_STRING([--with-spec=SPEC],
455		[Spec files 'generic|redhat']),
456		[RPM_SPEC_DIR="rpm/$withval"])
457
458	AC_MSG_CHECKING([whether spec files are available])
459	AC_MSG_RESULT([yes ($RPM_SPEC_DIR/*.spec.in)])
460
461	AC_SUBST(HAVE_RPM)
462	AC_SUBST(RPM)
463	AC_SUBST(RPM_VERSION)
464
465	AC_SUBST(HAVE_RPMBUILD)
466	AC_SUBST(RPMBUILD)
467	AC_SUBST(RPMBUILD_VERSION)
468
469	AC_SUBST(RPM_SPEC_DIR)
470	AC_SUBST(RPM_DEFINE_UTIL)
471	AC_SUBST(RPM_DEFINE_KMOD)
472	AC_SUBST(RPM_DEFINE_DKMS)
473	AC_SUBST(RPM_DEFINE_COMMON)
474	AC_SUBST(SRPM_DEFINE_UTIL)
475	AC_SUBST(SRPM_DEFINE_KMOD)
476	AC_SUBST(SRPM_DEFINE_DKMS)
477	AC_SUBST(SRPM_DEFINE_COMMON)
478])
479
480dnl #
481dnl # Check for dpkg+dpkg-buildpackage to build DEB packages.  If these
482dnl # tools are missing it is non-fatal but you will not be able to build
483dnl # DEB packages and will be warned if you try too.
484dnl #
485AC_DEFUN([ZFS_AC_DPKG], [
486	DPKG=dpkg
487	DPKGBUILD=dpkg-buildpackage
488
489	AC_MSG_CHECKING([whether $DPKG is available])
490	AS_IF([tmp=$($DPKG --version 2>/dev/null)], [
491		DPKG_VERSION=$(echo $tmp | $AWK '/Debian/ { print $[7] }')
492		HAVE_DPKG=yes
493		AC_MSG_RESULT([$HAVE_DPKG ($DPKG_VERSION)])
494	],[
495		HAVE_DPKG=no
496		AC_MSG_RESULT([$HAVE_DPKG])
497	])
498
499	AC_MSG_CHECKING([whether $DPKGBUILD is available])
500	AS_IF([tmp=$($DPKGBUILD --version 2>/dev/null)], [
501		DPKGBUILD_VERSION=$(echo $tmp | \
502		    $AWK '/Debian/ { print $[4] }' | cut -f-4 -d'.')
503		HAVE_DPKGBUILD=yes
504		AC_MSG_RESULT([$HAVE_DPKGBUILD ($DPKGBUILD_VERSION)])
505	],[
506		HAVE_DPKGBUILD=no
507		AC_MSG_RESULT([$HAVE_DPKGBUILD])
508	])
509
510	AC_SUBST(HAVE_DPKG)
511	AC_SUBST(DPKG)
512	AC_SUBST(DPKG_VERSION)
513
514	AC_SUBST(HAVE_DPKGBUILD)
515	AC_SUBST(DPKGBUILD)
516	AC_SUBST(DPKGBUILD_VERSION)
517	AC_SUBST([CFGOPTS], ["$CFGOPTS"])
518])
519
520dnl #
521dnl # Until native packaging for various different packing systems
522dnl # can be added the least we can do is attempt to use alien to
523dnl # convert the RPM packages to the needed package type.  This is
524dnl # a hack but so far it has worked reasonable well.
525dnl #
526AC_DEFUN([ZFS_AC_ALIEN], [
527	ALIEN=alien
528
529	AC_MSG_CHECKING([whether $ALIEN is available])
530	AS_IF([tmp=$($ALIEN --version 2>/dev/null)], [
531		ALIEN_VERSION=$(echo $tmp | $AWK '{ print $[3] }')
532		ALIEN_MAJOR=$(echo ${ALIEN_VERSION} | $AWK -F'.' '{ print $[1] }')
533		ALIEN_MINOR=$(echo ${ALIEN_VERSION} | $AWK -F'.' '{ print $[2] }')
534		ALIEN_POINT=$(echo ${ALIEN_VERSION} | $AWK -F'.' '{ print $[3] }')
535		HAVE_ALIEN=yes
536		AC_MSG_RESULT([$HAVE_ALIEN ($ALIEN_VERSION)])
537	],[
538		HAVE_ALIEN=no
539		AC_MSG_RESULT([$HAVE_ALIEN])
540	])
541
542	AC_SUBST(HAVE_ALIEN)
543	AC_SUBST(ALIEN)
544	AC_SUBST(ALIEN_VERSION)
545	AC_SUBST(ALIEN_MAJOR)
546	AC_SUBST(ALIEN_MINOR)
547	AC_SUBST(ALIEN_POINT)
548])
549
550dnl #
551dnl # Using the VENDOR tag from config.guess set the default
552dnl # package type for 'make pkg': (rpm | deb | tgz)
553dnl #
554AC_DEFUN([ZFS_AC_DEFAULT_PACKAGE], [
555	AC_MSG_CHECKING([os distribution])
556	AC_ARG_WITH([vendor],
557		[AS_HELP_STRING([--with-vendor],
558			[Distribution vendor @<:@default=check@:>@])],
559		[with_vendor=$withval],
560		[with_vendor=check])
561	AS_IF([test "x$with_vendor" = "xcheck"],[
562		if test -f /etc/alpine-release ; then
563			VENDOR=alpine ;
564		elif test -f /etc/arch-release ; then
565			VENDOR=arch ;
566		elif test -f /etc/artix-release ; then
567			VENDOR=artix ;
568		elif test -f /etc/fedora-release ; then
569			VENDOR=fedora ;
570		elif test -f /bin/freebsd-version ; then
571			VENDOR=freebsd ;
572		elif test -f /etc/gentoo-release ; then
573			VENDOR=gentoo ;
574		elif test -f /etc/lunar.release ; then
575			VENDOR=lunar ;
576		elif test -f /etc/openEuler-release ; then
577			VENDOR=openeuler ;
578		elif test -f /etc/SuSE-release ; then
579			VENDOR=sles ;
580		elif test -f /etc/slackware-version ; then
581			VENDOR=slackware ;
582		elif test -f /etc/toss-release ; then
583			VENDOR=toss ;
584		elif test -f /etc/lsb-release ; then
585			VENDOR=ubuntu ;
586		# put debian and redhat last as derivatives may have also their file
587		elif test -f /etc/debian_version ; then
588			VENDOR=debian ;
589		elif test -f /etc/redhat-release ; then
590			VENDOR=redhat ;
591		else
592			VENDOR= ;
593		fi],
594		[ test "x${with_vendor}" != x],[
595			VENDOR="$with_vendor" ],
596		[ VENDOR= ; ]
597	)
598	AC_MSG_RESULT([$VENDOR])
599	AC_SUBST(VENDOR)
600
601	AC_MSG_CHECKING([default package type])
602	case "$VENDOR" in
603		alpine|arch|artix|gentoo|lunar|slackware)
604			DEFAULT_PACKAGE=tgz  ;;
605		debian|ubuntu)
606			DEFAULT_PACKAGE=deb  ;;
607		freebsd)
608			DEFAULT_PACKAGE=pkg  ;;
609		*)
610		# fedora|openeuler|redhat|sles|toss
611			DEFAULT_PACKAGE=rpm  ;;
612	esac
613	AC_MSG_RESULT([$DEFAULT_PACKAGE])
614	AC_SUBST(DEFAULT_PACKAGE)
615
616	AC_MSG_CHECKING([default init directory])
617	case "$VENDOR" in
618		freebsd)    initdir=$sysconfdir/rc.d  ;;
619		*)          initdir=$sysconfdir/init.d;;
620	esac
621	AC_MSG_RESULT([$initdir])
622	AC_SUBST(initdir)
623
624	AC_MSG_CHECKING([default shell])
625	case "$VENDOR" in
626		alpine|gentoo)	DEFAULT_INIT_SHELL=/sbin/openrc-run
627				IS_SYSV_RC=false	;;
628		artix)		DEFAULT_INIT_SHELL=/usr/bin/openrc-run
629				IS_SYSV_RC=false	;;
630		*)		DEFAULT_INIT_SHELL=/bin/sh
631				IS_SYSV_RC=true		;;
632	esac
633
634	AC_MSG_RESULT([$DEFAULT_INIT_SHELL])
635	AC_SUBST(DEFAULT_INIT_SHELL)
636	AC_SUBST(IS_SYSV_RC)
637
638	AC_MSG_CHECKING([default nfs server init script])
639	AS_IF([test "$VENDOR" = "debian"],
640		[DEFAULT_INIT_NFS_SERVER="nfs-kernel-server"],
641		[DEFAULT_INIT_NFS_SERVER="nfs"]
642	)
643	AC_MSG_RESULT([$DEFAULT_INIT_NFS_SERVER])
644	AC_SUBST(DEFAULT_INIT_NFS_SERVER)
645
646	AC_MSG_CHECKING([default init config directory])
647	case "$VENDOR" in
648		alpine|artix|gentoo)
649			initconfdir=/etc/conf.d
650			;;
651		fedora|openeuler|redhat|sles|toss)
652			initconfdir=/etc/sysconfig
653			;;
654		freebsd)
655			initconfdir=$sysconfdir/rc.conf.d
656			;;
657		*)
658		# debian|ubuntu
659			initconfdir=/etc/default
660			;;
661	esac
662	AC_MSG_RESULT([$initconfdir])
663	AC_SUBST(initconfdir)
664
665	AC_MSG_CHECKING([whether initramfs-tools is available])
666	if test -d /usr/share/initramfs-tools ; then
667		RPM_DEFINE_INITRAMFS='--define "_initramfs 1"'
668		AC_MSG_RESULT([yes])
669	else
670		RPM_DEFINE_INITRAMFS=''
671		AC_MSG_RESULT([no])
672	fi
673	AC_SUBST(RPM_DEFINE_INITRAMFS)
674
675	AC_MSG_CHECKING([default bash completion directory])
676	case "$VENDOR" in
677		alpine|arch|artix|debian|gentoo|ubuntu)
678			bashcompletiondir=/usr/share/bash-completion/completions
679			;;
680		freebsd)
681			bashcompletiondir=$sysconfdir/bash_completion.d
682			;;
683		*)
684			bashcompletiondir=/etc/bash_completion.d
685			;;
686	esac
687	AC_MSG_RESULT([$bashcompletiondir])
688	AC_SUBST(bashcompletiondir)
689
690])
691
692dnl #
693dnl # Default ZFS package configuration
694dnl #
695AC_DEFUN([ZFS_AC_PACKAGE], [
696	ZFS_AC_DEFAULT_PACKAGE
697	AS_IF([test x$VENDOR != xfreebsd], [
698		ZFS_AC_RPM
699		ZFS_AC_DPKG
700		ZFS_AC_ALIEN
701	])
702])
703