From a6c26e19f7f189c78c7efa9e682b78e0e5f80d73 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 28 Mar 2013 12:18:27 -0700 Subject: [PATCH 1/1] LU-3117 build: zfs-0.6.1 kmod+dkms compatibility 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-/ path. The objects, which are kernel specific, are installed under /usr/src/zfs-//. 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 Change-Id: Ib686211c4f9ace39a41053ce8a20112d1121def9 Signed-off-by: Nathaniel Clark Reviewed-on: http://review.whamcloud.com/5960 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Alexey Shvetsov Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- autoMakefile.am | 2 +- config/lustre-build-ldiskfs.m4 | 1 - config/lustre-build-zfs.m4 | 731 ++++++++++++++++++----------------------- contrib/lbuild/lbuild | 147 +++++---- lustre.spec.in | 2 +- lustre/osd-zfs/Makefile.in | 3 +- lustre/utils/Makefile.am | 6 +- 7 files changed, 407 insertions(+), 485 deletions(-) diff --git a/autoMakefile.am b/autoMakefile.am index 7dd4f1b..1cc3b48 100644 --- a/autoMakefile.am +++ b/autoMakefile.am @@ -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@ diff --git a/config/lustre-build-ldiskfs.m4 b/config/lustre-build-ldiskfs.m4 index d619d7c..f29fd39 100644 --- a/config/lustre-build-ldiskfs.m4 +++ b/config/lustre-build-ldiskfs.m4 @@ -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= diff --git a/config/lustre-build-zfs.m4 b/config/lustre-build-zfs.m4 index bfc647f..507afd8 100644 --- a/config/lustre-build-zfs.m4 +++ b/config/lustre-build-zfs.m4 @@ -1,445 +1,350 @@ -# -# 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 "; + 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 "; + 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) ]) diff --git a/contrib/lbuild/lbuild b/contrib/lbuild/lbuild index d682f3c..b4a0a8d 100755 --- a/contrib/lbuild/lbuild +++ b/contrib/lbuild/lbuild @@ -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 diff --git a/lustre.spec.in b/lustre.spec.in index afb5016..d07949a 100644 --- a/lustre.spec.in +++ b/lustre.spec.in @@ -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 diff --git a/lustre/osd-zfs/Makefile.in b/lustre/osd-zfs/Makefile.in index 0a2dceb..7def377 100644 --- a/lustre/osd-zfs/Makefile.in +++ b/lustre/osd-zfs/Makefile.in @@ -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@ diff --git a/lustre/utils/Makefile.am b/lustre/utils/Makefile.am index a353557..23bde35 100644 --- a/lustre/utils/Makefile.am +++ b/lustre/utils/Makefile.am @@ -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 -- 1.8.3.1