From ef0a7128580dd22e3a4a9cabb4683d8236264c93 Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Wed, 1 Jul 2009 10:53:05 -0700
Subject: [PATCH] Distro friendly build system / packaging improvements.

These changes bring the zfs-0.4.4 tree in to compliance with
the spl-0.4.4 packaging changes.  The bottom line is 2 source
rpms and 4 binary rpms will now be generated when creating
packages there will be:

zfs-<version>.src.rpm
- Fully rebuildable source rpm for libzfs and utils.
zfs-modules-<version>.src.rpm
- Fully rebuildable source rpm for kernel modules.

zfs-<version>.<arch>.rpm
- Binary rpm for libzfs and utils.  The utils in this package are
  compatible with all zfs-module rpms of the same version.
zfs-devel-<version>.<arch>.rpm
- Binary rpm containing headers for building against libzfs libraries.

zfs-modules-<verion>-<kernel>.arch.rpm
- Binary rpm containing the kernel modules for a specific kernel build.
  The package name contains the kernel version and you should have one
  of these packages installed to match every kernel on your system.
zfs-modules-devel-<verion>-<kernel>.arch.rpm
- Binary rpm containing development header and module symbols needed
  for building additional kernel modules which are dependent on the
  zfs module stack.

Expect minor interations on these changes as I validate they work
properly on CHAOS, RHEL, Fedora, and SLES style distros.
---
 META                             |   2 +-
 Makefile.am                      |  62 +++---
 config/kernel.m4                 | 316 ++++++++++++++++++++++++++++++-
 config/rpm.am                    |  46 +++++
 config/zfs-build.m4              | 313 +++---------------------------
 configure.ac                     |   4 +-
 lib/libzpool/include/Makefile.am |   2 +-
 module/Makefile.in               |  20 +-
 zfs-modules.spec.in              | 205 ++++++++++++++++++++
 zfs.spec.in                      |  86 ++-------
 zfs_unconfig.h                   |  12 ++
 11 files changed, 662 insertions(+), 406 deletions(-)
 create mode 100644 config/rpm.am
 create mode 100644 zfs-modules.spec.in
 create mode 100644 zfs_unconfig.h

diff --git a/META b/META
index e68e9ac9f2..4e07268f04 100644
--- a/META
+++ b/META
@@ -1,6 +1,6 @@
 Meta:         1
 Name:         zfs
 Branch:       1.0
-Version:      0.4.3
+Version:      0.4.4
 Release:      1
 Release-Tags: relext
diff --git a/Makefile.am b/Makefile.am
index c685f0db55..dcdada493c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,8 +1,18 @@
-SUBDIRS = config doc scripts lib cmd module
+include $(top_srcdir)/config/rpm.am
+
+if CONFIG_USER
+USER_DIR = config doc scripts lib cmd
+endif
+if CONFIG_KERNEL
+KERNEL_DIR = module
+endif
+SUBDIRS = $(USER_DIR) $(KERNEL_DIR)
 
 AUTOMAKE_OPTIONS = foreign dist-zip
-EXTRA_DIST  = autogen.sh zfs.spec.in META DISCLAIMER GIT
+EXTRA_DIST  = autogen.sh zfs.spec.in zfs-modules.spec.in
+EXTRA_DIST += META DISCLAIMER GIT
 EXTRA_DIST += OPENSOLARIS.LICENSE ZFS.RELEASE
+noinst_HEADERS = zfs_config.h zfs_unconfig.h
 
 distclean-local::
 	-$(RM) -R autom4te*.cache
@@ -16,10 +26,13 @@ distclean-local::
 		-o -name '.script-config' \) \
 		-type f -print | xargs $(RM)
 
+if CONFIG_KERNEL
 install-data-local:
-	/bin/mkdir -p $(DESTDIR)/$(LINUX)/include/zfs
-	$(INSTALL) module/Module.symvers $(DESTDIR)/$(LINUX)/include/zfs
-	$(INSTALL) zfs_config.h $(DESTDIR)/$(LINUX)/include/zfs
+	instdest=$(DESTDIR)/${prefix}/src/zfs-$(ZFS_META_VERSION); \
+	for instfile in $(noinst_HEADERS) module/$(LINUX_SYMBOLS); do \
+		$(INSTALL) -D $$instfile $$instdest/$$instfile; \
+	done
+endif
 
 ctags:
 	$(RM) $(top_srcdir)/tags
@@ -31,27 +44,22 @@ etags:
 
 tags: ctags etags
 
-rpm-local:
-	mkdir -p $(rpmbuild)/TMP && \
-	mkdir -p $(rpmbuild)/BUILD && \
-	mkdir -p $(rpmbuild)/RPMS && \
-	mkdir -p $(rpmbuild)/SRPMS && \
-	mkdir -p $(rpmbuild)/SPECS && cp $(PACKAGE).spec $(rpmbuild)/SPECS && \
-	mkdir -p $(rpmbuild)/SOURCES && cp $(distdir).tar.gz $(rpmbuild)/SOURCES
+srpm-modules:
+	$(MAKE) $(AM_MAKEFLAGS) pkg="${PACKAGE}-modules" srpm-common
 
-srpm: dist
-	rpmbuild=`mktemp -t -d $(PACKAGE)-build-$$USER-XXXXXXXX`; \
-	$(MAKE) $(AM_MAKEFLAGS) rpmbuild="$$rpmbuild" rpm-local || exit 1; \
-	/usr/bin/rpmbuild --define "_tmppath $$rpmbuild/TMP" --define "_topdir $$rpmbuild" --define "build_src_rpm 1" --define "dist %{nil}" --nodeps -bs $$rpmbuild/SPECS/$(PACKAGE).spec || exit 1; \
-	cp $$rpmbuild/SRPMS/$(distdir)-$(ZFS_META_RELEASE).src.rpm . || exit 1;\
-	$(RM) -R $$rpmbuild
+srpm-utils:
+	$(MAKE) $(AM_MAKEFLAGS) pkg="${PACKAGE}" srpm-common
 
