-AC_DEFUN([ZFS_AC_CONFIG], [
+AC_DEFUN([ZFS_AC_LICENSE], [
+ AC_MSG_CHECKING([zfs author])
+ AC_MSG_RESULT([$ZFS_META_AUTHOR])
- AC_ARG_WITH([zfs-config],
- AS_HELP_STRING([--with-config=CONFIG],
- [Config file 'kernel|user|lustre']),
- [zfsconfig="$withval"])
+ AC_MSG_CHECKING([zfs license])
+ AC_MSG_RESULT([$ZFS_META_LICENSE])
+])
- AC_MSG_CHECKING([zfs config file])
- if test -z "$zfsconfig" || test ! -r config/$zfsconfig; then
- AC_MSG_RESULT([no])
- AC_MSG_ERROR([
- *** Please specify one of the valid config files located
- *** in ./config/ with the '--with-zfs-config=CONFIG' option])
- fi
+AC_DEFUN([ZFS_AC_DEBUG_ENABLE], [
+ DEBUG_CFLAGS="-Werror"
+ DEBUG_CPPFLAGS="-DDEBUG -UNDEBUG"
+ DEBUG_LDFLAGS=""
+ DEBUG_ZFS="_with_debug"
+ WITH_DEBUG="true"
+ AC_DEFINE(ZFS_DEBUG, 1, [zfs debugging enabled])
- AC_MSG_RESULT([$zfsconfig]);
- . ./config/$zfsconfig
-
- TOPDIR=`/bin/pwd`
- BUILDDIR=$ZFS_META_NAME #+$zfsconfig
- ZFSDIR=$TOPDIR/$BUILDDIR
- LIBDIR=$ZFSDIR/lib
- CMDDIR=$ZFSDIR/zcmd
- UNAME=`uname -r | cut -d- -f1`
-
- AC_SUBST(UNAME)
- AC_SUBST(TOPDIR)
- AC_SUBST(BUILDDIR)
- AC_SUBST(ZFSDIR)
- AC_SUBST(LIBDIR)
- AC_SUBST(CMDDIR)
- AC_SUBST(UNAME)
+ KERNEL_DEBUG_CFLAGS="-Werror"
+ KERNEL_DEBUG_CPPFLAGS="-DDEBUG -UNDEBUG"
])
-AC_DEFUN([ZFS_AC_KERNEL], [
- ver=`uname -r`
+AC_DEFUN([ZFS_AC_DEBUG_DISABLE], [
+ DEBUG_CFLAGS=""
+ DEBUG_CPPFLAGS="-UDEBUG -DNDEBUG"
+ DEBUG_LDFLAGS=""
+ DEBUG_ZFS="_without_debug"
+ WITH_DEBUG=""
- AC_ARG_WITH([linux],
- AS_HELP_STRING([--with-linux=PATH],
- [Path to kernel source]),
- [kernelsrc="$withval"; kernelbuild="$withval"])
+ KERNEL_DEBUG_CFLAGS=""
+ KERNEL_DEBUG_CPPFLAGS="-UDEBUG -DNDEBUG"
+])
- AC_ARG_WITH(linux-obj,
- AS_HELP_STRING([--with-linux-obj=PATH],
- [Path to kernel build objects]),
- [kernelbuild="$withval"])
+dnl #
+dnl # When debugging is enabled:
+dnl # - Enable all ASSERTs (-DDEBUG)
+dnl # - Promote all compiler warnings to errors (-Werror)
+dnl #
+dnl # (If INVARIANTS is detected, we need to force DEBUG, or strange panics
+dnl # can ensue.)
+dnl #
+AC_DEFUN([ZFS_AC_DEBUG], [
+ AC_MSG_CHECKING([whether assertion support will be enabled])
+ AC_ARG_ENABLE([debug],
+ [AS_HELP_STRING([--enable-debug],
+ [Enable compiler and code assertions @<:@default=no@:>@])],
+ [],
+ [enable_debug=no])
+
+ AS_CASE(["x$enable_debug"],
+ ["xyes"],
+ [ZFS_AC_DEBUG_ENABLE],
+ ["xno"],
+ [ZFS_AC_DEBUG_DISABLE],
+ [AC_MSG_ERROR([Unknown option $enable_debug])])
+
+ AS_CASE(["x$enable_invariants"],
+ ["xyes"],
+ [],
+ ["xno"],
+ [],
+ [ZFS_AC_DEBUG_INVARIANTS_DETECT])
+
+ AS_CASE(["x$enable_invariants"],
+ ["xyes"],
+ [ZFS_AC_DEBUG_ENABLE],
+ ["xno"],
+ [],
+ [AC_MSG_ERROR([Unknown option $enable_invariants])])
+
+ AC_SUBST(DEBUG_CFLAGS)
+ AC_SUBST(DEBUG_CPPFLAGS)
+ AC_SUBST(DEBUG_LDFLAGS)
+ AC_SUBST(DEBUG_ZFS)
+ AC_SUBST(WITH_DEBUG)
+
+ AC_SUBST(KERNEL_DEBUG_CFLAGS)
+ AC_SUBST(KERNEL_DEBUG_CPPFLAGS)
+
+ AC_MSG_RESULT([$enable_debug])
+])
- AC_MSG_CHECKING([kernel source directory])
- if test -z "$kernelsrc"; then
- kernelbuild=
- sourcelink=/lib/modules/${ver}/source
- buildlink=/lib/modules/${ver}/build
+AC_DEFUN([ZFS_AC_DEBUGINFO_ENABLE], [
+ DEBUG_CFLAGS="$DEBUG_CFLAGS -g -fno-inline $NO_IPA_SRA"
- if test -e $sourcelink; then
- kernelsrc=`(cd $sourcelink; /bin/pwd)`
- fi
- if test -e $buildlink; then
- kernelbuild=`(cd $buildlink; /bin/pwd)`
- fi
- if test -z "$kernelsrc"; then
- kernelsrc=$kernelbuild
- fi
- if test -z "$kernelsrc" -o -z "$kernelbuild"; then
- AC_MSG_RESULT([Not found])
- AC_MSG_ERROR([
- *** Please specify the location of the kernel source
- *** with the '--with-linux=PATH' option])
- fi
- fi
+ KERNEL_DEBUG_CFLAGS="$KERNEL_DEBUG_CFLAGS -fno-inline $KERNEL_NO_IPA_SRA"
+ KERNEL_MAKE="$KERNEL_MAKE CONFIG_DEBUG_INFO=y"
- AC_MSG_RESULT([$kernelsrc])
- AC_MSG_CHECKING([kernel build directory])
- AC_MSG_RESULT([$kernelbuild])
+ DEBUGINFO_ZFS="_with_debuginfo"
+])
- AC_MSG_CHECKING([kernel source version])
- if test -r $kernelbuild/include/linux/version.h &&
- fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then
+AC_DEFUN([ZFS_AC_DEBUGINFO_DISABLE], [
+ DEBUGINFO_ZFS="_without_debuginfo"
+])
- kernsrcver=`(echo "#include <linux/version.h>";
- echo "kernsrcver=UTS_RELEASE") |
- cpp -I $kernelbuild/include |
- grep "^kernsrcver=" | cut -d \" -f 2`
+AC_DEFUN([ZFS_AC_DEBUGINFO], [
+ AC_MSG_CHECKING([whether debuginfo support will be forced])
+ AC_ARG_ENABLE([debuginfo],
+ [AS_HELP_STRING([--enable-debuginfo],
+ [Force generation of debuginfo @<:@default=no@:>@])],
+ [],
+ [enable_debuginfo=no])
- elif test -r $kernelbuild/include/linux/utsrelease.h &&
- fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then
+ AS_CASE(["x$enable_debuginfo"],
+ ["xyes"],
+ [ZFS_AC_DEBUGINFO_ENABLE],
+ ["xno"],
+ [ZFS_AC_DEBUGINFO_DISABLE],
+ [AC_MSG_ERROR([Unknown option $enable_debuginfo])])
- kernsrcver=`(echo "#include <linux/utsrelease.h>";
- echo "kernsrcver=UTS_RELEASE") |
- cpp -I $kernelbuild/include |
- grep "^kernsrcver=" | cut -d \" -f 2`
- fi
+ AC_SUBST(DEBUG_CFLAGS)
+ AC_SUBST(DEBUGINFO_ZFS)
- if test -z "$kernsrcver"; then
- AC_MSG_RESULT([Not found])
- AC_MSG_ERROR([
- *** Cannot determine the version of the linux kernel source.
- *** Please prepare the kernel before running this script])
- fi
+ AC_SUBST(KERNEL_DEBUG_CFLAGS)
+ AC_SUBST(KERNEL_MAKE)
- AC_MSG_RESULT([$kernsrcver])
+ AC_MSG_RESULT([$enable_debuginfo])
+])
- kmoduledir=${INSTALL_MOD_PATH}/lib/modules/$kernsrcver
- LINUX=${kernelsrc}
- LINUX_OBJ=${kernelbuild}
+dnl #
+dnl # Disabled by default, provides basic memory tracking. Track the total
+dnl # number of bytes allocated with kmem_alloc() and freed with kmem_free().
+dnl # Then at module unload time if any bytes were leaked it will be reported
+dnl # on the console.
+dnl #
+AC_DEFUN([ZFS_AC_DEBUG_KMEM], [
+ AC_MSG_CHECKING([whether basic kmem accounting is enabled])
+ AC_ARG_ENABLE([debug-kmem],
+ [AS_HELP_STRING([--enable-debug-kmem],
+ [Enable basic kmem accounting @<:@default=no@:>@])],
+ [],
+ [enable_debug_kmem=no])
+
+ AS_IF([test "x$enable_debug_kmem" = xyes], [
+ KERNEL_DEBUG_CPPFLAGS="${KERNEL_DEBUG_CPPFLAGS} -DDEBUG_KMEM"
+ DEBUG_KMEM_ZFS="_with_debug_kmem"
+ ], [
+ DEBUG_KMEM_ZFS="_without_debug_kmem"
+ ])
- AC_SUBST(LINUX)
- AC_SUBST(LINUX_OBJ)
- AC_SUBST(kmoduledir)
+ AC_SUBST(KERNEL_DEBUG_CPPFLAGS)
+ AC_SUBST(DEBUG_KMEM_ZFS)
+
+ AC_MSG_RESULT([$enable_debug_kmem])
])
-AC_DEFUN([ZFS_AC_SPL], [
+dnl #
+dnl # Disabled by default, provides detailed memory tracking. This feature
+dnl # also requires --enable-debug-kmem to be set. When enabled not only will
+dnl # total bytes be tracked but also the location of every kmem_alloc() and
+dnl # kmem_free(). When the module is unloaded a list of all leaked addresses
+dnl # and where they were allocated will be dumped to the console. Enabling
+dnl # this feature has a significant impact on performance but it makes finding
+dnl # memory leaks straight forward.
+dnl #
+AC_DEFUN([ZFS_AC_DEBUG_KMEM_TRACKING], [
+ AC_MSG_CHECKING([whether detailed kmem tracking is enabled])
+ AC_ARG_ENABLE([debug-kmem-tracking],
+ [AS_HELP_STRING([--enable-debug-kmem-tracking],
+ [Enable detailed kmem tracking @<:@default=no@:>@])],
+ [],
+ [enable_debug_kmem_tracking=no])
+
+ AS_IF([test "x$enable_debug_kmem_tracking" = xyes], [
+ KERNEL_DEBUG_CPPFLAGS="${KERNEL_DEBUG_CPPFLAGS} -DDEBUG_KMEM_TRACKING"
+ DEBUG_KMEM_TRACKING_ZFS="_with_debug_kmem_tracking"
+ ], [
+ DEBUG_KMEM_TRACKING_ZFS="_without_debug_kmem_tracking"
+ ])
- AC_ARG_WITH([spl],
- AS_HELP_STRING([--with-spl=PATH],
- [Path to spl source]),
- [splsrc="$withval"; splbuild="$withval"])
+ AC_SUBST(KERNEL_DEBUG_CPPFLAGS)
+ AC_SUBST(DEBUG_KMEM_TRACKING_ZFS)
- AC_ARG_WITH([spl-obj],
- AS_HELP_STRING([--with-spl-obj=PATH],
- [Path to spl build objects]),
- [splbuild="$withval"])
+ AC_MSG_RESULT([$enable_debug_kmem_tracking])
+])
+AC_DEFUN([ZFS_AC_DEBUG_INVARIANTS_DETECT_FREEBSD], [
+ AS_IF([sysctl -n kern.conftxt | grep -Fqx $'options\tINVARIANTS'],
+ [enable_invariants="yes"],
+ [enable_invariants="no"])
+])
- AC_MSG_CHECKING([spl source directory])
- if test -z "$splsrc"; then
- splbuild=
- sourcelink=/tmp/`whoami`/spl
- buildlink=/tmp/`whoami`/spl
+AC_DEFUN([ZFS_AC_DEBUG_INVARIANTS_DETECT], [
+ AM_COND_IF([BUILD_FREEBSD],
+ [ZFS_AC_DEBUG_INVARIANTS_DETECT_FREEBSD],
+ [enable_invariants="no"])
+])
- if test -e $sourcelink; then
- splsrc=`(cd $sourcelink; /bin/pwd)`
- fi
- if test -e $buildlink; then
- splbuild=`(cd $buildlink; /bin/pwd)`
- fi
- if test -z "$splsrc"; then
- splsrc=$splbuild
- fi
- fi
+dnl #
+dnl # Detected for the running kernel by default, enables INVARIANTS features
+dnl # in the FreeBSD kernel module. This feature must be used when building
+dnl # for a FreeBSD kernel with "options INVARIANTS" in the KERNCONF and must
+dnl # not be used when the INVARIANTS option is absent.
+dnl #
+AC_DEFUN([ZFS_AC_DEBUG_INVARIANTS], [
+ AC_MSG_CHECKING([whether FreeBSD kernel INVARIANTS checks are enabled])
+ AC_ARG_ENABLE([invariants],
+ [AS_HELP_STRING([--enable-invariants],
+ [Enable FreeBSD kernel INVARIANTS checks [[default: detect]]])],
+ [], [ZFS_AC_DEBUG_INVARIANTS_DETECT])
+
+ AS_IF([test "x$enable_invariants" = xyes],
+ [WITH_INVARIANTS="true"],
+ [WITH_INVARIANTS=""])
+ AC_SUBST(WITH_INVARIANTS)
+
+ AC_MSG_RESULT([$enable_invariants])
+])
- if test -z "$splsrc" -o -z "$splbuild"; then
- sourcelink=/lib/modules/${ver}/source
- buildlink=/lib/modules/${ver}/build
+AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
+ AX_COUNT_CPUS([])
+ AC_SUBST(CPU_COUNT)
+
+ ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED
+ ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION
+ ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION
+ ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH
+ ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN
+ ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION
+ ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH
+ ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW
+ ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER
+ ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA
+ ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA
+ ZFS_AC_CONFIG_ALWAYS_CC_ASAN
+ ZFS_AC_CONFIG_ALWAYS_CC_UBSAN
+ ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD
+ ZFS_AC_CONFIG_ALWAYS_SYSTEM
+ ZFS_AC_CONFIG_ALWAYS_ARCH
+ ZFS_AC_CONFIG_ALWAYS_PYTHON
+ ZFS_AC_CONFIG_ALWAYS_PYZFS
+ ZFS_AC_CONFIG_ALWAYS_SED
+ ZFS_AC_CONFIG_ALWAYS_CPPCHECK
+ ZFS_AC_CONFIG_ALWAYS_SHELLCHECK
+ ZFS_AC_CONFIG_ALWAYS_PARALLEL
+])
- if test -e $sourcelink; then
- splsrc=`(cd $sourcelink; /bin/pwd)`
- fi
- if test -e $buildlink; then
- splbuild=`(cd $buildlink; /bin/pwd)`
- fi
- if test -z "$splsrc"; then
- splsrc=$splbuild
- fi
- if test -z "$splsrc" -o -z "$splbuild"; then
- AC_MSG_RESULT([Not found])
- AC_MSG_ERROR([
- *** Please specify the location of the spl source
- *** with the '--with-spl=PATH' option])
- fi
- fi
+AC_DEFUN([ZFS_AC_CONFIG], [
- AC_MSG_RESULT([$splsrc])
- AC_MSG_CHECKING([spl build directory])
- AC_MSG_RESULT([$splbuild])
+ dnl # Remove the previous build test directory.
+ rm -Rf build
- AC_MSG_CHECKING([spl source version])
- if test -r $splbuild/spl_config.h &&
- fgrep -q VERSION $splbuild/spl_config.h; then
+ ZFS_CONFIG=all
+ AC_ARG_WITH([config],
+ AS_HELP_STRING([--with-config=CONFIG],
+ [Config file 'kernel|user|all|srpm']),
+ [ZFS_CONFIG="$withval"])
+ AC_ARG_ENABLE([linux-builtin],
+ [AS_HELP_STRING([--enable-linux-builtin],
+ [Configure for builtin in-tree kernel modules @<:@default=no@:>@])],
+ [],
+ [enable_linux_builtin=no])
+
+ AC_MSG_CHECKING([zfs config])
+ AC_MSG_RESULT([$ZFS_CONFIG]);
+ AC_SUBST(ZFS_CONFIG)
+
+ ZFS_AC_CONFIG_ALWAYS
+
+ AM_COND_IF([BUILD_LINUX], [
+ AC_ARG_VAR([TEST_JOBS], [simultaneous jobs during configure])
+ if test "x$ac_cv_env_TEST_JOBS_set" != "xset"; then
+ TEST_JOBS=$CPU_COUNT
+ fi
+ AC_SUBST(TEST_JOBS)
+ ])
- splsrcver=`(echo "#include <spl_config.h>";
- echo "splsrcver=VERSION") |
- cpp -I $splbuild |
- grep "^splsrcver=" | cut -d \" -f 2`
- fi
+ ZFS_INIT_SYSV=
+ ZFS_INIT_SYSTEMD=
+ ZFS_WANT_MODULES_LOAD_D=
+
+ case "$ZFS_CONFIG" in
+ kernel) ZFS_AC_CONFIG_KERNEL ;;
+ user) ZFS_AC_CONFIG_USER ;;
+ all) ZFS_AC_CONFIG_USER
+ ZFS_AC_CONFIG_KERNEL ;;
+ dist) ;;
+ srpm) ;;
+ *)
+ AC_MSG_RESULT([Error!])
+ AC_MSG_ERROR([Bad value "$ZFS_CONFIG" for --with-config,
+ user kernel|user|all|srpm]) ;;
+ esac
+
+ AM_CONDITIONAL([INIT_SYSV], [test "x$ZFS_INIT_SYSV" = "xyes"])
+ AM_CONDITIONAL([INIT_SYSTEMD], [test "x$ZFS_INIT_SYSTEMD" = "xyes"])
+ AM_CONDITIONAL([WANT_MODULES_LOAD_D], [test "x$ZFS_WANT_MODULES_LOAD_D" = "xyes"])
+
+ AM_CONDITIONAL([CONFIG_USER],
+ [test "$ZFS_CONFIG" = user -o "$ZFS_CONFIG" = all])
+ AM_CONDITIONAL([CONFIG_KERNEL],
+ [test "$ZFS_CONFIG" = kernel -o "$ZFS_CONFIG" = all] &&
+ [test "x$enable_linux_builtin" != xyes ])
+ AM_CONDITIONAL([CONFIG_QAT],
+ [test "$ZFS_CONFIG" = kernel -o "$ZFS_CONFIG" = all] &&
+ [test "x$qatsrc" != x ])
+ AM_CONDITIONAL([WANT_DEVNAME2DEVID], [test "x$user_libudev" = xyes ])
+ AM_CONDITIONAL([WANT_MMAP_LIBAIO], [test "x$user_libaio" = xyes ])
+ AM_CONDITIONAL([PAM_ZFS_ENABLED], [test "x$enable_pam" = xyes])
+])
- if test -z "$splsrcver"; then
- AC_MSG_RESULT([Not found])
- AC_MSG_ERROR([
- *** Cannot determine the version of the spl source.
- *** Please prepare the spl source before running this script])
- fi
+dnl #
+dnl # Check for rpm+rpmbuild to build RPM packages. If these tools
+dnl # are missing it is non-fatal but you will not be able to build
+dnl # RPM packages and will be warned if you try too.
+dnl #
+dnl # By default the generic spec file will be used because it requires
+dnl # minimal dependencies. Distribution specific spec files can be
+dnl # placed under the 'rpm/<distribution>' directory and enabled using
+dnl # the --with-spec=<distribution> configure option.
+dnl #
+AC_DEFUN([ZFS_AC_RPM], [
+ RPM=rpm
+ RPMBUILD=rpmbuild
+
+ AC_MSG_CHECKING([whether $RPM is available])
+ AS_IF([tmp=$($RPM --version 2>/dev/null)], [
+ RPM_VERSION=$(echo $tmp | $AWK '/RPM/ { print $[3] }')
+ HAVE_RPM=yes
+ AC_MSG_RESULT([$HAVE_RPM ($RPM_VERSION)])
+ ],[
+ HAVE_RPM=no
+ AC_MSG_RESULT([$HAVE_RPM])
+ ])
- AC_MSG_RESULT([$splsrcver])
+ AC_MSG_CHECKING([whether $RPMBUILD is available])
+ AS_IF([tmp=$($RPMBUILD --version 2>/dev/null)], [
+ RPMBUILD_VERSION=$(echo $tmp | $AWK '/RPM/ { print $[3] }')
+ HAVE_RPMBUILD=yes
+ AC_MSG_RESULT([$HAVE_RPMBUILD ($RPMBUILD_VERSION)])
+ ],[
+ HAVE_RPMBUILD=no
+ AC_MSG_RESULT([$HAVE_RPMBUILD])
+ ])
- AC_MSG_CHECKING([spl Module.symvers])
- if test -r $splbuild/modules/Module.symvers; then
- splsymvers=$splbuild/modules/Module.symvers
- elif test -r $kernelbuild/Module.symvers; then
- splsymvers=$kernelbuild/Module.symvers
- fi
+ RPM_DEFINE_COMMON='--define "$(DEBUG_ZFS) 1"'
+ RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUGINFO_ZFS) 1"'
+ RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUG_KMEM_ZFS) 1"'
+ RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUG_KMEM_TRACKING_ZFS) 1"'
+ RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(ASAN_ZFS) 1"'
+ RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(UBSAN_ZFS) 1"'
- if test -z "$splsymvers"; then
- AC_MSG_RESULT([Not found])
- AC_MSG_ERROR([
- *** Cannot find extra Module.symvers in the spl source.
- *** Please prepare the spl source before running this script])
- fi
+ AS_IF([test "x$enable_debuginfo" = xyes], [
+ RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "__strip /bin/true"'
+ ])
- AC_MSG_RESULT([$splsymvers])
- AC_SUBST(splsrc)
- AC_SUBST(splsymvers)
-])
+ RPM_DEFINE_UTIL=' --define "_initconfdir $(initconfdir)"'
-AC_DEFUN([ZFS_AC_LICENSE], [
- AC_MSG_CHECKING([license])
- AC_MSG_RESULT([CDDL])
-dnl # AC_DEFINE([HAVE_GPL_ONLY_SYMBOLS], [1],
-dnl # [Define to 1 if module is licensed under the GPL])
-])
+ dnl # Make the next three RPM_DEFINE_UTIL additions conditional, since
+ dnl # their values may not be set when running:
+ dnl #
+ dnl # ./configure --with-config=srpm
+ dnl #
+ AS_IF([test -n "$dracutdir" ], [
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_dracutdir $(dracutdir)"'
+ ])
+ AS_IF([test -n "$udevdir" ], [
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_udevdir $(udevdir)"'
+ ])
+ AS_IF([test -n "$udevruledir" ], [
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_udevruledir $(udevruledir)"'
+ ])
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_SYSTEMD)'
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PYZFS)'
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PAM)'
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PYTHON_VERSION)'
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' $(DEFINE_PYTHON_PKG_VERSION)'
+
+ dnl # Override default lib directory on Debian/Ubuntu systems. The
+ dnl # provided /usr/lib/rpm/platform/<arch>/macros files do not
+ dnl # specify the correct path for multiarch systems as described
+ dnl # by the packaging guidelines.
+ dnl #
+ dnl # https://wiki.ubuntu.com/MultiarchSpec
+ dnl # https://wiki.debian.org/Multiarch/Implementation
+ dnl #
+ AS_IF([test "$DEFAULT_PACKAGE" = "deb"], [
+ MULTIARCH_LIBDIR="lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
+ RPM_DEFINE_UTIL=${RPM_DEFINE_UTIL}' --define "_lib $(MULTIARCH_LIBDIR)"'
+ AC_SUBST(MULTIARCH_LIBDIR)
+ ])
-AC_DEFUN([ZFS_AC_DEBUG], [
- AC_MSG_CHECKING([whether debugging is enabled])
- AC_ARG_ENABLE( [debug],
- AS_HELP_STRING([--enable-debug],
- [Enable generic debug support (default off)]),
- [ case "$enableval" in
- yes) zfs_ac_debug=yes ;;
- no) zfs_ac_debug=no ;;
- *) AC_MSG_RESULT([Error!])
- AC_MSG_ERROR([Bad value "$enableval" for --enable-debug]) ;;
- esac ]
- )
- if test "$zfs_ac_debug" = yes; then
- AC_MSG_RESULT([yes])
- KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG "
- HOSTCFLAGS="${HOSTCFLAGS} -DDEBUG "
- else
- AC_MSG_RESULT([no])
- AC_DEFINE([NDEBUG], [1],
- [Define to 1 to disable debug tracing])
- KERNELCPPFLAGS="${KERNELCPPFLAGS} -DNDEBUG "
- HOSTCFLAGS="${HOSTCFLAGS} -DNDEBUG "
- fi
-])
+ dnl # Make RPM_DEFINE_KMOD additions conditional on CONFIG_KERNEL,
+ dnl # since the values will not be set otherwise. The spec files
+ dnl # provide defaults for them.
+ dnl #
+ RPM_DEFINE_KMOD='--define "_wrong_version_format_terminate_build 0"'
+ AM_COND_IF([CONFIG_KERNEL], [
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernels $(LINUX_VERSION)"'
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "ksrc $(LINUX)"'
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kobj $(LINUX_OBJ)"'
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_cc KERNEL_CC=$(KERNEL_CC)"'
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_ld KERNEL_LD=$(KERNEL_LD)"'
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_llvm KERNEL_LLVM=$(KERNEL_LLVM)"'
+ ])
-AC_DEFUN([ZFS_AC_SCRIPT_CONFIG], [
- SCRIPT_CONFIG=.script-config
- rm -f ${SCRIPT_CONFIG}
- echo "KERNELSRC=${LINUX}" >>${SCRIPT_CONFIG}
- echo "KERNELBUILD=${LINUX_OBJ}" >>${SCRIPT_CONFIG}
- echo "KERNELSRCVER=$kernsrcver" >>${SCRIPT_CONFIG}
- echo >>${SCRIPT_CONFIG}
- echo "SPLSRC=$splsrc" >>${SCRIPT_CONFIG}
- echo "SPLBUILD=$splbuild" >>${SCRIPT_CONFIG}
- echo "SPLSRCVER=$splsrcver" >>${SCRIPT_CONFIG}
- echo "SPLSYMVERS=$splsymvers" >>${SCRIPT_CONFIG}
- echo >>${SCRIPT_CONFIG}
- echo "ZFSSRC=${TOPDIR}/src" >>${SCRIPT_CONFIG}
- echo "ZFSBUILD=${ZFSDIR}" >>${SCRIPT_CONFIG}
- echo >>${SCRIPT_CONFIG}
- echo "TOPDIR=${TOPDIR}" >>${SCRIPT_CONFIG}
- echo "LIBDIR=${LIBDIR}" >>${SCRIPT_CONFIG}
- echo "CMDDIR=${CMDDIR}" >>${SCRIPT_CONFIG}
+ RPM_DEFINE_DKMS=''
+
+ SRPM_DEFINE_COMMON='--define "build_src_rpm 1"'
+ SRPM_DEFINE_UTIL=
+ SRPM_DEFINE_KMOD=
+ SRPM_DEFINE_DKMS=
+
+ RPM_SPEC_DIR="rpm/generic"
+ AC_ARG_WITH([spec],
+ AS_HELP_STRING([--with-spec=SPEC],
+ [Spec files 'generic|redhat']),
+ [RPM_SPEC_DIR="rpm/$withval"])
+
+ AC_MSG_CHECKING([whether spec files are available])
+ AC_MSG_RESULT([yes ($RPM_SPEC_DIR/*.spec.in)])
+
+ AC_SUBST(HAVE_RPM)
+ AC_SUBST(RPM)
+ AC_SUBST(RPM_VERSION)
+
+ AC_SUBST(HAVE_RPMBUILD)
+ AC_SUBST(RPMBUILD)
+ AC_SUBST(RPMBUILD_VERSION)
+
+ AC_SUBST(RPM_SPEC_DIR)
+ AC_SUBST(RPM_DEFINE_UTIL)
+ AC_SUBST(RPM_DEFINE_KMOD)
+ AC_SUBST(RPM_DEFINE_DKMS)
+ AC_SUBST(RPM_DEFINE_COMMON)
+ AC_SUBST(SRPM_DEFINE_UTIL)
+ AC_SUBST(SRPM_DEFINE_KMOD)
+ AC_SUBST(SRPM_DEFINE_DKMS)
+ AC_SUBST(SRPM_DEFINE_COMMON)
])
dnl #
-dnl # ZFS_LINUX_CONFTEST
+dnl # Check for dpkg+dpkg-buildpackage to build DEB packages. If these
+dnl # tools are missing it is non-fatal but you will not be able to build
+dnl # DEB packages and will be warned if you try too.
dnl #
-AC_DEFUN([ZFS_LINUX_CONFTEST], [
-cat >conftest.c <<_ACEOF
-$1
-_ACEOF
-])
+AC_DEFUN([ZFS_AC_DPKG], [
+ DPKG=dpkg
+ DPKGBUILD=dpkg-buildpackage
+
+ AC_MSG_CHECKING([whether $DPKG is available])
+ AS_IF([tmp=$($DPKG --version 2>/dev/null)], [
+ DPKG_VERSION=$(echo $tmp | $AWK '/Debian/ { print $[7] }')
+ HAVE_DPKG=yes
+ AC_MSG_RESULT([$HAVE_DPKG ($DPKG_VERSION)])
+ ],[
+ HAVE_DPKG=no
+ AC_MSG_RESULT([$HAVE_DPKG])
+ ])
-dnl #
-dnl # ZFS_LANG_PROGRAM(C)([PROLOGUE], [BODY])
-dnl #
-m4_define([ZFS_LANG_PROGRAM], [
-$1
-int
-main (void)
-{
-dnl Do *not* indent the following line: there may be CPP directives.
-dnl Don't move the `;' right after for the same reason.
-$2
- ;
- return 0;
-}
-])
+ AC_MSG_CHECKING([whether $DPKGBUILD is available])
+ AS_IF([tmp=$($DPKGBUILD --version 2>/dev/null)], [
+ DPKGBUILD_VERSION=$(echo $tmp | \
+ $AWK '/Debian/ { print $[4] }' | cut -f-4 -d'.')
+ HAVE_DPKGBUILD=yes
+ AC_MSG_RESULT([$HAVE_DPKGBUILD ($DPKGBUILD_VERSION)])
+ ],[
+ HAVE_DPKGBUILD=no
+ AC_MSG_RESULT([$HAVE_DPKGBUILD])
+ ])
-dnl #
-dnl # ZFS_LINUX_COMPILE_IFELSE / like AC_COMPILE_IFELSE
-dnl #
-AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [
-m4_ifvaln([$1], [ZFS_LINUX_CONFTEST([$1])])dnl
-rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
-echo "obj-m := conftest.o" >build/Makefile
-dnl AS_IF([AC_TRY_COMMAND(cp conftest.c build && make [$2] CC="$CC" -f $PWD/build/Makefile LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM SUBDIRS=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])],
-AS_IF([AC_TRY_COMMAND(cp conftest.c build && make [$2] CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])],
- [$4],
- [_AC_MSG_LOG_CONFTEST
-m4_ifvaln([$5],[$5])dnl])dnl
-rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.ko m4_ifval([$1], [build/conftest.c conftest.c])[]dnl
-])
+ AC_SUBST(HAVE_DPKG)
+ AC_SUBST(DPKG)
+ AC_SUBST(DPKG_VERSION)
-dnl #
-dnl # ZFS_LINUX_TRY_COMPILE like AC_TRY_COMPILE
-dnl #
-AC_DEFUN([ZFS_LINUX_TRY_COMPILE],
- [ZFS_LINUX_COMPILE_IFELSE(
- [AC_LANG_SOURCE([ZFS_LANG_PROGRAM([[$1]], [[$2]])])],
- [modules],
- [test -s build/conftest.o],
- [$3], [$4])
+ AC_SUBST(HAVE_DPKGBUILD)
+ AC_SUBST(DPKGBUILD)
+ AC_SUBST(DPKGBUILD_VERSION)
])
dnl #
-dnl # ZFS_LINUX_CONFIG
+dnl # Until native packaging for various different packing systems
+dnl # can be added the least we can do is attempt to use alien to
+dnl # convert the RPM packages to the needed package type. This is
+dnl # a hack but so far it has worked reasonable well.
dnl #
-AC_DEFUN([ZFS_LINUX_CONFIG],
- [AC_MSG_CHECKING([whether Linux was built with CONFIG_$1])
- ZFS_LINUX_TRY_COMPILE([
- #ifndef AUTOCONF_INCLUDED
- #include <linux/config.h>
- #endif
- ],[
- #ifndef CONFIG_$1
- #error CONFIG_$1 not #defined
- #endif
+AC_DEFUN([ZFS_AC_ALIEN], [
+ ALIEN=alien
+
+ AC_MSG_CHECKING([whether $ALIEN is available])
+ AS_IF([tmp=$($ALIEN --version 2>/dev/null)], [
+ ALIEN_VERSION=$(echo $tmp | $AWK '{ print $[3] }')
+ ALIEN_MAJOR=$(echo ${ALIEN_VERSION} | $AWK -F'.' '{ print $[1] }')
+ ALIEN_MINOR=$(echo ${ALIEN_VERSION} | $AWK -F'.' '{ print $[2] }')
+ ALIEN_POINT=$(echo ${ALIEN_VERSION} | $AWK -F'.' '{ print $[3] }')
+ HAVE_ALIEN=yes
+ AC_MSG_RESULT([$HAVE_ALIEN ($ALIEN_VERSION)])
],[
- AC_MSG_RESULT([yes])
- $2
- ],[
- AC_MSG_RESULT([no])
- $3
+ HAVE_ALIEN=no
+ AC_MSG_RESULT([$HAVE_ALIEN])
])
+
+ AC_SUBST(HAVE_ALIEN)
+ AC_SUBST(ALIEN)
+ AC_SUBST(ALIEN_VERSION)
+ AC_SUBST(ALIEN_MAJOR)
+ AC_SUBST(ALIEN_MINOR)
+ AC_SUBST(ALIEN_POINT)
])
dnl #
-dnl # ZFS_CHECK_SYMBOL_EXPORT
-dnl # check symbol exported or not
+dnl # Using the VENDOR tag from config.guess set the default
+dnl # package type for 'make pkg': (rpm | deb | tgz)
dnl #
-AC_DEFUN([ZFS_CHECK_SYMBOL_EXPORT],
- [AC_MSG_CHECKING([whether symbol $1 is exported])
- grep -q -E '[[[:space:]]]$1[[[:space:]]]' $LINUX/Module.symvers 2>/dev/null
- rc=$?
- if test $rc -ne 0; then
- export=0
- for file in $2; do
- grep -q -E "EXPORT_SYMBOL.*($1)" "$LINUX/$file" 2>/dev/null
- rc=$?
- if test $rc -eq 0; then
- export=1
- break;
- fi
- done
- if test $export -eq 0; then
- AC_MSG_RESULT([no])
- $4
+AC_DEFUN([ZFS_AC_DEFAULT_PACKAGE], [
+ AC_MSG_CHECKING([os distribution])
+ AC_ARG_WITH([vendor],
+ [AS_HELP_STRING([--with-vendor],
+ [Distribution vendor @<:@default=check@:>@])],
+ [with_vendor=$withval],
+ [with_vendor=check])
+ AS_IF([test "x$with_vendor" = "xcheck"],[
+ if test -f /etc/toss-release ; then
+ VENDOR=toss ;
+ elif test -f /etc/fedora-release ; then
+ VENDOR=fedora ;
+ elif test -f /etc/redhat-release ; then
+ VENDOR=redhat ;
+ elif test -f /etc/gentoo-release ; then
+ VENDOR=gentoo ;
+ elif test -f /etc/arch-release ; then
+ VENDOR=arch ;
+ elif test -f /etc/SuSE-release ; then
+ VENDOR=sles ;
+ elif test -f /etc/slackware-version ; then
+ VENDOR=slackware ;
+ elif test -f /etc/lunar.release ; then
+ VENDOR=lunar ;
+ elif test -f /etc/lsb-release ; then
+ VENDOR=ubuntu ;
+ elif test -f /etc/debian_version ; then
+ VENDOR=debian ;
+ elif test -f /etc/alpine-release ; then
+ VENDOR=alpine ;
+ elif test -f /bin/freebsd-version ; then
+ VENDOR=freebsd ;
else
- AC_MSG_RESULT([yes])
- $3
- fi
- else
+ VENDOR= ;
+ fi],
+ [ test "x${with_vendor}" != x],[
+ VENDOR="$with_vendor" ],
+ [ VENDOR= ; ]
+ )
+ AC_MSG_RESULT([$VENDOR])
+ AC_SUBST(VENDOR)
+
+ AC_MSG_CHECKING([default package type])
+ case "$VENDOR" in
+ toss) DEFAULT_PACKAGE=rpm ;;
+ redhat) DEFAULT_PACKAGE=rpm ;;
+ fedora) DEFAULT_PACKAGE=rpm ;;
+ gentoo) DEFAULT_PACKAGE=tgz ;;
+ alpine) DEFAULT_PACKAGE=tgz ;;
+ arch) DEFAULT_PACKAGE=tgz ;;
+ sles) DEFAULT_PACKAGE=rpm ;;
+ slackware) DEFAULT_PACKAGE=tgz ;;
+ lunar) DEFAULT_PACKAGE=tgz ;;
+ ubuntu) DEFAULT_PACKAGE=deb ;;
+ debian) DEFAULT_PACKAGE=deb ;;
+ freebsd) DEFAULT_PACKAGE=pkg ;;
+ *) DEFAULT_PACKAGE=rpm ;;
+ esac
+ AC_MSG_RESULT([$DEFAULT_PACKAGE])
+ AC_SUBST(DEFAULT_PACKAGE)
+
+ AC_MSG_CHECKING([default init directory])
+ case "$VENDOR" in
+ freebsd) initdir=$sysconfdir/rc.d ;;
+ *) initdir=$sysconfdir/init.d;;
+ esac
+ AC_MSG_RESULT([$initdir])
+ AC_SUBST(initdir)
+
+ AC_MSG_CHECKING([default init script type and shell])
+ case "$VENDOR" in
+ toss) DEFAULT_INIT_SCRIPT=redhat ;;
+ redhat) DEFAULT_INIT_SCRIPT=redhat ;;
+ fedora) DEFAULT_INIT_SCRIPT=fedora ;;
+ gentoo) DEFAULT_INIT_SCRIPT=openrc ;;
+ alpine) DEFAULT_INIT_SCRIPT=openrc ;;
+ arch) DEFAULT_INIT_SCRIPT=lsb ;;
+ sles) DEFAULT_INIT_SCRIPT=lsb ;;
+ slackware) DEFAULT_INIT_SCRIPT=lsb ;;
+ lunar) DEFAULT_INIT_SCRIPT=lunar ;;
+ ubuntu) DEFAULT_INIT_SCRIPT=lsb ;;
+ debian) DEFAULT_INIT_SCRIPT=lsb ;;
+ freebsd) DEFAULT_INIT_SCRIPT=freebsd;;
+ *) DEFAULT_INIT_SCRIPT=lsb ;;
+ esac
+
+ case "$VENDOR" in
+ gentoo) DEFAULT_INIT_SHELL="/sbin/openrc-run";;
+ alpine) DEFAULT_INIT_SHELL="/sbin/openrc-run";;
+ *) DEFAULT_INIT_SHELL="/bin/sh" ;;
+ esac
+
+ AC_MSG_RESULT([$DEFAULT_INIT_SCRIPT:$DEFAULT_INIT_SHELL])
+ AC_SUBST(DEFAULT_INIT_SCRIPT)
+ AC_SUBST(DEFAULT_INIT_SHELL)
+
+ AC_MSG_CHECKING([default nfs server init script])
+ AS_IF([test "$VENDOR" = "debian"],
+ [DEFAULT_INIT_NFS_SERVER="nfs-kernel-server"],
+ [DEFAULT_INIT_NFS_SERVER="nfs"]
+ )
+ AC_MSG_RESULT([$DEFAULT_INIT_NFS_SERVER])
+ AC_SUBST(DEFAULT_INIT_NFS_SERVER)
+
+ AC_MSG_CHECKING([default init config directory])
+ case "$VENDOR" in
+ alpine) initconfdir=/etc/conf.d ;;
+ gentoo) initconfdir=/etc/conf.d ;;
+ toss) initconfdir=/etc/sysconfig ;;
+ redhat) initconfdir=/etc/sysconfig ;;
+ fedora) initconfdir=/etc/sysconfig ;;
+ sles) initconfdir=/etc/sysconfig ;;
+ ubuntu) initconfdir=/etc/default ;;
+ debian) initconfdir=/etc/default ;;
+ freebsd) initconfdir=$sysconfdir/rc.conf.d;;
+ *) initconfdir=/etc/default ;;
+ esac
+ AC_MSG_RESULT([$initconfdir])
+ AC_SUBST(initconfdir)
+
+ AC_MSG_CHECKING([whether initramfs-tools is available])
+ if test -d /usr/share/initramfs-tools ; then
+ RPM_DEFINE_INITRAMFS='--define "_initramfs 1"'
AC_MSG_RESULT([yes])
- $3
+ else
+ RPM_DEFINE_INITRAMFS=''
+ AC_MSG_RESULT([no])
fi
+ AC_SUBST(RPM_DEFINE_INITRAMFS)
])
dnl #
-dnl # 2.6.x API change
-dnl # bio_end_io_t uses 2 args (size was dropped from prototype)
+dnl # Default ZFS package configuration
dnl #
-AC_DEFUN([ZFS_AC_2ARGS_BIO_END_IO_T],
- [AC_MSG_CHECKING([whether bio_end_io_t wants 2 args])
- tmp_flags="$EXTRA_KCFLAGS"
- EXTRA_KCFLAGS="-Werror"
- ZFS_LINUX_TRY_COMPILE([
- #include <linux/bio.h>
- ],[
- void (*wanted_end_io)(struct bio *, int) = NULL;
- bio_end_io_t *local_end_io;
-
- local_end_io = wanted_end_io;
- ],[
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_2ARGS_BIO_END_IO_T, 1,
- [bio_end_io_t wants 2 args])
- ],[
- AC_MSG_RESULT(no)
+AC_DEFUN([ZFS_AC_PACKAGE], [
+ ZFS_AC_DEFAULT_PACKAGE
+ AS_IF([test x$VENDOR != xfreebsd], [
+ ZFS_AC_RPM
+ ZFS_AC_DPKG
+ ZFS_AC_ALIEN
])
- EXTRA_KCFLAGS="$tmp_flags"
])