X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=config%2Fzfs-build.m4;h=91fe04844501c87d1c87c6fad659fc0eefee3aac;hb=HEAD;hp=5eebdd48e276037bfd5943c9dbc0aae9ec155d3f;hpb=a54f863a14edbbd2c5bd14774c8f1ead32ed7bf5;p=zfs diff --git a/config/zfs-build.m4 b/config/zfs-build.m4 index 5eebdd48e..91fe04844 100644 --- a/config/zfs-build.m4 +++ b/config/zfs-build.m4 @@ -1,378 +1,511 @@ -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" + AC_DEFINE(ZFS_DEBUG, 1, [zfs debugging enabled]) - AC_MSG_RESULT([$zfsconfig]); - . ./config/$zfsconfig + KERNEL_DEBUG_CFLAGS="-Werror" + KERNEL_DEBUG_CPPFLAGS="-DDEBUG -UNDEBUG" +]) - TOPDIR=`/bin/pwd` - ZFSDIR=${TOPDIR}/$BUILDDIR - LIBDIR=$ZFSDIR/lib - CMDDIR=$ZFSDIR/zcmd +AC_DEFUN([ZFS_AC_DEBUG_DISABLE], [ + DEBUG_CFLAGS="" + DEBUG_CPPFLAGS="-UDEBUG -DNDEBUG" + DEBUG_LDFLAGS="" + DEBUG_ZFS="_without_debug" - AC_SUBST(TOPDIR) - AC_SUBST(ZFSDIR) - AC_SUBST(LIBDIR) - AC_SUBST(CMDDIR) + KERNEL_DEBUG_CFLAGS="" + KERNEL_DEBUG_CPPFLAGS="-UDEBUG -DNDEBUG" ]) -AC_DEFUN([ZFS_AC_KERNEL], [ - ver=`uname -r` - - AC_ARG_WITH([linux], - AS_HELP_STRING([--with-linux=PATH], - [Path to kernel source]), - [kernelsrc="$withval"; kernelbuild="$withval"]) - - AC_ARG_WITH(linux-obj, - AS_HELP_STRING([--with-linux-obj=PATH], - [Path to kernel build objects]), - [kernelbuild="$withval"]) - - AC_MSG_CHECKING([kernel source directory]) - if test -z "$kernelsrc"; then - kernelbuild= - sourcelink=/lib/modules/${ver}/source - buildlink=/lib/modules/${ver}/build - - 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 +dnl # +dnl # When debugging is enabled: +dnl # - Enable all ASSERTs (-DDEBUG) +dnl # - Promote all compiler warnings to errors (-Werror) +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])]) + + AC_SUBST(DEBUG_CFLAGS) + AC_SUBST(DEBUG_CPPFLAGS) + AC_SUBST(DEBUG_LDFLAGS) + AC_SUBST(DEBUG_ZFS) + + AC_SUBST(KERNEL_DEBUG_CFLAGS) + AC_SUBST(KERNEL_DEBUG_CPPFLAGS) + + AC_MSG_RESULT([$enable_debug]) +]) - AC_MSG_RESULT([$kernelsrc]) - AC_MSG_CHECKING([kernel build directory]) - AC_MSG_RESULT([$kernelbuild]) +AC_DEFUN([ZFS_AC_DEBUGINFO_ENABLE], [ + DEBUG_CFLAGS="$DEBUG_CFLAGS -g -fno-inline" - AC_MSG_CHECKING([kernel source version]) - if test -r $kernelbuild/include/linux/version.h && - fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then + KERNEL_DEBUG_CFLAGS="$KERNEL_DEBUG_CFLAGS -fno-inline" + KERNEL_MAKE="$KERNEL_MAKE CONFIG_DEBUG_INFO=y" - kernsrcver=`(echo "#include "; - echo "kernsrcver=UTS_RELEASE") | - cpp -I $kernelbuild/include | - grep "^kernsrcver=" | cut -d \" -f 2` + DEBUGINFO_ZFS="_with_debuginfo" +]) - elif test -r $kernelbuild/include/linux/utsrelease.h && - fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then +AC_DEFUN([ZFS_AC_DEBUGINFO_DISABLE], [ + DEBUGINFO_ZFS="_without_debuginfo" +]) - kernsrcver=`(echo "#include "; - echo "kernsrcver=UTS_RELEASE") | - cpp -I $kernelbuild/include | - grep "^kernsrcver=" | cut -d \" -f 2` - fi +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]) - 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 + AS_CASE(["x$enable_debuginfo"], + ["xyes"], + [ZFS_AC_DEBUGINFO_ENABLE], + ["xno"], + [ZFS_AC_DEBUGINFO_DISABLE], + [AC_MSG_ERROR([Unknown option $enable_debuginfo])]) - AC_MSG_RESULT([$kernsrcver]) + AC_SUBST(DEBUG_CFLAGS) + AC_SUBST(DEBUGINFO_ZFS) - kmoduledir=${INSTALL_MOD_PATH}/lib/modules/$kernsrcver - LINUX=${kernelsrc} - LINUX_OBJ=${kernelbuild} + AC_SUBST(KERNEL_DEBUG_CFLAGS) + AC_SUBST(KERNEL_MAKE) - AC_SUBST(LINUX) - AC_SUBST(LINUX_OBJ) - AC_SUBST(kmoduledir) + AC_MSG_RESULT([$enable_debuginfo]) ]) -AC_DEFUN([ZFS_AC_SPL], [ - - AC_ARG_WITH([spl], - AS_HELP_STRING([--with-spl=PATH], - [Path to spl source]), - [splsrc="$withval"; splbuild="$withval"]) - - AC_ARG_WITH([spl-obj], - AS_HELP_STRING([--with-spl-obj=PATH], - [Path to spl build objects]), - [splbuild="$withval"]) - - - AC_MSG_CHECKING([spl source directory]) - if test -z "$splsrc"; then - splbuild= - sourcelink=/tmp/`whoami`/spl - buildlink=/tmp/`whoami`/spl - - 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 # 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+=" -DDEBUG_KMEM" + DEBUG_KMEM_ZFS="_with_debug_kmem" + ], [ + DEBUG_KMEM_ZFS="_without_debug_kmem" + ]) - if test -z "$splsrc" -o -z "$splbuild"; then - sourcelink=/lib/modules/${ver}/source - buildlink=/lib/modules/${ver}/build - - 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_SUBST(KERNEL_DEBUG_CPPFLAGS) + AC_SUBST(DEBUG_KMEM_ZFS) - AC_MSG_RESULT([$splsrc]) - AC_MSG_CHECKING([spl build directory]) - AC_MSG_RESULT([$splbuild]) + AC_MSG_RESULT([$enable_debug_kmem]) +]) - AC_MSG_CHECKING([spl source version]) - if test -r $splbuild/spl_config.h && - fgrep -q VERSION $splbuild/spl_config.h; then +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+=" -DDEBUG_KMEM_TRACKING" + DEBUG_KMEM_TRACKING_ZFS="_with_debug_kmem_tracking" + ], [ + DEBUG_KMEM_TRACKING_ZFS="_without_debug_kmem_tracking" + ]) - splsrcver=`(echo "#include "; - echo "splsrcver=VERSION") | - cpp -I $splbuild | - grep "^splsrcver=" | cut -d \" -f 2` - fi + AC_SUBST(KERNEL_DEBUG_CPPFLAGS) + AC_SUBST(DEBUG_KMEM_TRACKING_ZFS) - 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 + AC_MSG_RESULT([$enable_debug_kmem_tracking]) +]) - AC_MSG_RESULT([$splsrcver]) +AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [ + ZFS_AC_CONFIG_ALWAYS_CC_NO_UNUSED_BUT_SET_VARIABLE + ZFS_AC_CONFIG_ALWAYS_CC_NO_BOOL_COMPARE + ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN + ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION + ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER + ZFS_AC_CONFIG_ALWAYS_CC_ASAN + 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 +]) - 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 +AC_DEFUN([ZFS_AC_CONFIG], [ + + dnl # Remove the previous build test directory. + rm -Rf build - 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]) + AC_ARG_VAR([TEST_JOBS], + [simultaneous jobs during configure (defaults to $(nproc))]) + if test "x$ac_cv_env_TEST_JOBS_set" != "xset"; then + TEST_JOBS=$(nproc) fi + AC_SUBST(TEST_JOBS) - AC_MSG_RESULT([$splsymvers]) - AC_SUBST(splsrc) - AC_SUBST(splsymvers) + 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], + [AC_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 + + case "$ZFS_CONFIG" in + kernel) ZFS_AC_CONFIG_KERNEL ;; + user) ZFS_AC_CONFIG_USER ;; + all) ZFS_AC_CONFIG_USER + ZFS_AC_CONFIG_KERNEL ;; + srpm) ;; + *) + AC_MSG_RESULT([Error!]) + AC_MSG_ERROR([Bad value "$ZFS_CONFIG" for --with-config, + user kernel|user|all|srpm]) ;; + esac + + 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 ]) ]) -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 # +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/' directory and enabled using +dnl # the --with-spec= 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_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 -]) + 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_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_COMMON='--define "$(DEBUG_ZFS) 1"' + RPM_DEFINE_COMMON+=' --define "$(DEBUG_KMEM_ZFS) 1"' + RPM_DEFINE_COMMON+=' --define "$(DEBUG_KMEM_TRACKING_ZFS) 1"' + RPM_DEFINE_COMMON+=' --define "$(DEBUGINFO_ZFS) 1"' + RPM_DEFINE_COMMON+=' --define "$(ASAN_ZFS) 1"' + + RPM_DEFINE_UTIL=' --define "_initconfdir $(DEFAULT_INITCONF_DIR)"' + + 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='--define "_dracutdir $(dracutdir)"' + ]) + AS_IF([test -n "$udevdir" ], [ + RPM_DEFINE_UTIL+=' --define "_udevdir $(udevdir)"' + ]) + AS_IF([test -n "$udevruledir" ], [ + RPM_DEFINE_UTIL+=' --define "_udevdir $(udevruledir)"' + ]) + RPM_DEFINE_UTIL+=' $(DEFINE_INITRAMFS)' + RPM_DEFINE_UTIL+=' $(DEFINE_SYSTEMD)' + RPM_DEFINE_UTIL+=' $(DEFINE_PYZFS)' + RPM_DEFINE_UTIL+=' $(DEFINE_PYTHON_VERSION)' + RPM_DEFINE_UTIL+=' $(DEFINE_PYTHON_PKG_VERSION)' + + dnl # Override default lib directory on Debian/Ubuntu systems. The + dnl # provided /usr/lib/rpm/platform//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+=' --define "_lib $(MULTIARCH_LIBDIR)"' + AC_SUBST(MULTIARCH_LIBDIR) + ]) -dnl # -dnl # ZFS_LINUX_CONFTEST -dnl # -AC_DEFUN([ZFS_LINUX_CONFTEST], [ -cat >conftest.c <<_ACEOF -$1 -_ACEOF + RPM_DEFINE_KMOD='--define "kernels $(LINUX_VERSION)"' + RPM_DEFINE_KMOD+=' --define "ksrc $(LINUX)"' + RPM_DEFINE_KMOD+=' --define "kobj $(LINUX_OBJ)"' + RPM_DEFINE_KMOD+=' --define "_wrong_version_format_terminate_build 0"' + + 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_LANG_PROGRAM(C)([PROLOGUE], [BODY]) +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 # -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_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_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_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_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_DPKG) + AC_SUBST(DPKG) + AC_SUBST(DPKG_VERSION) + + 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 - #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] }') + HAVE_ALIEN=yes + AC_MSG_RESULT([$HAVE_ALIEN ($ALIEN_VERSION)]) ],[ - #ifndef CONFIG_$1 - #error CONFIG_$1 not #defined - #endif - ],[ - 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) ]) 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 - else - AC_MSG_RESULT([yes]) - $3 - fi +AC_DEFUN([ZFS_AC_DEFAULT_PACKAGE], [ + AC_MSG_CHECKING([linux distribution]) + 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 ; else + VENDOR= ; + fi + 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 ;; + *) DEFAULT_PACKAGE=rpm ;; + esac + AC_MSG_RESULT([$DEFAULT_PACKAGE]) + AC_SUBST(DEFAULT_PACKAGE) + + DEFAULT_INIT_DIR=$sysconfdir/init.d + AC_MSG_CHECKING([default init directory]) + AC_MSG_RESULT([$DEFAULT_INIT_DIR]) + AC_SUBST(DEFAULT_INIT_DIR) + + AC_MSG_CHECKING([default init script type]) + 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 ;; + *) DEFAULT_INIT_SCRIPT=lsb ;; + esac + AC_MSG_RESULT([$DEFAULT_INIT_SCRIPT]) + AC_SUBST(DEFAULT_INIT_SCRIPT) + + AC_MSG_CHECKING([default init config directory]) + case "$VENDOR" in + alpine) DEFAULT_INITCONF_DIR=/etc/conf.d ;; + gentoo) DEFAULT_INITCONF_DIR=/etc/conf.d ;; + toss) DEFAULT_INITCONF_DIR=/etc/sysconfig ;; + redhat) DEFAULT_INITCONF_DIR=/etc/sysconfig ;; + fedora) DEFAULT_INITCONF_DIR=/etc/sysconfig ;; + sles) DEFAULT_INITCONF_DIR=/etc/sysconfig ;; + ubuntu) DEFAULT_INITCONF_DIR=/etc/default ;; + debian) DEFAULT_INITCONF_DIR=/etc/default ;; + *) DEFAULT_INITCONF_DIR=/etc/default ;; + esac + AC_MSG_RESULT([$DEFAULT_INITCONF_DIR]) + AC_SUBST(DEFAULT_INITCONF_DIR) + + AC_MSG_CHECKING([whether initramfs-tools is available]) + if test -d /usr/share/initramfs-tools ; then + DEFINE_INITRAMFS='--define "_initramfs 1"' AC_MSG_RESULT([yes]) - $3 + else + DEFINE_INITRAMFS='' + AC_MSG_RESULT([no]) fi + AC_SUBST(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 - ],[ - 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) - ]) - EXTRA_KCFLAGS="$tmp_flags" +AC_DEFUN([ZFS_AC_PACKAGE], [ + ZFS_AC_DEFAULT_PACKAGE + ZFS_AC_RPM + ZFS_AC_DPKG + ZFS_AC_ALIEN ])