-# Use 'make rpm LINUX_VERSION=2.x.y-z' to rebuild the source RPM
-# against any installed kernel-devel-2.x.y-z package.  This will
-# override the LINUX_VERSION detected at configure time.
-rpm: srpm
-	rpmbuild=`mktemp -t -d $(PACKAGE)-build-$$USER-XXXXXXXX`; \
-	$(MAKE) $(AM_MAKEFLAGS) rpmbuild="$$rpmbuild" rpm-local || exit 1; \
-	/usr/bin/rpmbuild --define "_tmppath $$rpmbuild/TMP" --define "_topdir $$rpmbuild" --define "dist %{nil}" --define "require_kver $(LINUX_VERSION)" --nodeps --rebuild $(distdir)-$(ZFS_META_RELEASE).src.rpm || exit 1; \
-	cp $$rpmbuild/RPMS/*/* . || exit 1; \
-	$(RM) -R $$rpmbuild
+srpm: srpm-modules srpm-utils
+
+rpm-modules: srpm-modules
+	$(MAKE) $(AM_MAKEFLAGS) pkg="${PACKAGE}-modules" rpm-common
+
+rpm-utils: srpm-utils
+	$(MAKE) $(AM_MAKEFLAGS) pkg="${PACKAGE}" rpm-common
+
+rpm-modules: srpm-modules
+
+rpm-utils: srpm-utils
+
+rpm: rpm-modules rpm-utils
diff --git a/config/kernel.m4 b/config/kernel.m4
index 3c82003184..3838d74c5e 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -2,6 +2,10 @@ dnl #
 dnl # Default ZFS kernel configuration 
 dnl #
 AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+	ZFS_AC_KERNEL
+	ZFS_AC_SPL
+	ZFS_AC_CONFIG_KERNEL_BIO_ARGS
+
 	dnl # Kernel build make options
 	dnl # KERNELMAKE_PARAMS="V=1"	# Enable verbose module build
 	KERNELMAKE_PARAMS=
@@ -10,14 +14,312 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
 	dnl # compiler options are added by the kernel build system.
 	KERNELCPPFLAGS="$KERNELCPPFLAGS -Werror -DHAVE_SPL -D_KERNEL"
 	KERNELCPPFLAGS="$KERNELCPPFLAGS -DTEXT_DOMAIN=\\\"zfs-linux-kernel\\\""
-	KERNELCPPFLAGS="$KERNELCPPFLAGS -I$splsrc -I$splsrc/include -I$TOPDIR"
+	KERNELCPPFLAGS="$KERNELCPPFLAGS -I$TOPDIR -I$SPL -I$SPL/include"
 
-	if test "$kernelbuild" != "$kernelsrc"; then
-		KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$kernelbuild"
+	if test "$LINUX_OBJ" != "$LINUX"; then
+		KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
 	fi
 
-        AC_SUBST(KERNELMAKE_PARAMS)
-        AC_SUBST(KERNELCPPFLAGS)
-
-	ZFS_AC_CONFIG_KERNEL_BIO_ARGS
+	AC_SUBST(KERNELMAKE_PARAMS)
+	AC_SUBST(KERNELCPPFLAGS)
+])
+
+dnl #
+dnl # Detect name used more Module.symvers file
+dnl #
+AC_DEFUN([ZFS_AC_MODULE_SYMVERS], [
+	AC_MSG_CHECKING([kernel file name for module symbols])
+	if grep -q Modules.symvers $LINUX/scripts/Makefile.modpost; then
+		LINUX_SYMBOLS=Modules.symvers
+	else
+		LINUX_SYMBOLS=Module.symvers
+	fi
+	AC_MSG_RESULT($LINUX_SYMBOLS)
+	AC_SUBST(LINUX_SYMBOLS)
+])
+
+dnl #
+dnl # Detect the kernel to be built against
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL], [
+	AC_ARG_WITH([linux],
+		AS_HELP_STRING([--with-linux=PATH],
+		[Path to kernel source]),
+		[kernelsrc="$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
+		sourcelink=`ls -1d /usr/src/kernels/* /usr/src/linux-* \
+		            2>/dev/null | grep -v obj | tail -1`
+
+		if test -e $sourcelink; then
+			kernelsrc=`readlink -f ${sourcelink}`
+		else
+			AC_MSG_RESULT([Not found])
+			AC_MSG_ERROR([
+			*** Please specify the location of the kernel source
+			*** with the '--with-linux=PATH' option])
+		fi
+	else
+		if test "$kernelsrc" = "NONE"; then
+			kernsrcver=NONE
+		fi
+	fi
+
+	AC_MSG_RESULT([$kernelsrc])
+	AC_MSG_CHECKING([kernel build directory])
+	if test -z "$kernelbuild"; then
+		if test -d ${kernelsrc}-obj; then
+			kernelbuild=${kernelsrc}-obj/`arch`/`arch`
+		elif test -d `dirname ${kernelsrc}`/build-`arch`; then
+			kernelbuild=`dirname ${kernelsrc}`/build-`arch`
+		else
+			kernelbuild=${kernelsrc}
+		fi
+	fi
+	AC_MSG_RESULT([$kernelbuild])
+
+	AC_MSG_CHECKING([kernel source version])
+	if test -r $kernelbuild/include/linux/version.h &&
+		fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then
+
+		kernsrcver=`(echo "#include <linux/version.h>";
+		             echo "kernsrcver=UTS_RELEASE") |
+		             cpp -I $kernelbuild/include |
+		             grep "^kernsrcver=" | cut -d \" -f 2`
+
+	elif test -r $kernelbuild/include/linux/utsrelease.h &&
+		fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then
+
+		kernsrcver=`(echo "#include <linux/utsrelease.h>";
+		             echo "kernsrcver=UTS_RELEASE") |
+		             cpp -I $kernelbuild/include |
+		             grep "^kernsrcver=" | cut -d \" -f 2`
+	fi
+
+	if test -z "$kernsrcver"; then
+		AC_MSG_RESULT([Not found])
+		AC_MSG_ERROR([
+		*** Cannot determine the version of the linux kernel source.
+		*** Please prepare the kernel before running this script])
+	fi
+
+	AC_MSG_RESULT([$kernsrcver])
+
+	LINUX=${kernelsrc}
+	LINUX_OBJ=${kernelbuild}
+	LINUX_VERSION=${kernsrcver}
+
+	AC_SUBST(LINUX)
+	AC_SUBST(LINUX_OBJ)
+	AC_SUBST(LINUX_VERSION)
+
+	ZFS_AC_MODULE_SYMVERS
+])
+
+dnl #
+dnl # Detect name used for the additional SPL Module.symvers file
+dnl #
+AC_DEFUN([ZFS_AC_SPL_MODULE_SYMVERS], [
+	AC_MSG_CHECKING([spl file name for 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
+	else
+		AC_MSG_RESULT([Not found])
+		AC_MSG_ERROR([
+		*** Cannot find extra Module{s}.symvers in the spl source.
+		*** Please prepare the spl source before running this script])
+	fi
+
+	AC_MSG_RESULT([$SPL_SYMBOLS])
+	AC_SUBST(SPL_SYMBOLS)
+])
+
+dnl #
+dnl # Detect the SPL module to be built against
+dnl #
+AC_DEFUN([ZFS_AC_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]),
+		[splbuild="$withval"])
+
+
+	AC_MSG_CHECKING([spl source directory])
+	if test -z "$splsrc"; then
+		sourcelink=`ls -1d /usr/src/spl-*/${LINUX_VERSION} \
+		            2>/dev/null | tail -1`
+
+		if test -e $sourcelink; then
+			splsrc=`readlink -f ${sourcelink}`
+		else
+			AC_MSG_RESULT([Not found])
+			AC_MSG_ERROR([
+			*** Please specify the location of the spl source
+			*** with the '--with-spl=PATH' option])
+		fi
+	else
+		if test "$splsrc" = "NONE"; then
+			splbuild=NONE
+			splsrcver=NONE
+		fi
+	fi
+
+	AC_MSG_RESULT([$splsrc])
+	AC_MSG_CHECKING([spl build directory])
+	if test -z "$splbuild"; then
+		if test -d ${splsrc}/module; then
+			splbuild=${splsrc}/module
+		else
+			splbuild=${splsrc}
+		fi
+	fi
+	AC_MSG_RESULT([$splbuild])
+
+	AC_MSG_CHECKING([spl source version])
+	if test -r $splsrc/spl_config.h &&
+		fgrep -q SPL_META_VERSION $splsrc/spl_config.h; then
+
+		splsrcver=`(echo "#include <spl_config.h>";
+		            echo "splsrcver=SPL_META_VERSION") |
+		            cpp -I $splsrc |
+		            grep "^splsrcver=" | cut -d \" -f 2`
+	fi
+
+	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([$splsrcver])
+
+	SPL=${splsrc}
+	SPL_OBJ=${splbuild}
+	SPL_VERSION=${splsrcver}
+
+	AC_SUBST(SPL)
+	AC_SUBST(SPL_OBJ)
+	AC_SUBST(SPL_VERSION)
+
+	ZFS_AC_SPL_MODULE_SYMVERS
+])
+
+dnl #
+dnl # ZFS_LINUX_CONFTEST
+dnl #
+AC_DEFUN([ZFS_LINUX_CONFTEST], [
+cat >conftest.c <<_ACEOF
+$1
+_ACEOF
+])
+
+dnl #
+dnl # ZFS_LANG_PROGRAM(C)([PROLOGUE], [BODY])
+dnl #
+m4_define([ZFS_LANG_PROGRAM], [
+$1
+int
+main (void)
+{
+dnl Do *not* indent the following line: there may be CPP directives.
+dnl Don't move the `;' right after for the same reason.
+$2
+  ;
+  return 0;
+}
+])
+
+dnl #
+dnl # ZFS_LINUX_COMPILE_IFELSE / like AC_COMPILE_IFELSE
+dnl #
+AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [
+	m4_ifvaln([$1], [ZFS_LINUX_CONFTEST([$1])])
+	rm -Rf build && mkdir -p build
+	echo "obj-m := conftest.o" >build/Makefile
+	AS_IF(
+		[AC_TRY_COMMAND(cp conftest.c build && make [$2] LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -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])]
+	)
+	rm -Rf build
+])
+
+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])
+])
+
+dnl #
+dnl # ZFS_LINUX_CONFIG
+dnl #
+AC_DEFUN([ZFS_LINUX_CONFIG],
+	[AC_MSG_CHECKING([whether Linux was built with CONFIG_$1])
+	ZFS_LINUX_TRY_COMPILE([
+		#ifndef AUTOCONF_INCLUDED
+		#include <linux/config.h>
+		#endif
+	],[
+		#ifndef CONFIG_$1
+		#error CONFIG_$1 not #defined
+		#endif
+	],[
+		AC_MSG_RESULT([yes])
+		$2
+	],[
+		AC_MSG_RESULT([no])
+		$3
+	])
+])
+
+dnl #
+dnl # ZFS_CHECK_SYMBOL_EXPORT
+dnl # check symbol exported or not
+dnl #
+AC_DEFUN([ZFS_CHECK_SYMBOL_EXPORT],
+	[AC_MSG_CHECKING([whether symbol $1 is exported])
+	grep -q -E '[[[:space:]]]$1[[[:space:]]]' \
+		$LINUX_OBJ/Module*.symvers $SPL_OBJ/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
+	else
+		AC_MSG_RESULT([yes])
+		$3
+	fi
 ])
