Whamcloud - gitweb
LU-3117 build: zfs-0.6.1 kmod+dkms compatibility
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 28 Mar 2013 19:18:27 +0000 (12:18 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 7 May 2013 18:09:52 +0000 (14:09 -0400)
With the release of zfs-0.6.1 the default install location of
the zfs kmod headers and objects has changed.  The kmod headers
which are common for a zfs version are now installed under
/usr/src/zfs-<version>/ path.  The objects, which are kernel
specific, are installed under /usr/src/zfs-<version>/<kernel>/.

This was done just prior to the official 0.6.1 release because
this scheme satisfies the packaging requirements of the major
distributions.  Making the change now means we shouldn't need
to change it again.

To accomidate this change the lustre-build-zfs.m4 has been
updated in the following ways:

* The new zfs header and object paths were added to the list
  of default search paths.  The DKMS build paths were also added
  to allow compilation against zfs-kmod or zfs-dkms packages.

* Support for building the spl and zfs code recursively as
  part of the Lustre build process was removed.

* The lustre-osd-zfs packages 'Requires' line was changed to
  require zfs-kmod.  Either the zfs-kmod or zfs-dkms packages
  can be used to satisfy this requirement.

* Fix incorrect usage of @ZFS_OBJ@ in osd-zfs/Makefile.in,
  the include directory us under @ZFS@ with the headers.
  These happens to be the same location before so it never
  caused issues.

* EXTRA_LIBZFS_INCLUDE renamed ZFS_LIBZFS_INCLUDE, this was
  done for consistency.

* Failing to build ldiskfs should not automatically disable
  all server support.  The zfs osd may still be buildable.

* General m4 cleanup and simplification of lustre-build-zfs.m4.

* Ensure new zfs/spl build correctly with lbuild.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Change-Id: Ib686211c4f9ace39a41053ce8a20112d1121def9
Signed-off-by: Nathaniel Clark <nathaniel.l.clark@intel.com>
Reviewed-on: http://review.whamcloud.com/5960
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alexey Shvetsov <alexxy@gentoo.org>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
autoMakefile.am
config/lustre-build-ldiskfs.m4
config/lustre-build-zfs.m4
contrib/lbuild/lbuild
lustre.spec.in
lustre/osd-zfs/Makefile.in
lustre/utils/Makefile.am

index 7dd4f1b..1cc3b48 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS := @LDISKFS_SUBDIR@ @SPL_SUBDIR@ @ZFS_SUBDIR@ . @LIBSYSIO_SUBDIR@ @SNMP_SUBDIR@ @LUSTREIOKIT_SUBDIR@ @LIBCFS_SUBDIR@ lnet lustre
+SUBDIRS := @LDISKFS_SUBDIR@ . @LIBSYSIO_SUBDIR@ @SNMP_SUBDIR@ @LUSTREIOKIT_SUBDIR@ @LIBCFS_SUBDIR@ lnet lustre
 DIST_SUBDIRS := @LDISKFS_DIST_SUBDIR@ @SNMP_DIST_SUBDIR@ libsysio lustre-iokit @LIBCFS_SUBDIR@ lnet lustre config contrib
 SOURCES_SUBDIRS := @LIBCFS_SUBDIR@ lnet lustre
 RPM_SUBDIRS := @LDISKFS_SUBDIR@ @LUSTREIOKIT_SUBDIR@
index d619d7c..f29fd39 100644 (file)
@@ -189,7 +189,6 @@ else
 fi
 
 if test x$enable_ldiskfs_build = xno; then
-       enable_server='no'
        enable_ldiskfs_build='no'
        with_ldiskfs='no'
        LDISKFS_SUBDIR=
index bfc647f..507afd8 100644 (file)
-#
-# LB_PATH_SPL
-#
-# --with-spl      - Enable spl support and attempt to autodetect the spl
-# --with-spl=yes    headers in one of the following places in this order:
-#                   * ./spl
-#                   * /usr/src/spl-*/$LINUXRELEASE
-#                   * ../spl
-#
-# --with-spl=path - Enable spl support and use the spl headers in the
-#                   provided path.  No autodetection is performed.
-#
-# --with-spl-obj  - When spl support is enabled the object directory
-#                   will be based on the --with-spl directory.  If this
-#                   is detected incorrectly it can be explicitly
-#                   specified using this option.
-#
-# NOTE: As with all external packages spl is expected to already be
-# configured and built.  However, if the spl tree is located in-tree
-# (./spl) then it will be configured and built recursively as part of
-# the lustre build system.
-#
-AC_DEFUN([LB_PATH_SPL],
-[
-AC_ARG_WITH([spl],
-       AC_HELP_STRING([--with-spl=path], [set path to spl sources]),
-       [],[
-               if test x$enable_server = xyes && test x$enable_dist = xno; then
-                       with_spl='yes'
-               else
-                       with_spl='no'
-               fi
+dnl #
+dnl # Supported configure options.  When no options are specified support
+dnl # for ZFS OSDs will be autodetected assuming server support is enabled.
+dnl # If the ZFS OSD cannot be built support for it is disabled and a
+dnl # warning is issued but the configure process is allowed to continue.
+dnl #
+dnl # --without-zfs   - Disable zfs support.
+dnl # --with-zfs=no
+dnl #
+dnl # --with-zfs      - Enable zfs support and attempt to autodetect the zfs
+dnl # --with-zfs=yes    headers in one of the following places.  Because zfs
+dnl #                   support was explicitly required if the headers cannot
+dnl #                   be located it is treated as a fatal error.
+dnl #
+dnl #                       * /var/lib/dkms/zfs/${VERSION}/build
+dnl #                       * /usr/src/zfs-${VERSION}/${LINUXRELEASE}
+dnl #                       * /usr/src/zfs-${VERSION}
+dnl #                       * ../spl/
+dnl #                       * $LINUX
+dnl #
+dnl # --with-zfs=path - Enable zfs support and use the zfs headers in the
+dnl #                   provided path.  No autodetection is performed and
+dnl #                   if no headers are found this is a fatal error.
+dnl #
+dnl # --with-zfs-obj  - When zfs support is enabled the object directory
+dnl #                   will be based on the --with-zfs directory.  If this
+dnl #                   is detected incorrectly it can be explicitly
+dnl #                   specified using this option.
+dnl #
+dnl # --without-spl   - Disable spl support.
+dnl # --with-spl=no
+dnl #
+dnl # --with-spl      - Enable spl support and attempt to autodetect the spl
+dnl # --with-spl=yes    headers in one of the following places in this order:
+dnl #                   * /var/lib/dkms/spl/${VERSION}/build
+dnl #                   * /usr/src/spl-${VERSION}/${LINUXRELEASE}
+dnl #                   * /usr/src/spl-${VERSION}
+dnl #                   * ../spl/
+dnl #                   * $LINUX
+dnl #
+dnl # --with-spl=path - Enable spl support and use the spl headers in the
+dnl #                   provided path.  No autodetection is performed.
+dnl #
+dnl # --with-spl-obj  - When spl support is enabled the object directory
+dnl #                   will be based on the --with-spl directory.  If this
+dnl #                   is detected incorrectly it can be explicitly
+dnl #                   specified using this option.
+dnl #
+AC_DEFUN([LB_SPL], [
+       AC_ARG_WITH([spl],
+               AS_HELP_STRING([--with-spl=PATH],
+               [Path to spl source]),
+               [splsrc="$withval"])
+
+       AC_ARG_WITH([spl-obj],
+               AS_HELP_STRING([--with-spl-obj=PATH],
+               [Path to spl build objects]),
+               [splobj="$withval"])
+
+       dnl #
+       dnl # The existence of spl.release[.in] is used to identify a valid
+       dnl # source directory.  In order of preference:
+       dnl #
+       splver=$(ls -1 /usr/src/ | grep -m1 spl | cut -f2 -d'-')
+       splsrc0="/var/lib/dkms/spl/${splver}/build"
+       splsrc1="/usr/src/spl-${splver}/${LINUXRELEASE}"
+       splsrc2="/usr/src/spl-${splver}"
+       splsrc3="../spl/"
+       splsrc4="$LINUX"
+
+       AC_MSG_CHECKING([spl source directory])
+       AS_IF([test -z "${splsrc}"], [
+               AS_IF([test -e "${splsrc0}/spl.release.in"], [
+                       splsrc=${splsrc0}
+               ], [test -e "${splsrc1}/spl.release.in"], [
+                       splsrc=${splsrc1}
+               ], [test -e "${splsrc2}/spl.release.in"], [
+                       splsrc=${splsrc2}
+               ], [test -e "${splsrc3}/spl.release.in"], [
+                       splsrc=$(readlink -f "${splsrc3}")
+               ], [test -e "${splsrc4}/spl.release.in"], [
+                       splsrc=${splsrc4}
+               ], [
+                       splsrc="[Not found]"
+               ])
        ])
+       AC_MSG_RESULT([$splsrc])
 
-case x$with_spl in
-       xno)
-               AC_MSG_ERROR([spl must be enabled when building zfs.])
-               ;;
-       xyes)
-               SPL_DIR=
-
-               # Check ./spl
-               spl_src=$PWD/spl
-               if test -e "$spl_src"; then
-                       SPL_DIR=$(readlink -f $spl_src)
-               else
-                       # Check /usr/src/spl-*/$LINUXRELEASE
-                       spl_src=$(ls -1d /usr/src/spl-*/$LINUXRELEASE \
-                                 2>/dev/null | tail -1)
-                       if test -e "$spl_src"; then
-                               SPL_DIR=$(readlink -f $spl_src)
-                       else
-                               # Check ../spl
-                               spl_src=$PWD/../spl
-                               if test -e "$spl_src"; then
-                                       SPL_DIR=$(readlink -f $spl_src)
-                               else
-                                       # Fatal spl required for zfs builds
-                                       AC_MSG_ERROR([Could not locate spl.])
-                               fi
-                       fi
-               fi
-
-               ;;
-       *)
-               SPL_DIR=$(readlink -f $with_spl)
-               with_spl='yes'
-               ;;
-esac
-
-AC_ARG_WITH([spl-obj],
-       AC_HELP_STRING([--with-spl-obj=path], [set path to spl objects]),
-       [
-               if test x$with_spl = xyes; then
-                       SPL_OBJ="$withval"
-               fi
-       ],[
-               if test x$with_spl = xyes; then
-                       SPL_OBJ=$SPL_DIR
-               fi
+       AS_IF([test ! -e "$splsrc/spl.release" &&
+           test ! -e "$splsrc/spl.release.in"], [
+               enable_zfs=no
        ])
 
-AC_MSG_CHECKING([spl source directory])
-AC_MSG_RESULT([$SPL_DIR])
-AC_SUBST(SPL_DIR)
-
-AC_MSG_CHECKING([spl object directory])
-AC_MSG_RESULT([$SPL_OBJ])
-AC_SUBST(SPL_OBJ)
-
-LB_SPL_SYMVERS
-LB_SPL_RELEASE
-])
+       dnl #
+       dnl # The existence of the spl_config.h is used to identify a valid
+       dnl # spl object directory.  In many cases the object and source
+       dnl # directory are the same, however the objects may also reside
+       dnl # is a subdirectory named after the kernel version.
+       dnl #
+       AC_MSG_CHECKING([spl build directory])
+       AS_IF([test -z "$splobj"], [
+               AS_IF([test -e "${splsrc}/${LINUXRELEASE}/spl_config.h"], [
+                       splobj="${splsrc}/${LINUXRELEASE}"
+               ], [test -e "${splsrc}/spl_config.h"], [
+                       splobj="${splsrc}"
+               ], [
+                       splobj="[Not found]"
+               ])
+       ])
+       AC_MSG_RESULT([$splobj])
 
-#
-# LB_SPL_BUILD
-#
-# Optionally configure/make the spl sources.  If the sources are
-# determined to reside in-tree this feature will automatically be
-# enabled.  If the sources are not in-tree it will be disabled.
-# Use --enable-spl-build or --disable-spl-build if you need to
-# override this behavior.
-#
-AC_DEFUN([LB_SPL_BUILD],
-[
-AC_ARG_ENABLE([spl-build],
-       AC_HELP_STRING([--enable-spl-build], [enable spl configure/make]),
-       [], [
-               SPL_DIR_INTREE=$(readlink -f $PWD/spl)
-               if test x$SPL_DIR = x$SPL_DIR_INTREE; then
-                       enable_spl_build='yes'
-               else
-                       enable_spl_build='no'
-               fi
+       AS_IF([test ! -e "$splobj/spl_config.h"], [
+               enable_zfs=no
        ])
 
-AC_MSG_CHECKING([whether to build spl])
-if test x$enable_spl_build = xyes; then
-       AC_MSG_RESULT([$enable_spl_build])
+       dnl #
+       dnl # Verify the source version using SPL_META_VERSION in spl_config.h
+       dnl #
+       AS_IF([test x$enable_zfs = xyes], [
+               AC_MSG_CHECKING([spl source version])
+               AS_IF([fgrep -q SPL_META_VERSION $splobj/spl_config.h], [
+                       splver=$((echo "#include <spl_config.h>";
+                           echo "splver=SPL_META_VERSION-SPL_META_RELEASE") |
+                           cpp -I $splobj |
+                           grep "^splver=" | tr -d \" | cut -d= -f2)
+               ], [
+                       splver="[Not found]"
+                       enable_zfs=no
+               ])
+               AC_MSG_RESULT([$splver])
+       ])
 
-       LB_CHECK_FILE([$SPL_DIR/module/spl/spl-generic.c], [], [
-               AC_MSG_ERROR([Complete spl source must exist when building.])])
+       dnl #
+       dnl # Verify the modules systems exist by the expect name.
+       dnl #
+       AS_IF([test x$enable_zfs = xyes], [
+               AC_MSG_CHECKING([spl file name for module symbols])
+               AS_IF([test -r $splobj/$SYMVERFILE], [
+                       splsym=$SYMVERFILE
+               ], [test -r $splobj/module/$SYMVERFILE], [
+                       splsym=$SYMVERFILE
+               ], [
+                       splsym="[Not found]"
+                       enable_zfs=no
+               ])
+               AC_MSG_RESULT([$splsym])
+       ])
 
-       LB_CHECK_FILE([$SPL_DIR/configure], [], [
-               AC_MSG_ERROR([Complete spl source must exist when building.])])
+       SPL=${splsrc}
+       SPL_OBJ=${splobj}
+       SPL_VERSION=${splver}
+       SPL_SYMBOLS=${splsym}
 
-       SPL_SUBDIR="$SPL_DIR"
-       AC_SUBST(SPL_SUBDIR)
-       AC_CONFIG_SUBDIRS("spl")
-else
-       enable_spl_build='no'
-       AC_MSG_RESULT([$enable_spl_build])
-fi
+       AC_SUBST(SPL)
+       AC_SUBST(SPL_OBJ)
+       AC_SUBST(SPL_VERSION)
+       AC_SUBST(SPL_SYMBOLS)
 ])
 
-#
-# LB_SPL_SYMVERS
-#
-AC_DEFUN([LB_SPL_SYMVERS],
-[
-AC_MSG_CHECKING([spl module symbols])
-if test -r $SPL_OBJ/Module.symvers; then
-       SPL_SYMBOLS=Module.symvers
-elif test -r $SPL_OBJ/Modules.symvers; then
-       SPL_SYMBOLS=Modules.symvers
-elif test -r $SPL_OBJ/module/Module.symvers; then
-       SPL_SYMBOLS=Module.symvers
-elif test -r $SPL_OBJ/module/Modules.symvers; then
-       SPL_SYMBOLS=Modules.symvers
-else
-       SPL_SYMBOLS=$SYMVERFILE
-fi
-
-AC_MSG_RESULT([$SPL_SYMBOLS])
-AC_SUBST(SPL_SYMBOLS)
-])
+AC_DEFUN([LB_ZFS], [
+       AC_ARG_WITH([zfs-obj],
+               AS_HELP_STRING([--with-zfs-obj=PATH],
+               [Path to zfs build objects]),
+               [zfsobj="$withval"])
+
+       dnl #
+       dnl # The existence of zfs.release[.in] is used to identify a valid
+       dnl # source directory.  In order of preference:
+       dnl #
+       zfsver=$(ls -1 /usr/src/ | grep -m1 zfs | cut -f2 -d'-')
+       zfssrc0="/var/lib/dkms/zfs/${zfsver}/build"
+       zfssrc1="/usr/src/zfs-${zfsver}/${LINUXRELEASE}"
+       zfssrc2="/usr/src/zfs-${zfsver}"
+       zfssrc3="../zfs/"
+       zfssrc4="$LINUX"
 
-#
-# LB_SPL_RELEASE
-#
-AC_DEFUN([LB_SPL_RELEASE],
-[
-AC_MSG_CHECKING([spl source release])
-if test -r $SPL_OBJ/spl_config.h; then
-       tmp_flags="$EXTRA_KCFLAGS"
-       EXTRA_KCFLAGS="-I$SPL_DIR $EXTRA_KCFLAGS"
-       LB_LINUX_TRY_MAKE([
-               #include <$SPL_OBJ/spl_config.h>
-       ],[
-               char *SPL_RELEASE;
-               SPL_RELEASE=SPL_META_VERSION;
-       ],[
-               $makerule LUSTRE_KERNEL_TEST=conftest.i
-       ],[
-               test -s build/conftest.i
-       ],[
-               eval $(grep "SPL_RELEASE=" build/conftest.i)
-       ],[
-               AC_MSG_RESULT([unknown])
-               AC_MSG_ERROR([Could not preprocess test program.])
+       AC_MSG_CHECKING([zfs source directory])
+       AS_IF([test -z "${zfssrc}"], [
+               AS_IF([test -e "${zfssrc0}/zfs.release.in"], [
+                       zfssrc=${zfssrc0}
+               ], [test -e "${zfssrc1}/zfs.release.in"], [
+                       zfssrc=${zfssrc1}
+               ], [test -e "${zfssrc2}/zfs.release.in"], [
+                       zfssrc=${zfssrc2}
+               ], [test -e "${zfssrc3}/zfs.release.in"], [
+                       zfssrc=$(readlink -f "${zfssrc3}")
+               ], [test -e "${zfssrc4}/zfs.release.in"], [
+                       zfssrc=${zfssrc4}
+               ], [
+                       zfssrc="[Not found]"
+               ])
        ])
-       EXTRA_KCFLAGS="$tmp_flags"
-       rm build/conftest.i
-elif test -r $SPL_DIR/META; then
-       SPL_RELEASE=$(awk '/Version/ { print [$]2 }' $SPL_DIR/META)
-else
-       AC_MSG_RESULT([unknown])
-       AC_MSG_ERROR([Could not locate spl_config.h or META to check release.])
-fi
-
-if test x$SPL_RELEASE = x; then
-       AC_MSG_RESULT([unknown])
-       AC_MSG_ERROR([Could not determine spl release.])
-fi
-
-AC_MSG_RESULT([$SPL_RELEASE])
-AC_SUBST(SPL_RELEASE)
-])
-
+       AC_MSG_RESULT([$zfssrc])
 
-#
-# LB_PATH_ZFS
-#
-# --without-zfs   - Disable zfs support.
-# --with-zfs=no
-#
-# --with-zfs      - Enable zfs support and attempt to autodetect the zfs
-# --with-zfs=yes    headers in one of the following places in this order:
-#                   * ./zfs
-#                   * /usr/src/zfs-*/$LINUXRELEASE
-#                   * ../zfs
-#
-# --with-zfs=path - Enable zfs support and use the zfs headers in the
-#                   provided path.  No autodetection is performed.
-#
-# --with-zfs-obj  - When zfs support is enabled the object directory
-#                   will be based on the --with-zfs directory.  If this
-#                   is detected incorrectly it can be explicitly
-#                   specified using this option.
-#
-# NOTE: As with all external packages zfs is expected to already be
-# configured and built.  However, if the zfs tree is located in-tree
-# (./zfs) then it will be configured and built recursively as part of
-# the lustre build system.
-#
-AC_DEFUN([LB_PATH_ZFS],
-[
-AC_ARG_WITH([zfs],
-       AC_HELP_STRING([--with-zfs=path], [set path to zfs sources]),
-       [],[
-               if test x$enable_server = xyes && test x$enable_dist = xno; then
-                       with_zfs='yes'
-               else
-                       with_zfs='no'
-               fi
+       AS_IF([test ! -e "$zfssrc/zfs.release.in" &&
+           test ! -e "$zfssrc/zfs.release"], [
+               enable_zfs=no
        ])
 
-case x$with_zfs in
-       xno)
-               ZFS_DIR=
-               ;;
-       xyes)
-               ZFS_DIR=
-
-               # Check ./zfs
-               zfs_src=$PWD/zfs
-               if test -e "$zfs_src"; then
-                       ZFS_DIR=$(readlink -f $zfs_src)
-               else
-                       # Check /usr/src/zfs-*/$LINUXRELEASE
-                       zfs_src=$(ls -1d /usr/src/zfs-*/$LINUXRELEASE \
-                               2>/dev/null|tail -1)
-                       if test -e "$zfs_src"; then
-                               ZFS_DIR=$(readlink -f $zfs_src)
-                       else
-                               # Check ../zfs
-                               zfs_src=$PWD/../zfs
-                               if test -e "$zfs_src"; then
-                                       ZFS_DIR=$(readlink -f $zfs_src)
-                               else
-                                       # Disable zfs failed to detect sources
-                                       with_zfs='no'
-                               fi
-                       fi
-               fi
-               ;;
-       *)
-               ZFS_DIR=$(readlink -f $with_zfs)
-               with_zfs='yes'
-               ;;
-esac
-
-AC_MSG_CHECKING([whether to enable zfs])
-AC_MSG_RESULT([$with_zfs])
-
-if test x$with_zfs = xyes; then
-       AC_MSG_CHECKING([for location of zfs library headers])
-       if test -e "$ZFS_DIR/include/libzfs.h"; then
-               EXTRA_LIBZFS_INCLUDE="$EXTRA_LIBZFS_INCLUDE -I $ZFS_DIR/lib/libspl/include -I $ZFS_DIR/include"
-               AC_MSG_RESULT([$ZFS_DIR])
-       elif test -e "$ZFS_DIR/libzfs/libzfs.h"; then
-               EXTRA_LIBZFS_INCLUDE="$EXTRA_LIBZFS_INCLUDE -I $ZFS_DIR/libspl -I $ZFS_DIR/libzfs"
-               AC_MSG_RESULT([$ZFS_DIR])
-       elif test -e "/usr/include/libzfs/libzfs.h"; then
-               AC_MSG_RESULT([/usr/include])
-               EXTRA_LIBZFS_INCLUDE="$EXTRA_LIBZFS_INCLUDE -I /usr/include/libspl -I /usr/include/libzfs"
-       else
-               AC_MSG_RESULT([unknown])
-               AC_MSG_ERROR([Could not locate zfs library headers.])
-       fi
-       AC_SUBST(EXTRA_LIBZFS_INCLUDE)
-fi
-
-AC_ARG_WITH([zfs-obj],
-       AC_HELP_STRING([--with-zfs-obj=path], [set path to zfs objects]),
-       [
-               if test x$with_zfs = xyes; then
-                       ZFS_OBJ="$withval"
-               fi
-       ],[
-               if test x$with_zfs = xyes; then
-                       ZFS_OBJ=$ZFS_DIR
-               fi
+       dnl #
+       dnl # The existence of the zfs_config.h is used to identify a valid
+       dnl # zfs object directory.  In many cases the object and source
+       dnl # directory are the same, however the objects may also reside
+       dnl # is a subdirectory named after the kernel version.
+       dnl #
+       AC_MSG_CHECKING([zfs build directory])
+       AS_IF([test -z "$zfsobj"], [
+               AS_IF([test -e "${zfssrc}/${LINUXRELEASE}/zfs_config.h"], [
+                       zfsobj="${zfssrc}/${LINUXRELEASE}"
+               ], [test -e "${zfssrc}/zfs_config.h"], [
+                       zfsobj="${zfssrc}"
+               ], [
+                       zfsobj="[Not found]"
+               ])
        ])
 
-if test x$with_zfs = xyes; then
-       LB_ZFS_DEFINE_OPTIONS
-
-       AC_MSG_CHECKING([zfs source directory])
-       AC_MSG_RESULT([$ZFS_DIR])
-       AC_SUBST(ZFS_DIR)
-
-       AC_MSG_CHECKING([zfs object directory])
-       AC_MSG_RESULT([$ZFS_OBJ])
-       AC_SUBST(ZFS_OBJ)
+       AC_MSG_RESULT([$zfsobj])
+       AS_IF([test ! -e "$zfsobj/zfs_config.h"], [
+               enable_zfs=no
+       ])
 
-       LB_ZFS_SYMVERS
-       LB_ZFS_RELEASE
+       dnl #
+       dnl # Verify the source version using SPL_META_VERSION in spl_config.h
+       dnl #
+       AS_IF([test x$enable_zfs = xyes], [
+               AC_MSG_CHECKING([zfs source version])
+               AS_IF([fgrep -q ZFS_META_VERSION $zfsobj/zfs_config.h], [
+                       zfsver=$((echo "#include <zfs_config.h>";
+                           echo "zfsver=ZFS_META_VERSION-ZFS_META_RELEASE") |
+                           cpp -I $zfsobj |
+                           grep "^zfsver=" | tr -d \" | cut -d= -f2)
+               ],[
+                       zfsver="[Not found]"
+                       enable_zfs=no
+               ])
+               AC_MSG_RESULT([$zfsver])
+       ])
 
-       LB_PATH_SPL
+       dnl #
+       dnl # Verify the modules systems exist by the expect name.
+       dnl #
+       AS_IF([test x$enable_zfs = xyes], [
+               AC_MSG_CHECKING([zfs file name for module symbols])
+               AS_IF([test -r $zfsobj/$SYMVERFILE], [
+                       zfssym=$SYMVERFILE
+               ], [test -r $zfsobj/module/$SYMVERFILE], [
+                       zfssym=$SYMVERFILE
+               ], [
+                       zfssym="[Not found]"
+                       enable_zfs=no
+               ])
+               AC_MSG_RESULT([$zfssym])
+       ])
 
-       LB_SPL_BUILD
-       LB_ZFS_BUILD
-fi
+       ZFS=${zfssrc}
+       ZFS_OBJ=${zfsobj}
+       ZFS_VERSION=${zfsver}
+       ZFS_SYMBOLS=${zfssym}
 
-AM_CONDITIONAL(SPL_BUILD, test x$enable_spl_build = xyes)
-AM_CONDITIONAL(ZFS_BUILD, test x$enable_zfs_build = xyes)
-AM_CONDITIONAL(ZFS_ENABLED, test x$with_zfs = xyes)
+       AC_SUBST(ZFS)
+       AC_SUBST(ZFS_OBJ)
+       AC_SUBST(ZFS_VERSION)
+       AC_SUBST(ZFS_SYMBOLS)
 ])
 
-#
-# LB_ZFS_BUILD
-#
-# Optionally configure/make the zfs sources.  If the sources are
-# determined to reside in-tree this feature will automatically be
-# enabled.  If the sources are not in-tree it will be disabled.
-# Use --enable-zfs-build or --disable-zfs-build if you need to
-# override this behavior.
-#
-AC_DEFUN([LB_ZFS_BUILD],
-[
-AC_ARG_ENABLE([zfs-build],
-       AC_HELP_STRING([--enable-zfs-build], [enable zfs configure/make]),
-       [], [
-               ZFS_DIR_INTREE=$(readlink -f $PWD/zfs)
-               if test x$ZFS_DIR = x$ZFS_DIR_INTREE; then
-                       enable_zfs_build='yes'
-               else
-                       enable_zfs_build='no'
-               fi
+AC_DEFUN([LB_ZFS_USER], [
+       dnl #
+       dnl # Detect user space zfs development headers.
+       dnl #
+       AC_MSG_CHECKING([zfs devel headers])
+       AS_IF([test -d /usr/include/libzfs && test -d /usr/include/libspl], [
+               zfslib="-I /usr/include/libspl -I /usr/include/libzfs"
+       ], [
+               zfslib="[Not found]"
+               enable_zfs=no
        ])
+       AC_MSG_RESULT([$zfslib])
 
-AC_MSG_CHECKING([whether to build zfs])
-if test x$enable_zfs_build = xyes; then
-       AC_MSG_RESULT([$enable_zfs_build])
-
-       LB_CHECK_FILE([$ZFS_DIR/module/zfs/dmu.c], [], [
-               AC_MSG_ERROR([Complete zfs sources must exist when building.])])
-
-       LB_CHECK_FILE([$ZFS_DIR/configure], [], [
-               AC_MSG_ERROR([Complete zfs sources must exist when building.])])
-
-       ZFS_SUBDIR="$ZFS_DIR"
-       AC_SUBST(ZFS_SUBDIR)
-       AC_CONFIG_SUBDIRS("zfs")
-
-       ac_configure_args="$ac_configure_args --with-spl=$SPL_DIR"
-       ac_configure_args="$ac_configure_args --with-spl-obj=$SPL_OBJ"
-else
-       enable_zfs_build='no'
-       AC_MSG_RESULT([$enable_zfs_build])
-fi
+       ZFS_LIBZFS_INCLUDE=${zfslib}
+       AC_SUBST(ZFS_LIBZFS_INCLUDE)
 ])
 
-#
-# LB_ZFS_SYMVERS
-#
-AC_DEFUN([LB_ZFS_SYMVERS],
-[
-AC_MSG_CHECKING([zfs module symbols])
-if test -r $ZFS_OBJ/Module.symvers; then
-       ZFS_SYMBOLS=Module.symvers
-elif test -r $ZFS_OBJ/Modules.symvers; then
-       ZFS_SYMBOLS=Modules.symvers
-elif test -r $ZFS_OBJ/module/Module.symvers; then
-       ZFS_SYMBOLS=Module.symvers
-elif test -r $ZFS_OBJ/module/Modules.symvers; then
-       ZFS_SYMBOLS=Modules.symvers
-else
-       ZFS_SYMBOLS=$SYMVERFILE
-fi
-
-AC_MSG_RESULT([$ZFS_SYMBOLS])
-AC_SUBST(ZFS_SYMBOLS)
-])
-
-#
-# LB_ZFS_RELEASE
-#
-AC_DEFUN([LB_ZFS_RELEASE],
-[
-AC_MSG_CHECKING([zfs source release])
-if test -r $ZFS_OBJ/zfs_config.h; then
-       tmp_flags="$EXTRA_KCFLAGS"
-       EXTRA_KCFLAGS="-I$ZFS_OBJ $EXTRA_KCFLAGS"
-       LB_LINUX_TRY_MAKE([
-               #include <$ZFS_OBJ/zfs_config.h>
-       ],[
-               char *ZFS_RELEASE;
-               ZFS_RELEASE=ZFS_META_VERSION;
-       ],[
-               $makerule LUSTRE_KERNEL_TEST=conftest.i
-       ],[
-               test -s build/conftest.i
-       ],[
-               eval $(grep "ZFS_RELEASE=" build/conftest.i)
-       ],[
-               AC_MSG_RESULT([unknown])
-               AC_MSG_ERROR([Could not preprocess test program.])
+AC_DEFUN([LB_PATH_ZFS], [
+       AC_ARG_WITH([zfs],
+               [AS_HELP_STRING([--with-zfs=PATH], [Path to zfs source])],
+               [
+                       AS_IF([test x$withval = xno], [
+                               enable_zfs=no
+                               require_zfs=no
+                       ], [test x$withval = xyes], [
+                               enable_zfs=yes
+                               require_zfs=yes
+                       ], [
+                               enable_zfs=yes
+                               require_zfs=yes
+                               zfssrc="$withval"
+                       ])
+               ], [
+                       AS_IF([test x$enable_server = xyes &&
+                           test x$enable_dist = xno], [
+                               require_zfs=no
+                               enable_zfs=yes
+                       ], [
+                               require_zfs=no
+                               enable_zfs=no
+                       ])
+               ])
+
+       AC_MSG_CHECKING([whether to enable zfs])
+       AC_MSG_RESULT([$enable_zfs])
+
+       AS_IF([test x$enable_zfs = xyes], [
+               AS_IF([test x$enable_modules = xyes], [
+                       LB_SPL
+                       LB_ZFS
+               ])
+
+               LB_ZFS_USER
+
+               dnl #
+               dnl # enable_zfs will be set to no in LB_SPL or LB_ZFS if
+               dnl # one of more of the build requirements is not met.
+               dnl #
+               AS_IF([test x$enable_zfs = xyes], [
+                       AC_DEFINE(HAVE_ZFS_OSD, 1, Enable zfs osd)
+               ],[
+                       AS_IF([test x$require_zfs = xyes], [
+                               AC_MSG_ERROR([
+
+Required zfs osd cannot be built due to missing zfs development headers.
+
+Support for zfs can be enabled by downloading the required packages for your
+distribution.  See http://zfsonlinux.org/ to determine is zfs is supported by
+your distribution.
+                               ])
+                       ], [
+                               AC_MSG_WARN([
+
+Disabling optional zfs osd due to missing development headers.
+
+Support for zfs can be enabled by downloading the required packages for your
+distribution.  See http://zfsonlinux.org/ to determine is zfs is supported by
+your distribution.
+                               ])
+                       ])
+               ])
        ])
-       EXTRA_KCFLAGS="$tmp_flags"
-       rm build/conftest.i
-elif test -r $ZFS_DIR/META; then
-       ZFS_RELEASE=$(awk '/Version/ { print [$]2 }' $ZFS_DIR/META)
-else
-       AC_MSG_RESULT([unknown])
-       AC_MSG_ERROR([Could not locate zfs_config.h or META to check release.])
-fi
-
-if test x$ZFS_RELEASE = x; then
-       AC_MSG_RESULT([unknown])
-       AC_MSG_ERROR([Could not determine zfs release.])
-fi
-
-AC_MSG_RESULT([$ZFS_RELEASE])
-AC_SUBST(ZFS_RELEASE)
-])
 
-#
-# LB_ZFS_DEFINE_OPTIONS
-#
-AC_DEFUN([LB_ZFS_DEFINE_OPTIONS],
-[
-AC_DEFINE(HAVE_ZFS_OSD, 1, Enable zfs osd)
+       AM_CONDITIONAL(ZFS_ENABLED, test x$enable_zfs = xyes)
 ])
index d682f3c..b4a0a8d 100755 (executable)
@@ -993,36 +993,60 @@ build_lustre() {
 #
 # Fetch spl/zfs from the git repo and prepare for lustre build
 #
+# Overrides:
+#   SPLZFSGITREPO - URI of directory where spl.git and zfs.git are located
+#   SPLZFSTAG     - Tag to checkout of clone repositories
+#   SPLZFSVER     - Version to checkout of both (format zfs/spl-$SPLZFSVER)
+#
 # return 0 if successful, else 255
 build_spl_zfs() {
     # make sure the RPM build environment is set up
+    pushd $TOPDIR
     create_rpmbuild_dirs
+    popd
 
     # The spl/zfs spec files expect RPM_BUILD_ROOT to point to the root of the
     # destination for the rpms
     export RPM_BUILD_ROOT=$TOPDIR
+    SPLZFSVER=${SPLZFSVER:-0.6.1}
+    SPLZFSTAG=${SPLZFSTAG:-lustre-zfs}
 
     # The files expect a kver to be set to the kernel version .
-    kver=$(cat ${LINUX}/include/config/kernel.release)
+    local kver=$(find_linux_release ${LINUX})
 
     # build and install the spl and zfs (and -devel) RPMs for lustre to use
     local pkg
     for pkg in spl zfs; do
 
-        local rpmmod spldir
+        local rpmpkg
 
-        [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*/*)"
-        rpmmod=$pkg-modules
+        [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*/|tail -1)"
 
         # need to fetch the repo in order to build it.
         # default to github but allow override
         git clone ${SPLZFSGITREPO:-"https://github.com/zfsonlinux"}/$pkg.git $pkg 2>&1
 
         pushd $pkg || return 255
-
-        # XXX - _having_ to give a package a kernel just to have it configure
-        #       enough to do a "make dist" is truely bogus!
-        if  ! ./configure --with-linux=${LINUX} \
+       if [ -n "$SPLZFSTAG" ]; then
+           git checkout $SPLZFSTAG
+       else
+           git checkout -b lbuild $pkg-$SPLZFSVER
+       fi
+
+       # This differentiates between older zfs versions
+       if [ -f $pkg-modules.spec.in ]; then
+           rpmpkg=$pkg-modules
+           specdir=.
+           speclist="$pkg.spec $rpmpkg.spec"
+       else
+            rpmpkg=kmod-$pkg-devel
+           specdir=rpm/generic
+           speclist="$pkg.spec $pkg-kmod.spec $pkg-dkms.spec"
+       fi
+
+       sh autogen.sh || return 255
+
+        if  ! ./configure --with-linux=${LINUX} --with-linux-obj=${LINUX} \
                           ${spldir:+--with-spl="${spldir}"} 2>&1 ||
             ! make dist 2>&1; then
             popd
@@ -1030,71 +1054,57 @@ build_spl_zfs() {
         fi
         popd
 
-        # XXX - dirty hack time.  ~sigh~
-        #       because the spl tarball contains two .spec files, we cannot
-        #       simply rebuild the tarball
-        ln $pkg/$pkg-*.tar.gz $TOPDIR/SOURCES ||
-            error "failed to link $pkg/$pkg-*.tar.gz into $TOPDIR/SOURCES"
-
-        # First build the userspace tools RPMs
-        if ! $RPMBUILD $targets -bb $pkg/$pkg.spec \
-            --nodeps -v \
-            --define "configure_args ${CONFIGURE_FLAGS}" \
-            --define "_tmppath /var/tmp" \
-            --define "_topdir $TOPDIR" 2>&1; then
-            return 255
-        fi
-
-        if $DO_SRC; then
-            if ! $RPMBUILD -bs $pkg/$pkg.spec \
-                --nodeps -v \
-                --define "configure_args ${CONFIGURE_FLAGS}" \
-                --define "_tmppath /var/tmp" \
-                --define "_topdir $TOPDIR" 2>&1; then
-                return 255
+        ln -f $pkg/$pkg-*.tar.gz $TOPDIR/SOURCES ||
+           error "failed to link $pkg/$pkg-*.tar.gz into $TOPDIR/SOURCES"
+       if [ -f $pkg/scripts/kmodtool ]; then
+           ln -f $pkg/scripts/kmodtool $TOPDIR/SOURCES/
+       fi
+
+       local rpmb
+       if $DO_SRC; then
+           rpmb=-ba
+       else
+           rpmb=-bb
+       fi
+
+       # set search dir for our own kmodtool to find correct
+       # directories
+       export KERNELSOURCE=$(dirname ${LINUX})
+       # Manually build rpms
+       for spec in $speclist; do
+           echo "Building RPMs from $pkg/$specdir/$spec"
+            if ! $RPMBUILD $rpmb $pkg/$specdir/$spec \
+               --nodeps -v \
+               --define "require_kdir ${LINUX}" \
+               ${LINUXOBJ:+--define "require_kobj ${LINUXOBJ}"} \
+               ${spldir:+--define "require_spldir ${spldir}"} \
+               --define "kver $kver" \
+               --define "kernels $kver" \
+               --define "_tmppath /var/tmp" \
+               --define "kernelbuildroot $(find_linux_builddir $LINUX)" \
+               --define "_topdir $TOPDIR" 2>&1; then
+               return 255
             fi
-        fi
+       done
 
-        # Now the kernel module RPMs
-        # Need to provide pointers to the lustre kernel source, objects, usr/src
-        if ! $RPMBUILD $targets -bb $pkg/$rpmmod.spec \
-            --nodeps -v \
-            --define "require_kdir ${linux}" \
-            ${linuxobj:+--define "require_kobj ${linuxobj}"} \
-            ${spldir:+--define "require_spldir ${spldir}"} \
-            --define "configure_args ${CONFIGURE_FLAGS}" \
-            --define "_usrsrc $TOPDIR/usr/src" \
-            --define "kver $kver" \
-            --define "_tmppath /var/tmp" \
-            --define "_topdir $TOPDIR" 2>&1; then
-            return 255
-        fi
+#      $DO_SRC && mv $pkg*.src.rpm $TOPDIR/SRPMS/
+#      mv $pkg*.noarch.rpm $TOPDIR/RPMS/noarch/
+#      mv *$pkg*.$TARGET_ARCH.rpm $TOPDIR/RPMS/$(basearch $TARGET_ARCH)/
 
-        if $DO_SRC; then
-            if ! $RPMBUILD -bs $pkg/$rpmmod.spec \
-                --nodeps -v \
-                --define "require_kdir ${linux}" \
-                ${linuxobj:+--define "require_kobj ${linuxobj}"} \
-                ${spldir:+--define "require_spldir ${spldir}"} \
-                --define "configure_args ${CONFIGURE_FLAGS}" \
-                --define "_usrsrc $TOPDIR/usr/src" \
-                --define "kver $kver" \
-                --define "_tmppath /var/tmp" \
-                --define "_topdir $TOPDIR" 2>&1; then
-                return 255
-            fi
-        fi
-
-        # We have built the rpms for the package. No we need to extract the
+        # We have built the rpms for the package. Now we need to extract the
         # contained files so we can build further things against them
-        local rpm=$(ls $TOPDIR/RPMS/*/$rpmmod-devel-*.rpm)
+        local rpms=$(ls -1 $TOPDIR/RPMS/*/$rpmpkg-*.rpm)
 
         # cpio only extract to pwd so we need to go there.
         pushd $TOPDIR
-        rpm2cpio < $rpm | cpio -id
+       local rpm
+       for rpm in $rpms; do
+            rpm2cpio $rpm | cpio -id
+       done
         popd
 
-        CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/*) ${CONFIGURE_FLAGS}"
+        CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/|tail -1) ${CONFIGURE_FLAGS}"
+        CONFIGURE_FLAGS="--with-$pkg-obj=$(ls -d $TOPDIR/usr/src/$pkg-*/$kver*|tail -1) ${CONFIGURE_FLAGS}"
     done
 
     OSDZFSRPM=true
@@ -1177,7 +1187,15 @@ find_linux_release() {
     fi
 
     sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
+}
+
+# This funcition finds the buildroot directory for a given linux
+# kernel directory
+find_linux_builddir() {
+    local linux=${1:-${LINUX}}
+    local rel=$(find_linux_release $linux)
 
+    echo ${linux%/usr/src/kernels/${rel}*}
 }
 
 # unpack kernel(/source/devel) RPM
@@ -1765,6 +1783,7 @@ create_rpmbuild_dirs() {
         fi
         [ -d RPMS/$arch ] || mkdir RPMS/$arch
     done
+    [ -d RPMS/noarch ] || mkdir RPMS/noarch
     [ -d BUILD ] || mkdir BUILD
     [ -d SOURCES ] || mkdir SOURCES
     [ -d SPECS ] || mkdir SPECS
index afb5016..d07949a 100644 (file)
@@ -115,7 +115,7 @@ backing store of a Lustre server.
 %if %{build_lustre_osd_zfs}
 %package osd-zfs
 Summary: osd-zfs is the mandatory glue for ZFS support in Lustre.
-Requires: lustre-modules = %{version}, zfs-modules
+Requires: lustre-modules = %{version}, zfs-kmod
 Provides: lustre-osd
 Group: Development/Kernel
 
index 0a2dceb..7def377 100644 (file)
@@ -2,9 +2,8 @@ MODULES := osd_zfs
 osd_zfs-objs := osd_handler.o osd_lproc.o udmu.o osd_quota.o
 osd_zfs-objs += osd_object.o osd_io.o osd_oi.o osd_xattr.o osd_index.o
 
-EXTRA_PRE_CFLAGS += -I@SPL_DIR@ -I@SPL_DIR@/include
 EXTRA_PRE_CFLAGS += -include @SPL_OBJ@/spl_config.h
-EXTRA_PRE_CFLAGS += -I@ZFS_OBJ@ -I@ZFS_OBJ@/include
 EXTRA_PRE_CFLAGS += -include @ZFS_OBJ@/zfs_config.h
+EXTRA_PRE_CFLAGS += -I@SPL@ -I@SPL@/include -I@ZFS@ -I@ZFS@/include
 
 @INCLUDE_RULES@
index a353557..23bde35 100644 (file)
@@ -133,7 +133,7 @@ endif
 if ZFS_ENABLED
 mount_lustre_SOURCES += mount_utils_zfs.c
 mount_lustre_CPPFLAGS += -DHAVE_IOCTL_IN_UNISTD_H
-mount_lustre_CPPFLAGS += $(EXTRA_LIBZFS_INCLUDE)
+mount_lustre_CPPFLAGS += $(ZFS_LIBZFS_INCLUDE)
 mount_lustre_LDFLAGS = -pthread -rdynamic -ldl
 endif
 
@@ -149,7 +149,7 @@ endif
 if ZFS_ENABLED
 mkfs_lustre_SOURCES += mount_utils_zfs.c
 mkfs_lustre_CPPFLAGS += -DHAVE_IOCTL_IN_UNISTD_H
-mkfs_lustre_CPPFLAGS += $(EXTRA_LIBZFS_INCLUDE)
+mkfs_lustre_CPPFLAGS += $(ZFS_LIBZFS_INCLUDE)
 mkfs_lustre_LDFLAGS = -pthread -rdynamic -ldl
 endif
 
@@ -163,7 +163,7 @@ endif
 if ZFS_ENABLED
 tunefs_lustre_SOURCES += mount_utils_zfs.c
 tunefs_lustre_CPPFLAGS += -DHAVE_IOCTL_IN_UNISTD_H
-tunefs_lustre_CPPFLAGS += $(EXTRA_LIBZFS_INCLUDE)
+tunefs_lustre_CPPFLAGS += $(ZFS_LIBZFS_INCLUDE)
 tunefs_lustre_LDFLAGS = -pthread -rdynamic -ldl
 endif