diff --git a/config/rpm.am b/config/rpm.am
new file mode 100644
index 0000000000..09a6e9cc10
--- /dev/null
+++ b/config/rpm.am
@@ -0,0 +1,46 @@
+rpm-local:
+	mkdir -p $(rpmbuild)/TMP && \
+	mkdir -p $(rpmbuild)/BUILD && \
+	mkdir -p $(rpmbuild)/RPMS && \
+	mkdir -p $(rpmbuild)/SRPMS && \
+	mkdir -p $(rpmbuild)/SPECS && cp $(rpmspec) $(rpmbuild)/SPECS && \
+	mkdir -p $(rpmbuild)/SOURCES && cp $(distdir).tar.gz $(rpmbuild)/SOURCES
+
+srpm-common: dist
+	rpmpkg=$(pkg)-$(ZFS_META_VERSION)-$(ZFS_META_RELEASE).src.rpm; \
+	rpmspec=$(pkg).spec; \
+	rpmbuild=`mktemp -t -d $(PACKAGE)-build-$$USER-XXXXXXXX`; \
+	$(MAKE) $(AM_MAKEFLAGS) \
+		rpmbuild="$$rpmbuild" \
+		rpmspec="$$rpmspec" \
+		rpm-local || exit 1; \
+	/usr/bin/rpmbuild \
+		--define "_tmppath $$rpmbuild/TMP" \
+		--define "_topdir $$rpmbuild" \
+		--define "build_src_rpm 1" \
+		--define "dist %{nil}" \
+		--nodeps -bs $$rpmbuild/SPECS/$$rpmspec || exit 1; \
+	cp $$rpmbuild/SRPMS/$$rpmpkg . || exit 1; \
+	$(RM) -R $$rpmbuild
+
+rpm-common: 
+	rpmpkg=$(pkg)-$(ZFS_META_VERSION)-$(ZFS_META_RELEASE).src.rpm; \
+	rpmspec=$(pkg).spec; \
+	rpmbuild=`mktemp -t -d $(PACKAGE)-build-$$USER-XXXXXXXX`; \
+	$(MAKE) $(AM_MAKEFLAGS) \
+		rpmbuild="$$rpmbuild" \
+		rpmspec="$$rpmspec" \
+		rpm-local || exit 1; \
+	/usr/bin/rpmbuild \
+		--define "_tmppath $$rpmbuild/TMP" \
+		--define "_topdir $$rpmbuild" \
+		--define "dist %{nil}" \
+		--define "require_kdir $(LINUX)" \
+		--define "require_kobj $(LINUX_OBJ)" \
+		--define "require_kver $(LINUX_VERSION)" \
+		--define "require_spldir $(SPL)" \
+		--define "require_splobj $(SPL_OBJ)" \
+		--define "require_splver $(SPL_VERSION)" \
+		--nodeps --rebuild $$rpmpkg || exit 1; \
+	cp $$rpmbuild/RPMS/*/* . || exit 1; \
+	$(RM) -R $$rpmbuild
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
index 26d59c139d..27aad8f452 100644
--- a/config/zfs-build.m4
+++ b/config/zfs-build.m4
@@ -1,165 +1,3 @@
-AC_DEFUN([ZFS_AC_KERNEL], [
-	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
-		sourcelink=`ls -1d /usr/src/kernels/* /usr/src/linux-* \
-                            2>/dev/null | grep -v obj | tail -1`
-
-		if test -e $sourcelink; then
-			kernelsrc=`readlink -f ${sourcelink}`
-			kernelbuild=
-		else
-			AC_MSG_RESULT([Not found])
-			AC_MSG_ERROR([
-			*** Please specify the location of the kernel source
-			*** with the '--with-linux=PATH' option])
-		fi
-	else
-		if test "$kernelsrc" = "NONE"; then
-			kernsrcver=NONE
-		fi
-	fi
-
-	AC_MSG_RESULT([$kernelsrc])
-	AC_MSG_CHECKING([kernel build directory])
-        if test -z "$kernelbuild" && test -d ${kernelsrc}-obj; then
-                kernelbuild=${kernelsrc}-obj/`arch`/`arch`
-        else
-                kernelbuild=${kernelsrc}
-        fi
-	AC_MSG_RESULT([$kernelbuild])
-
-	AC_MSG_CHECKING([kernel source version])
-	if test -r $kernelbuild/include/linux/version.h && 
-		fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then
-
-		kernsrcver=`(echo "#include <linux/version.h>"; 
-		             echo "kernsrcver=UTS_RELEASE") | 
-		             cpp -I $kernelbuild/include |
-		             grep "^kernsrcver=" | cut -d \" -f 2`
-
-	elif test -r $kernelbuild/include/linux/utsrelease.h && 
-		fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then
-
-		kernsrcver=`(echo "#include <linux/utsrelease.h>"; 
-		             echo "kernsrcver=UTS_RELEASE") | 
-	        	     cpp -I $kernelbuild/include |
-		             grep "^kernsrcver=" | cut -d \" -f 2`
-	fi
-
-	if test -z "$kernsrcver"; then
-		AC_MSG_RESULT([Not found])
-		AC_MSG_ERROR([
-		*** Cannot determine the version of the linux kernel source.
-		*** Please prepare the kernel before running this script])
-	fi
-
-	AC_MSG_RESULT([$kernsrcver])
-
-	LINUX=${kernelsrc}
-	LINUX_OBJ=${kernelbuild}
-	LINUX_VERSION=${kernsrcver}
-
-	AC_SUBST(LINUX)
-	AC_SUBST(LINUX_OBJ)
-	AC_SUBST(LINUX_VERSION)
-])
-
-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
-		sourcelink=${LINUX}/include/spl
-		buildlink=${LINUX_OBJ}/include/spl
-
-		if test -e $sourcelink; then
-			splsrc=`readlink -f ${sourcelink}`
-		fi
-		if test -e $buildlink; then
-			splbuild=`readlink -f ${buildlink}`
-		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
-	else
-		if test "$splsrc" = "NONE"; then
-			splsymvers=NONE
-			splsrcver=NONE
-		fi			
-	fi
-
-	AC_MSG_RESULT([$splsrc])
-	AC_MSG_CHECKING([spl build directory])
-	AC_MSG_RESULT([$splbuild])
-
-	AC_MSG_CHECKING([spl Module{s}.symvers])
-	if test -r $splbuild/module/Module.symvers; then
-		splsymvers=$splbuild/module/Module.symvers
-	elif test -r $splbuild/module/Modules.symvers; then
-		splsymvers=$splbuild/module/Modules.symvers
-	elif test -r $kernelbuild/include/spl/Module.symvers; then
-		splsymvers=$kernelbuild/include/spl/Module.symvers
-	elif test -r $kernelbuild/include/spl/Modules.symvers; then
-		splsymvers=$kernelbuild/include/spl/Modules.symvers
-	fi
-
-	if test -z "$splsymvers"; then
-	        AC_MSG_RESULT([Not found])
-	        AC_MSG_ERROR([
-                *** Cannot find extra Module{s}.symvers in the spl source.
-                *** Please prepare the spl source before running this script])
-	fi
-
-	AC_MSG_RESULT([$splsymvers])
-
-	AC_MSG_CHECKING([spl source version])
-	if test -r $splbuild/spl_config.h && 
-		fgrep -q SPL_META_VERSION $splbuild/spl_config.h; then
-
-		splsrcver=`(echo "#include <spl_config.h>"; 
-		            echo "splsrcver=SPL_META_VERSION") | 
-		            cpp -I $splbuild |
-	        	    grep "^splsrcver=" | cut -d \" -f 2`
-	fi
-
-	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([$splsrcver])
-
-	AC_SUBST(splsrc)
-	AC_SUBST(splsymvers)
-])
-
 AC_DEFUN([ZFS_AC_LICENSE], [
 	AC_MSG_CHECKING([zfs license])
 	LICENSE=`grep MODULE_LICENSE module/zfs/zfs_ioctl.c | cut -f2 -d'"'`
@@ -200,48 +38,43 @@ AC_DEFUN([ZFS_AC_DEBUG], [
 AC_DEFUN([ZFS_AC_CONFIG_SCRIPT], [
 	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 "TOPDIR=${TOPDIR}"           >>${SCRIPT_CONFIG}
-	echo "LIBDIR=${LIBDIR}"           >>${SCRIPT_CONFIG}
-	echo "CMDDIR=${CMDDIR}"           >>${SCRIPT_CONFIG}
+	echo "KERNELSRC=${LINUX}"             >>${SCRIPT_CONFIG}
+	echo "KERNELBUILD=${LINUX_OBJ}"       >>${SCRIPT_CONFIG}
+	echo "KERNELSRCVER=${LINUX_VERSION}"  >>${SCRIPT_CONFIG}
+	echo                                  >>${SCRIPT_CONFIG}
+	echo "SPLSRC=${SPL}"                  >>${SCRIPT_CONFIG}
+	echo "SPLBUILD=${SPL_OBJ}"            >>${SCRIPT_CONFIG}
+	echo "SPLSRCVER=${SPL_VERSION}"       >>${SCRIPT_CONFIG}
+	echo                                  >>${SCRIPT_CONFIG}
+	echo "TOPDIR=${TOPDIR}"               >>${SCRIPT_CONFIG}
+	echo "BUILDDIR=${BUILDDIR}"           >>${SCRIPT_CONFIG}
+	echo "LIBDIR=${LIBDIR}"               >>${SCRIPT_CONFIG}
+	echo "CMDDIR=${CMDDIR}"               >>${SCRIPT_CONFIG}
+	echo "MODDIR=${MODDIR}"               >>${SCRIPT_CONFIG}
 ])
 
 AC_DEFUN([ZFS_AC_CONFIG], [
-
-	TOPDIR=`/bin/pwd`
+	TOPDIR=`readlink -f ${srcdir}`
 	BUILDDIR=$TOPDIR
 	LIBDIR=$TOPDIR/lib
 	CMDDIR=$TOPDIR/cmd
 	MODDIR=$TOPDIR/module
-	UNAME=`uname -r | cut -d- -f1`
 
-	if test -z "$ZFS_CONFIG"; then
-		ZFS_CONFIG=all
-	fi
-
-	AC_SUBST(UNAME)
 	AC_SUBST(TOPDIR)
 	AC_SUBST(BUILDDIR)
 	AC_SUBST(LIBDIR)
 	AC_SUBST(CMDDIR)
 	AC_SUBST(MODDIR)
-	AC_SUBST(ZFS_CONFIG)
 
-	AC_ARG_WITH([zfs-config],
+	ZFS_CONFIG=all
+	AC_ARG_WITH([config],
 		AS_HELP_STRING([--with-config=CONFIG],
 		[Config file 'kernel|user|all']),
 		[ZFS_CONFIG="$withval"])
 
 	AC_MSG_CHECKING([zfs config])
 	AC_MSG_RESULT([$ZFS_CONFIG]);
+	AC_SUBST(ZFS_CONFIG)
 
 	case "$ZFS_CONFIG" in
 		kernel) ZFS_AC_CONFIG_KERNEL ;;
@@ -254,110 +87,12 @@ AC_DEFUN([ZFS_AC_CONFIG], [
 		              user kernel|user|all]) ;;
 	esac
 
+	AM_CONDITIONAL([CONFIG_USER],
+	               [test "$ZFS_CONFIG" = user] ||
+	               [test "$ZFS_CONFIG" = all])
+	AM_CONDITIONAL([CONFIG_KERNEL],
+	               [test "$ZFS_CONFIG" = kernel] ||
+	               [test "$ZFS_CONFIG" = all])
+
 	ZFS_AC_CONFIG_SCRIPT
 ])
-
-dnl #
-dnl # ZFS_LINUX_CONFTEST
-dnl #
-AC_DEFUN([ZFS_LINUX_CONFTEST], [
-cat >conftest.c <<_ACEOF
-$1
-_ACEOF
-])
-
-dnl #
-dnl # ZFS_LANG_PROGRAM(C)([PROLOGUE], [BODY])
-dnl #
-m4_define([ZFS_LANG_PROGRAM], [
-$1
-int
-main (void)
-{
-dnl Do *not* indent the following line: there may be CPP directives.
-dnl Don't move the `;' right after for the same reason.
-$2
-  ;
-  return 0;
-}
-])
-
-dnl #
-dnl # ZFS_LINUX_COMPILE_IFELSE / like AC_COMPILE_IFELSE
-dnl #
-AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [
-	m4_ifvaln([$1], [ZFS_LINUX_CONFTEST([$1])])
-	rm -Rf build && mkdir -p build
-	echo "obj-m := conftest.o" >build/Makefile
-	AS_IF(
-		[AC_TRY_COMMAND(cp conftest.c build && make [$2] LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -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])]
-	)
-	rm -Rf build
-])
-
-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])
-])
-
-dnl #
-dnl # ZFS_LINUX_CONFIG
-dnl #
-AC_DEFUN([ZFS_LINUX_CONFIG],
-	[AC_MSG_CHECKING([whether Linux was built with CONFIG_$1])
-	ZFS_LINUX_TRY_COMPILE([
-		#ifndef AUTOCONF_INCLUDED
-		#include <linux/config.h>
-		#endif
-	],[
-		#ifndef CONFIG_$1
-		#error CONFIG_$1 not #defined
-		#endif
-	],[
-		AC_MSG_RESULT([yes])
-		$2
-	],[
-		AC_MSG_RESULT([no])
-		$3
-	])
-])
-
-dnl #
-dnl # ZFS_CHECK_SYMBOL_EXPORT
-dnl # check symbol exported or not
-dnl #
-AC_DEFUN([ZFS_CHECK_SYMBOL_EXPORT],
-	[AC_MSG_CHECKING([whether symbol $1 is exported])
-	grep -q -E '[[[:space:]]]$1[[[:space:]]]' \
-		$LINUX/Module.symvers $splsymvers 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
-	else
-		AC_MSG_RESULT([yes])
-		$3
-	fi
-])
diff --git a/configure.ac b/configure.ac
index 2db261a21c..2bd2cab3fe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -37,6 +37,7 @@ AC_CONFIG_AUX_DIR([config])
 AC_CANONICAL_SYSTEM
 AM_INIT_AUTOMAKE([$ZFS_META_NAME], [$ZFS_META_VERSION])
 AC_CONFIG_HEADERS([zfs_config.h])
+AH_BOTTOM([#include <zfs_unconfig.h>])
 AM_MAINTAINER_MODE
 
 AC_PROG_INSTALL
@@ -44,8 +45,6 @@ AC_PROG_CC
 AC_PROG_LIBTOOL
 AM_PROG_AS
 
-ZFS_AC_KERNEL
-ZFS_AC_SPL
 ZFS_AC_LICENSE
 ZFS_AC_CONFIG
 ZFS_AC_DEBUG
@@ -77,6 +76,7 @@ AC_CONFIG_FILES([
 	scripts/Makefile
 	scripts/zpool-config/Makefile
 	zfs.spec
+	zfs-modules.spec
 ])
 
 AC_OUTPUT
diff --git a/lib/libzpool/include/Makefile.am b/lib/libzpool/include/Makefile.am
index d386e052af..2d7d453586 100644
--- a/lib/libzpool/include/Makefile.am
+++ b/lib/libzpool/include/Makefile.am
@@ -1 +1 @@
-pkginclude_HEADERS  = sys/*.h
+nobase_pkginclude_HEADERS  = sys/*.h
diff --git a/module/Makefile.in b/module/Makefile.in
index c9c4f57c59..13a5a81333 100644
--- a/module/Makefile.in
+++ b/module/Makefile.in
@@ -6,19 +6,23 @@ subdir-m += zfs
 
 modules clean:
 	# Make the exported SPL symbols available to these modules.
-	cp @splsymvers@ .
-	$(MAKE) -C @LINUX@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ $@
+	cp @SPL_OBJ@/@SPL_SYMBOLS@ .
+	$(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ $@
 
 modules_install:
-	$(MAKE) -C @LINUX@ SUBDIRS=`pwd` \
-		INSTALL_MOD_PATH=$(DESTDIR) INSTALL_MOD_DIR=addon $@
+	$(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` \
+		INSTALL_MOD_PATH=$(DESTDIR) \
+		INSTALL_MOD_DIR=addon/zfs $@
+	find ${DESTDIR}/lib/modules/ -name 'modules.*' | xargs ${RM}
 	# Install the required headers in to the kernel source
-	(mkdir -p $(DESTDIR)/@LINUX@/include/zfs && \
+	destname=zfs-@ZFS_META_VERSION@/@LINUX_VERSION@; \
+	instdest=$(DESTDIR)/@prefix@/src/$$destname; \
+	(mkdir -p $$instdest && \
 	 find . -mindepth 3 -maxdepth 3 -name '*.h' | \
-	 xargs cp -t $(DESTDIR)/@LINUX@/include/zfs) || exit 1; \
-	(mkdir -p $(DESTDIR)/@LINUX@/include/zfs/sys && \
+	 xargs cp -t $$instdest) || exit 1; \
+	(mkdir -p $$instdest/sys && \
 	 find . -mindepth 4 -maxdepth 4 -name '*.h' | \
-	 xargs cp -t $(DESTDIR)/@LINUX@/include/zfs/sys) || exit 1;
+	 xargs cp -t $$instdest/sys) || exit 1;
 
 distdir:
 	distfiles=`find . -name '*.c' -o -name '*.h'`; \
diff --git a/zfs-modules.spec.in b/zfs-modules.spec.in
new file mode 100644
index 0000000000..abfd97191f
--- /dev/null
+++ b/zfs-modules.spec.in
@@ -0,0 +1,205 @@
+# The following block is used to allow the source RPM to be rebuilt 
+# against specific kernels.  It is preferable that rpmbuild define the
+# require_kver, require_kdir, require_obj constants for us, but if it does not
+# not we attempt to determine the correct values based on your distro.
+
+%{?require_kver: %define kver %{require_kver}}
+%{?require_kdir: %define kdir %{require_kdir}}
+%{?require_kobj: %define kobj %{require_kobj}}
+
+# kdir:    Full path to the kernel source headers
+# kobj:    Full path to the kernel build objects
+# kver:    Kernel version
+# kpkg:    Kernel package name
+# kdevpkg: Kernel devel package name
+# kverpkg: Kernel package version
+
+%{?require_splver: %define splver %{require_splver}}
+%{?require_spldir: %define spldir %{require_spldir}}
+%{?require_splobj: %define splobj %{require_splobj}}
+
+# spldir:    Full path to the spl source headers
+# splobj:    Full path to the spl build objects
+# splver:    Spl version
+# splpkg:    Spl package name
+# spldevpkg: Spl devel package name
+# splverpkg: Spl package version
+
+# SLES*:
+%if %{defined sles_version}
+ %if %{undefined kver}
+  %define klnk           %{_usrsrc}/linux-obj/%{_target_cpu}/%{_target_cpu}
+  %define kver           %((echo X; %{__cat} %{klnk}/.kernelrelease
+                            2>/dev/null) | tail -1)
+ %endif
+ %define kpkg            kernel-%{_target_cpu}
+ %define kdevpkg         kernel-source kernel-syms
+ %define kverpkg         %(echo %{kver} | cut -d'-' -f1-2)
+ %if %{undefined kdir}
+  %define kdir           %{_usrsrc}/linux-%{kverpkg}
+ %endif
+ %if %{undefined kobj}
+  %define kobj           %{kdir}-obj/%{_target_cpu}/%{_target_cpu}
+ %endif
+
+# CHAOS4:
+%else
+%if %{defined ch4}
+ %if %{undefined kver}
+  %define klnk           %{_usrsrc}/kernels/*/include/config
+  %define kver           %((echo X; %{__cat} %{klnk}/kernel.release
+                            2>/dev/null) | tail -1)
+ %endif
+ %define kpkg            chaos-kernel
+ %define kdevpkg         chaos-kernel-devel
+ %define kverpkg         %{kver}
+ %if %{undefined kdir}
+  %define kdir %{_usrsrc}/kernels/%{kver}
+ %endif
+ %if %{undefined kobj}
+  %define kobj           %{kdir}
+ %endif
+
+# RHEL*/Fedora:
+%else
+%if %{defined fedora} || %{defined rhel}
+ %if %{undefined kver}
+  %define klnk           %{_usrsrc}/kernels/*/include/config
+  %define kver           %((echo X; %{__cat} %{klnk}/kernel.release
+                            2>/dev/null) | tail -1)
+ %endif
+ %define kpkg            kernel
+ %define kdevpkg         kernel-devel
+ %define kverpkg         %(echo %{kver} | cut -d'.' -f1-7)
+ %if %{undefined kdir}
+  %define kdir           %{_usrsrc}/kernels/%{kver}
+ %endif
+ %if %{undefined kobj}
+  %define kobj           %{kdir}
+ %endif
+
+%else
+
+# Unsupported distro:
+ %if %{undefined kver}
+  %define kver            X
+ %endif
+ %define kpkg             kernel
+ %define kdevpkg          kernel-devel
+ %define kverpkg          %{kver}
+ %if %{undefined kdir}
+  %define kdir           %{_usrsrc}/kernels/%{kver}
+ %endif
+ %if %{undefined kobj}
+  %define kobj           %{kdir}
+ %endif
+
+%endif
+%endif
+%endif
+
+# SPL package dependencies
+%if %{undefined splver}
+ %define spllnk          %{_usrsrc}/spl-*/%{kver}
+ %define splver          %((echo X; %{__cat} %{spllnk}/spl.release
+                            2>/dev/null) | tail -1)
+%endif
+%define splpkg           spl
+%define spldevpkg        spl-devel
+%define splverpkg        %{splver}
+%if %{undefined spldir}
+ %define spldir %{_usrsrc}/spl-%{splver}/%{kver}
+%endif
+%if %{undefined splobj}
+ %define splobj          %{spldir}/module
+%endif
+
+
+# Distro agnostic:
+%define name             @PACKAGE@-modules
+%define version          @VERSION@
+%define debug_package    %{nil}
+
+
+# The kernel version should only be appended to a binary RPM.  When
+# building a source RPM it must be kernel version agnostic.  This means
+# the source RPM must never specify a required kernel version, but the
+# final RPM should be keyed to the kernel version it was built against.
+%if %{defined build_src_rpm}
+%define release          @ZFS_META_RELEASE@
+%define krequires        %{kpkg}
+%define splrequires      %{splpkg}
+%else
+%define relext           %(echo %{kverpkg} | %{__sed} -e 's/-/_/g')
+%define release          @ZFS_META_RELEASE@_%{relext}
+%define krequires        %{kpkg} = %{kverpkg}
+%define splrequires      %{splpkg} = %{splverpkg}
+%endif
+
+Summary:         ZFS File System
+Group:           Utilities/System
+Name:            %{name}
+Version:         %{version}
+Release:         %{release}
+License:         @LICENSE@
+URL:             git://eris.llnl.gov/zfs.git
+BuildRoot:       %{_tmppath}/%{name}-%{version}-%{release}-%(%{__id_u} -n)
+Source:          @PACKAGE@-%{version}.tar.gz
+Requires:        %{krequires}
+Requires:        %{splrequires}
+BuildRequires:   %{kdevpkg}
+BuildRequires:   %{spldevpkg}
+
+%description
+The %{name} package contains kernel modules and support utilities for
+the %{name} file system.
+
+%package devel
+Summary:         ZFS File System Headers and Symbols
+Group:           Development/Libraries
+Requires:        %{krequires}
+Requires:        %{splrequires}
+BuildRequires:   %{kdevpkg}
+BuildRequires:   %{spldevpkg}
+
+%description devel
+The %{name}-devel package contains the kernel header files and 
+Module.symvers symbols needed for building additional modules
+which use %{name}.
+
+%prep
+%setup -n @PACKAGE@-%{version}
+%build
+%configure --with-linux=%{kdir} --with-linux-obj=%{kobj} \
+           --with-spl=%{spldir} --with-spl-obj=%{splobj} \
+           --with-config=kernel
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-, root, root)
+/lib/modules/*
+
+%files devel
+%defattr(-,root,root)
+%{_prefix}/src/*
+
+%post
+if [ -f /boot/System.map-%{kver} ]; then
+	depmod -ae -F /boot/System.map-%{kver} %{kver} || exit 0
+else
+	depmod -ae %{kver} || exit 0
+fi
+
+%postun
+if [ -f /boot/System.map-%{kver} ]; then
+	depmod -ae -F /boot/System.map-%{kver} %{kver} || exit 0
+else
+	depmod -ae %{kver} || exit 0
+fi
diff --git a/zfs.spec.in b/zfs.spec.in
index 1a5565232d..b63096cc9e 100644
--- a/zfs.spec.in
+++ b/zfs.spec.in
@@ -1,83 +1,40 @@
-# The following block is used to allow the source RPM to be rebuilt 
-# against arbitrary kernels.  It ensure the release name is correct
-# and the proper build/install requires are set.
-%if 0%{?require_kver:1}
-%define kver %{require_kver}
-%else
-%define _kdir %((echo X; ls -1d /usr/src/kernels/* /usr/src/linux-* 2>/dev/null)|sed -e 's/linux-//' | tail -1)
-%define kver %(basename %{_kdir})
-%endif
+%define name             @PACKAGE@
+%define version          @VERSION@
+%define release          @ZFS_META_RELEASE@
+%define debug_package    %{nil}
 
-# Each distro has its own kernel package naming convention.
-%if 0%{?ch4}
-%define kstr chaos-kernel
-%define kdev chaos-kernel-devel
-%define kdir /usr/src/kernels/%{kver}
-%else
-%define kstr kernel
-%define kdev kernel-devel
-%define kdir /usr/src/kernels/%{kver}
-%endif
-
-%define debug_package %{nil}
-
-# The kernel version should only be appended to a binary RPM.
-# When building a source RPM it must be kernel version agnostic.
-%define name     @PACKAGE@
-%define version  @VERSION@
-
-%if %{?build_src_rpm:1}0
-%define release  @ZFS_META_RELEASE@
-%else
-%define release  @ZFS_META_RELEASE@_%(echo %{kver} | sed -e 's/-/_/g')
-%endif
-
-%if 0%{?require_kver:1}
-%define k_buildrequires   %{kdev}=%{kver}
-%define spl_buildrequires spl-devel>=@VERSION@
-%else
-%define k_buildrequires   %{kdev}
-%define spl_buildrequires spl-devel
-%endif
-
-Summary:         ZFS File System
+Summary:         ZFS Library and Utils
 Group:           Utilities/System
 Name:            %{name}
 Version:         %{version}
 Release:         %{release}
-License:         @LICENSE@
+License:         CDDL
 URL:             git://eris.llnl.gov/zfs.git
 BuildRoot:       %{_tmppath}/%{name}-%{version}-%{release}-%(%{__id_u} -n)
 Source:          %{name}-%{version}.tar.gz
-Requires:        %{kstr} = %{kver}
-Requires:        spl >= @VERSION@
 Requires:        zlib
-BuildRequires:   %{k_buildrequires}
-BuildRequires:   %{spl_buildrequires}
 BuildRequires:   zlib-devel
 
 %description
-The %{name} package contains kernel modules and support utilities for
-the %{name} file system.
+The %{name} package contains the libzfs library and support utilities
+for the zfs file system.
 
 %package devel
-Summary:         ZFS File System Headers and Symbols
+Summary:         ZFS File System User Headers
 Group:           Development/Libraries
-Requires:        %{k_buildrequires} = %{kver}
-Requires:        %{spl_buildrequires} >= @VERSION@
-Requires:        zlib-devel
-BuildRequires:   %{k_buildrequires}
-BuildRequires:   %{spl_buildrequires}
+Requires:        zlib
 BuildRequires:   zlib-devel
 
 %description devel
-The %{name}-devel package contains the header files and Module.symvers
-symbols needed for building additional modules which use %{name}.
+The %{name}-devel package contains the header files needed for building
+additional applications against the %{name} libraries.
 
 %prep
 %setup
 %build
-%configure --with-linux=%{kdir} --with-spl=%{kdir}/include/spl
+%configure --with-linux=%{kdir} --with-linux-obj=%{kobj} \
+           --with-spl=%{spldir} --with-spl-obj=%{splobj} \
+           --with-config=user
 make
 
 %install
@@ -93,23 +50,10 @@ rm -rf $RPM_BUILD_ROOT
 %doc OPENSOLARIS.LICENSE README TODO ZFS.RELEASE
 %{_sbindir}/*
 %{_libdir}/*
-/lib/modules/*
 
 %files devel
 %defattr(-,root,root)
-%{kdir}/include/zfs/*
 %{_includedir}/*
 
 %post
-if [ -f /boot/System.map-%{kver} ]; then
-	depmod -ae -F /boot/System.map-%{kver} %{kver} || exit 0
-else
-	depmod -ae %{kver} || exit 0
-fi
-
 %postun
-if [ -f /boot/System.map-%{kver} ]; then
-	depmod -ae -F /boot/System.map-%{kver} %{kver} || exit 0
-else
-	depmod -ae %{kver} || exit 0
-fi
diff --git a/zfs_unconfig.h b/zfs_unconfig.h
new file mode 100644
index 0000000000..eee3b87adc
--- /dev/null
+++ b/zfs_unconfig.h
@@ -0,0 +1,12 @@
+/*
+ * Undefine these symbols to allow other autoheader enabled packages
+ * to leverage the ZFS configure checks without a header conflict.
+ */
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+#undef STDC_HEADERS