From d51c34fd274a67ae02bd4d06df18081dce1f4292 Mon Sep 17 00:00:00 2001 From: halfcyan Date: Thu, 1 Jan 2026 22:25:48 -0700 Subject: [PATCH] add sample spec files from openzfs source --- anda/system/openzfs/samples/zfs-dkms.spec | 168 ++++++ anda/system/openzfs/samples/zfs-kmod.spec | 215 ++++++++ anda/system/openzfs/samples/zfs.spec | 606 ++++++++++++++++++++++ 3 files changed, 989 insertions(+) create mode 100644 anda/system/openzfs/samples/zfs-dkms.spec create mode 100644 anda/system/openzfs/samples/zfs-kmod.spec create mode 100644 anda/system/openzfs/samples/zfs.spec diff --git a/anda/system/openzfs/samples/zfs-dkms.spec b/anda/system/openzfs/samples/zfs-dkms.spec new file mode 100644 index 0000000000..fe127025e8 --- /dev/null +++ b/anda/system/openzfs/samples/zfs-dkms.spec @@ -0,0 +1,168 @@ +%{?!packager: %define packager Brian Behlendorf } + +%if ! 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} +%define not_rpm 1 +%endif + +# Exclude input files from mangling +%global __brp_mangle_shebangs_exclude_from ^/usr/src/.*$ + +%define module @PACKAGE@ +%define mkconf scripts/dkms.mkconf + +Name: %{module}-dkms + +Version: @VERSION@ +Release: @RELEASE@%{?dist} +Summary: Kernel module(s) (dkms) + +Group: System Environment/Kernel +License: @ZFS_META_LICENSE@ +URL: https://github.com/openzfs/zfs +Source0: %{module}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildArch: noarch + +Requires: dkms >= 2.2.0.3 +Requires(pre): dkms >= 2.2.0.3 +Requires(post): dkms >= 2.2.0.3 +Requires(preun): dkms >= 2.2.0.3 +Requires: gcc, make, perl, diffutils +Requires(post): gcc, make, perl, diffutils + +# Hold back kernel upgrades if kernel is not supported by ZFS +%if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} +Requires: kernel-devel >= @ZFS_META_KVER_MIN@, kernel-devel <= @ZFS_META_KVER_MAX@.999 +Requires(post): kernel-devel >= @ZFS_META_KVER_MIN@, kernel-devel <= @ZFS_META_KVER_MAX@.999 +Conflicts: kernel-devel < @ZFS_META_KVER_MIN@, kernel-devel > @ZFS_META_KVER_MAX@.999 +Requires: kernel-uname-r >= @ZFS_META_KVER_MIN@, kernel-uname-r <= @ZFS_META_KVER_MAX@.999 +Requires(post): kernel-uname-r >= @ZFS_META_KVER_MIN@, kernel-uname-r <= @ZFS_META_KVER_MAX@.999 +Conflicts: kernel-uname-r < @ZFS_META_KVER_MIN@, kernel-uname-r > @ZFS_META_KVER_MAX@.999 + +Obsoletes: spl-dkms <= %{version} +%endif +Provides: %{module}-kmod = %{version} +AutoReqProv: no + +%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) +# We don't directly use it, but if this isn't installed, rpmbuild as root can +# crash+corrupt rpmdb +# See issue #12071 +BuildRequires: ncompress +%endif + +%description +This package contains the dkms ZFS kernel modules. + +%prep +%setup -q -n %{module}-%{version} + +%build +%{mkconf} -n %{module} -v %{version} -f dkms.conf + +%install +if [ "$RPM_BUILD_ROOT" != "/" ]; then + rm -rf $RPM_BUILD_ROOT +fi +mkdir -p $RPM_BUILD_ROOT/usr/src/ +cp -rf ${RPM_BUILD_DIR}/%{module}-%{version} $RPM_BUILD_ROOT/usr/src/ + +%clean +if [ "$RPM_BUILD_ROOT" != "/" ]; then + rm -rf $RPM_BUILD_ROOT +fi + +%files +%defattr(-,root,root) +/usr/src/%{module}-%{version} + +%pre +echo "Running pre installation script: $0. Parameters: $*" +# We don't want any other versions lingering around in dkms. +# Tests with 'dnf' showed that in case of reinstall, or upgrade +# the preun scriptlet removed the version we are trying to install. +# Because of this, find all zfs dkms sources in /var/lib/dkms and +# remove them, if we find a matching version in dkms. + +dkms_root=/var/lib/dkms +if [ -d ${dkms_root}/%{module} ]; then + cd ${dkms_root}/%{module} + for x in [[:digit:]]*; do + [ -d "$x" ] || continue + otherver="$x" + opath="${dkms_root}/%{module}/${otherver}" + if [ "$otherver" != %{version} ]; then + # This is a workaround for a broken 'dkms status', we caused in a previous version. + # One day it might be not needed anymore, but it does not hurt to keep it. + if dkms status -m %{module} -v "$otherver" 2>&1 | grep "${opath}/source/dkms.conf does not exist" + then + echo "ERROR: dkms status is broken!" >&2 + if [ -L "${opath}/source" -a ! -d "${opath}/source" ] + then + echo "Trying to fix it by removing the symlink: ${opath}/source" >&2 + echo "You should manually remove ${opath}" >&2 + rm -f "${opath}/source" || echo "Removal failed!" >&2 + fi + fi + if [ `dkms status -m %{module} -v "$otherver" | grep -c %{module}` -gt 0 ]; then + echo "Removing old %{module} dkms modules version $otherver from all kernels." + dkms remove -m %{module} -v "$otherver" --all ||: + fi + fi + done + cd ${dkms_root} +fi + +# Uninstall this version of zfs dkms modules before installation of the package. +if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then + echo "Removing %{module} dkms modules version %{version} from all kernels." + dkms remove -m %{module} -v %{version} --all ||: +fi + +%post +echo "Running post installation script: $0. Parameters: $*" +# Add the module to dkms, as reccommended in the dkms man page. +# This is generally rpm specfic. +# But this also may help, if we have a broken 'dkms status'. +# Because, if the sources are available and only the symlink pointing +# to them is missing, this will resolve the situation +echo "Adding %{module} dkms modules version %{version} to dkms." +dkms add -m %{module} -v %{version} %{!?not_rpm:--rpm_safe_upgrade} ||: + +# After installing the package, dkms install this zfs version for the current kernel. +# Force the overwriting of old modules to avoid diff warnings in dkms status. +# Or in case of a downgrade to overwrite newer versions. +# Or if some other backed up versions have been restored before. +echo "Installing %{module} dkms modules version %{version} for the current kernel." +dkms install --force -m %{module} -v %{version} ||: + +%preun +dkms_root="/var/lib/dkms/%{module}/%{version}" +echo "Running pre uninstall script: $0. Parameters: $*" +# In case of upgrade we do nothing. See above comment in pre hook. +if [ "$1" = "1" -o "$1" = "upgrade" ] ; then + echo "This is an upgrade. Skipping pre uninstall action." + exit 0 +fi + +# Check if we uninstall the package. In that case remove the dkms modules. +# '0' is the value for the first parameter for rpm packages. +# 'remove' or 'purge' are the possible names for deb packages. +if [ "$1" = "0" -o "$1" = "remove" -o "$1" = "purge" ] ; then + if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then + echo "Removing %{module} dkms modules version %{version} from all kernels." + dkms remove -m %{module} -v %{version} --all %{!?not_rpm:--rpm_safe_upgrade} && exit 0 + fi + # If removing the modules failed, it might be because of the broken 'dkms status'. + if dkms status -m %{module} -v %{version} 2>&1 | grep "${dkms_root}/source/dkms.conf does not exist" + then + echo "ERROR: dkms status is broken!" >&2 + echo "You should manually remove ${dkms_root}" >&2 + echo "WARNING: installed modules in /lib/modules/`uname -r`/extra could not be removed automatically!" >&2 + fi +else + echo "Script parameter $1 did not match any removal condition." +fi + +exit 0 + diff --git a/anda/system/openzfs/samples/zfs-kmod.spec b/anda/system/openzfs/samples/zfs-kmod.spec new file mode 100644 index 0000000000..7ed828bd0c --- /dev/null +++ b/anda/system/openzfs/samples/zfs-kmod.spec @@ -0,0 +1,215 @@ +%define module @PACKAGE@ + +%if !%{defined ksrc} +%if 0%{?rhel}%{?fedora}%{?openEuler} +%define ksrc ${kernel_version##*___} +%else +%define ksrc "$( \ + if [ -e "/usr/src/linux-${kernel_version%%___*}" ]; then \ + echo "/usr/src/linux-${kernel_version%%___*}"; \ + elif [ -e "/lib/modules/${kernel_version%%___*}/source" ]; then \ + echo "/lib/modules/${kernel_version%%___*}/source"; \ + else \ + echo "/lib/modules/${kernel_version%%___*}/build"; \ + fi)" +%endif +%endif + +%if !%{defined kobj} +%if 0%{?rhel}%{?fedora}%{?openEuler} +%define kobj ${kernel_version##*___} +%else +%define kobj "$( \ + if [ -e "/usr/src/linux-${kernel_version%%___*}" ]; then \ + echo "/usr/src/linux-${kernel_version%%___*}"; \ + else \ + echo "/lib/modules/${kernel_version%%___*}/build"; \ + fi)" +%endif +%endif + +#define repo rpmfusion +#define repo chaos + +# (un)define the next line to either build for the newest or all current kernels +%define buildforkernels newest +#define buildforkernels current +#define buildforkernels akmod + +%bcond_with debug +%bcond_with debuginfo + + +Name: %{module}-kmod + +Version: @VERSION@ +Release: @RELEASE@%{?dist} +Summary: Kernel module(s) + +Group: System Environment/Kernel +License: @ZFS_META_LICENSE@ +URL: https://github.com/openzfs/zfs +Source0: %{module}-%{version}.tar.gz +Source10: kmodtool +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id} -u -n) +%if 0%{?rhel}%{?fedora}%{?openEuler} +BuildRequires: gcc, make +BuildRequires: elfutils-libelf-devel +%endif + +%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) +# We don't directly use it, but if this isn't installed, rpmbuild as root can +# crash+corrupt rpmdb +# See issue #12071 +BuildRequires: ncompress +%endif + +# The developments headers will conflict with the dkms packages. +Conflicts: %{module}-dkms + +%if %{defined repo} + +# Building for a repository use the proper build-sysbuild package +# to determine which kernel-devel packages should be installed. +BuildRequires: %{_bindir}/kmodtool +%{!?kernels:BuildRequires: buildsys-build-%{repo}-kerneldevpkgs-%{?buildforkernels:%{buildforkernels}}%{!?buildforkernels:current}-%{_target_cpu}} + +%else + +# Building local packages attempt to to use the installed kernel. +%{?rhel:BuildRequires: kernel-devel} +%{?fedora:BuildRequires: kernel-devel} +%{?openEuler:BuildRequires: kernel-devel} +%{?suse_version:BuildRequires: kernel-source} + +%if !%{defined kernels} && !%{defined build_src_rpm} + %if 0%{?rhel}%{?fedora}%{?suse_version}%{?openEuler} + %define kernels %(ls -1 /usr/src/kernels) + %else + %define kernels %(ls -1 /lib/modules) + %endif +%endif +%endif + +# LDFLAGS are not sanitized by arch/*/Makefile for these architectures. +%ifarch ppc ppc64 ppc64le aarch64 +%global __global_ldflags %{nil} +%endif + +# Kmodtool does its magic here. A patched version of kmodtool is shipped +# with the source rpm until kmod development packages are supported upstream. +# https://bugzilla.rpmfusion.org/show_bug.cgi?id=2714 +%{expand:%(bash %{SOURCE10} --target %{_target_cpu} %{?repo:--repo %{?repo}} --kmodname %{name} %{?buildforkernels:--%{buildforkernels}} --devel %{?prefix:--prefix "%{?prefix}"} %{?kernels:--for-kernels "%{?kernels}"} %{?kernelbuildroot:--buildroot "%{?kernelbuildroot}"} 2>/dev/null) } + + +%description +This package contains the ZFS kernel modules. + +%prep +# Error out if there was something wrong with kmodtool. +%{?kmodtool_check} + +# Print kmodtool output for debugging purposes: +bash %{SOURCE10} --target %{_target_cpu} %{?repo:--repo %{?repo}} --kmodname %{name} %{?buildforkernels:--%{buildforkernels}} --devel %{?prefix:--prefix "%{?prefix}"} %{?kernels:--for-kernels "%{?kernels}"} %{?kernelbuildroot:--buildroot "%{?kernelbuildroot}"} 2>/dev/null + +%if %{with debug} + %define debug --enable-debug +%else + %define debug --disable-debug +%endif + +%if %{with debuginfo} + %define debuginfo --enable-debuginfo +%else + %define debuginfo --disable-debuginfo +%endif + +# Leverage VPATH from configure to avoid making multiple copies. +%define _configure ../%{module}-%{version}/configure + +%setup -q -c -T -a 0 + +for kernel_version in %{?kernel_versions}; do + %{__mkdir} _kmod_build_${kernel_version%%___*} +done + +%build +for kernel_version in %{?kernel_versions}; do + cd _kmod_build_${kernel_version%%___*} + %configure \ + --with-config=kernel \ + --with-linux=%{ksrc} \ + --with-linux-obj=%{kobj} \ + %{debug} \ + %{debuginfo} \ + %{?kernel_cc} \ + %{?kernel_ld} \ + %{?kernel_llvm} \ + %{?kernel_cross_compile} \ + %{?kernel_arch} + + # Pre-6.10 kernel builds didn't need to copy over the source files to the + # build directory. However we do need to do it though post-6.10 due to + # these commits: + # + # b1992c3772e6 kbuild: use $(src) instead of $(srctree)/$(src) for source + # directory + # + # 9a0ebe5011f4 kbuild: use $(obj)/ instead of $(src)/ for common pattern + # rules + # + # Note that kmodtool actually copies over the source into the build + # directory, so what we're doing here is normal. For efficiency reasons + # though we just use hardlinks instead of copying. + # + # See https://github.com/openzfs/zfs/issues/16439 for more info. + cp -lR ../%{module}-%{version}/module/* module/ + + make %{?_smp_mflags} + cd .. +done + + +# Module signing (modsign) +# +# This must be run _after_ find-debuginfo.sh runs, otherwise that will strip +# the signature off of the modules. +# (Based on Fedora's kernel.spec workaround) +%define __modsign_install_post \ + sign_pem="%{ksrc}/certs/signing_key.pem"; \ + sign_x509="%{ksrc}/certs/signing_key.x509"; \ + if [ -f "${sign_x509}" ]\ + then \ + echo "Signing kernel modules ..."; \ + for kmod in $(find ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/ -name \*.ko); do \ + %{ksrc}/scripts/sign-file sha256 ${sign_pem} ${sign_x509} ${kmod}; \ + done \ + fi \ +%{nil} + +# hack to ensure signing happens after find-debuginfo.sh runs +%define __spec_install_post \ + %{?__debug_package:%{__debug_install_post}}\ + %{__arch_install_post}\ + %{__os_install_post}\ + %{__modsign_install_post} + +%install +rm -rf ${RPM_BUILD_ROOT} + +# Relies on the kernel 'modules_install' make target. +for kernel_version in %{?kernel_versions}; do + cd _kmod_build_${kernel_version%%___*} + make install \ + DESTDIR=${RPM_BUILD_ROOT} \ + %{?prefix:INSTALL_MOD_PATH=%{?prefix}} \ + INSTALL_MOD_DIR=%{kmodinstdir_postfix} + cd .. +done +# find-debuginfo.sh only considers executables +chmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/* +%{?akmod_install} + + +%clean +rm -rf $RPM_BUILD_ROOT diff --git a/anda/system/openzfs/samples/zfs.spec b/anda/system/openzfs/samples/zfs.spec new file mode 100644 index 0000000000..9ae479aeb9 --- /dev/null +++ b/anda/system/openzfs/samples/zfs.spec @@ -0,0 +1,606 @@ +%global _sbindir /sbin +%global _libdir /%{_lib} + +# Set the default udev directory based on distribution. +%if %{undefined _udevdir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _udevdir %{_prefix}/lib/udev +%else +%global _udevdir /lib/udev +%endif +%endif + +# Set the default udevrule directory based on distribution. +%if %{undefined _udevruledir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _udevruledir %{_prefix}/lib/udev/rules.d +%else +%global _udevruledir /lib/udev/rules.d +%endif +%endif + +# Set the default _bashcompletiondir directory based on distribution. +%if %{undefined _bashcompletiondir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _bashcompletiondir /etc/bash_completion.d +%else +%global _bashcompletiondir /usr/share/bash-completion +%endif +%endif + +# Set the default dracut directory based on distribution. +%if %{undefined _dracutdir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _dracutdir %{_prefix}/lib/dracut +%else +%global _dracutdir %{_prefix}/share/dracut +%endif +%endif + +%if %{undefined _initconfdir} +%global _initconfdir /etc/sysconfig +%endif + +%if %{undefined _unitdir} +%global _unitdir %{_prefix}/lib/systemd/system +%endif + +%if %{undefined _presetdir} +%global _presetdir %{_prefix}/lib/systemd/system-preset +%endif + +%if %{undefined _modulesloaddir} +%global _modulesloaddir %{_prefix}/lib/modules-load.d +%endif + +%if %{undefined _systemdgeneratordir} +%global _systemdgeneratordir %{_prefix}/lib/systemd/system-generators +%endif + +%if %{undefined _pkgconfigdir} +%global _pkgconfigdir %{_prefix}/%{_lib}/pkgconfig +%endif + +%bcond_with debug +%bcond_with debuginfo +%bcond_with asan +%bcond_with ubsan +%bcond_with systemd +%bcond_with pam +%bcond_without pyzfs + +# Generic enable switch for systemd +%if %{with systemd} +%define _systemd 1 +%endif + +# Distros below support systemd +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%define _systemd 1 +%endif + +# When not specified default to distribution provided version. +%if %{undefined __use_python} +%define __python /usr/bin/python3 +%define __python_pkg_version 3 +%else +%define __python %{__use_python} +%define __python_pkg_version %{__use_python_pkg_version} +%endif +%define __python_sitelib %(%{__python} -Esc " +import sysconfig; +if hasattr(sysconfig, 'get_default_scheme'): + scheme = sysconfig.get_default_scheme() +else: + scheme = sysconfig._get_default_scheme() +if scheme == 'posix_local': + scheme = 'posix_prefix' +prefix = '%{_prefix}' +if prefix == 'NONE': + prefix = '%{ac_default_prefix}' +sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix}) +print(sitedir);" 2>/dev/null || %{__python} -Esc "from distutils import sysconfig; print(sysconfig.get_python_lib(0,0))") + +Name: @PACKAGE@ +Version: @VERSION@ +Release: @RELEASE@%{?dist} +Summary: Commands to control the kernel modules and libraries + +Group: System Environment/Kernel +License: @ZFS_META_LICENSE@ +URL: https://github.com/openzfs/zfs +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +Requires: libzpool7%{?_isa} = %{version}-%{release} +Requires: libnvpair3%{?_isa} = %{version}-%{release} +Requires: libuutil3%{?_isa} = %{version}-%{release} +Requires: libzfs7%{?_isa} = %{version}-%{release} +Requires: %{name}-kmod = %{version} +Provides: %{name}-kmod-common = %{version}-%{release} +Obsoletes: spl <= %{version} + +# zfs-fuse provides the same commands and man pages that OpenZFS does. +# Renaming those on either side would conflict with all available documentation. +Conflicts: zfs-fuse + +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +BuildRequires: gcc, make +BuildRequires: zlib-devel +BuildRequires: libuuid-devel +BuildRequires: libblkid-devel +BuildRequires: libudev-devel +BuildRequires: libattr-devel +BuildRequires: openssl-devel +%if 0%{?fedora}%{?suse_version}%{?openEuler} || 0%{?rhel} >= 8 || 0%{?centos} >= 8 +BuildRequires: libtirpc-devel +%endif + +%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) +# We don't directly use it, but if this isn't installed, rpmbuild as root can +# crash+corrupt rpmdb +# See issue #12071 +BuildRequires: ncompress +%endif + +Requires: openssl +%if 0%{?_systemd} +BuildRequires: systemd +%endif + +%endif + +%if 0%{?_systemd} +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd +%endif + +# The zpool iostat/status -c scripts call some utilities like lsblk and iostat +Requires: util-linux +Requires: sysstat + +%description +This package contains the core ZFS command line utilities. + +%package -n libzpool7 +Summary: Native ZFS pool library for Linux +Group: System Environment/Kernel +Obsoletes: libzpool2 <= %{version} +Obsoletes: libzpool4 <= %{version} +Obsoletes: libzpool5 <= %{version} +Obsoletes: libzpool6 <= %{version} + +%description -n libzpool7 +This package contains the zpool library, which provides support +for managing zpools + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libzpool7 +%else +%post -n libzpool7 -p /sbin/ldconfig +%postun -n libzpool7 -p /sbin/ldconfig +%endif + +%package -n libnvpair3 +Summary: Solaris name-value library for Linux +Group: System Environment/Kernel +Obsoletes: libnvpair1 <= %{version} + +%description -n libnvpair3 +This package contains routines for packing and unpacking name-value +pairs. This functionality is used to portably transport data across +process boundaries, between kernel and user space, and can be used +to write self describing data structures on disk. + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libnvpair3 +%else +%post -n libnvpair3 -p /sbin/ldconfig +%postun -n libnvpair3 -p /sbin/ldconfig +%endif + +%package -n libuutil3 +Summary: Solaris userland utility library for Linux +Group: System Environment/Kernel +Obsoletes: libuutil1 <= %{version} + +%description -n libuutil3 +This library provides a variety of compatibility functions for OpenZFS: + * libspl: The Solaris Porting Layer userland library, which provides APIs + that make it possible to run Solaris user code in a Linux environment + with relatively minimal modification. + * libavl: The Adelson-Velskii Landis balanced binary tree manipulation + library. + * libefi: The Extensible Firmware Interface library for GUID disk + partitioning. + * libshare: NFS, SMB, and iSCSI service integration for ZFS. + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libuutil3 +%else +%post -n libuutil3 -p /sbin/ldconfig +%postun -n libuutil3 -p /sbin/ldconfig +%endif + +# The library version is encoded in the package name. When updating the +# version information it is important to add an obsoletes line below for +# the previous version of the package. +%package -n libzfs7 +Summary: Native ZFS filesystem library for Linux +Group: System Environment/Kernel +Obsoletes: libzfs2 <= %{version} +Obsoletes: libzfs4 <= %{version} +Obsoletes: libzfs5 <= %{version} +Obsoletes: libzfs6 <= %{version} + +%description -n libzfs7 +This package provides support for managing ZFS filesystems + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libzfs7 +%else +%post -n libzfs7 -p /sbin/ldconfig +%postun -n libzfs7 -p /sbin/ldconfig +%endif + +%package -n libzfs7-devel +Summary: Development headers +Group: System Environment/Kernel +Requires: libzfs7%{?_isa} = %{version}-%{release} +Requires: libzpool7%{?_isa} = %{version}-%{release} +Requires: libnvpair3%{?_isa} = %{version}-%{release} +Requires: libuutil3%{?_isa} = %{version}-%{release} +Provides: libzpool7-devel = %{version}-%{release} +Provides: libnvpair3-devel = %{version}-%{release} +Provides: libuutil3-devel = %{version}-%{release} +Obsoletes: zfs-devel <= %{version} +Obsoletes: libzfs2-devel <= %{version} +Obsoletes: libzfs4-devel <= %{version} +Obsoletes: libzfs5-devel <= %{version} + +%description -n libzfs7-devel +This package contains the header files needed for building additional +applications against the ZFS libraries. + +%package test +Summary: Test infrastructure +Group: System Environment/Kernel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: parted +Requires: lsscsi +Requires: mdadm +Requires: bc +Requires: ksh +Requires: fio +Requires: acl +Requires: sudo +Requires: sysstat +Requires: libaio +Requires: python%{__python_pkg_version} +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +BuildRequires: libaio-devel +%endif +AutoReqProv: no + +%description test +This package contains test infrastructure and support scripts for +validating the file system. + +%package dracut +Summary: Dracut module +Group: System Environment/Kernel +BuildArch: noarch +Requires: %{name} >= %{version} +Requires: dracut +Requires: /usr/bin/awk +Requires: grep + +%description dracut +This package contains a dracut module used to construct an initramfs +image which is ZFS aware. + +%if %{with pyzfs} +# Enforce `python36-` package prefix for CentOS 7 +# since dependencies come from EPEL and are named this way +%package -n python%{__python_pkg_version}-pyzfs +Summary: Python %{python_version} wrapper for libzfs_core +Group: Development/Languages/Python +License: Apache-2.0 +BuildArch: noarch +Requires: libzfs7 = %{version}-%{release} +Requires: libnvpair3 = %{version}-%{release} +Requires: libffi +Requires: python%{__python_pkg_version} + +%if 0%{?centos} == 7 +Requires: python36-cffi +%else +Requires: python%{__python_pkg_version}-cffi +%endif + +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +%if 0%{?centos} == 7 +BuildRequires: python36-packaging +BuildRequires: python36-devel +BuildRequires: python36-cffi +BuildRequires: python36-setuptools +%else +BuildRequires: python%{__python_pkg_version}-packaging +BuildRequires: python%{__python_pkg_version}-devel +BuildRequires: python%{__python_pkg_version}-cffi +BuildRequires: python%{__python_pkg_version}-setuptools +%endif + +BuildRequires: libffi-devel +%endif + +%description -n python%{__python_pkg_version}-pyzfs +This package provides a python wrapper for the libzfs_core C library. +%endif + +%if 0%{?_initramfs} +%package initramfs +Summary: Initramfs module +Group: System Environment/Kernel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: initramfs-tools + +%description initramfs +This package contains a initramfs module used to construct an initramfs +image which is ZFS aware. +%endif + +%if %{with pam} +%package -n pam_zfs_key +Summary: PAM module for encrypted ZFS datasets + +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +BuildRequires: pam-devel +%endif + +%description -n pam_zfs_key +This package contains the pam_zfs_key PAM module, which provides +support for unlocking datasets on user login. +%endif + +%prep +%if %{with debug} + %define debug --enable-debug +%else + %define debug --disable-debug +%endif + +%if %{with debuginfo} + %define debuginfo --enable-debuginfo +%else + %define debuginfo --disable-debuginfo +%endif + +%if %{with asan} + %define asan --enable-asan +%else + %define asan --disable-asan +%endif + +%if %{with ubsan} + %define ubsan --enable-ubsan +%else + %define ubsan --disable-ubsan +%endif + +%if 0%{?_systemd} + %define systemd --enable-systemd --with-systemdunitdir=%{_unitdir} --with-systemdpresetdir=%{_presetdir} --with-systemdmodulesloaddir=%{_modulesloaddir} --with-systemdgeneratordir=%{_systemdgeneratordir} --disable-sysvinit + %define systemd_svcs zfs-import-cache.service zfs-import-scan.service zfs-mount.service zfs-mount@.service zfs-share.service zfs-zed.service zfs.target zfs-import.target zfs-volume-wait.service zfs-volumes.target +%else + %define systemd --enable-sysvinit --disable-systemd +%endif + +%if %{with pyzfs} + %define pyzfs --enable-pyzfs +%else + %define pyzfs --disable-pyzfs +%endif + +%if %{with pam} + %define pam --enable-pam +%else + %define pam --disable-pam +%endif + +%setup -q + +%build +%configure \ + --with-config=user \ + --with-udevdir=%{_udevdir} \ + --with-udevruledir=%{_udevruledir} \ + --with-dracutdir=%{_dracutdir} \ + --with-pamconfigsdir=%{_datadir}/pam-configs \ + --with-pammoduledir=%{_libdir}/security \ + --with-python=%{__python} \ + --with-pkgconfigdir=%{_pkgconfigdir} \ + --disable-static \ + %{debug} \ + %{debuginfo} \ + %{asan} \ + %{ubsan} \ + %{systemd} \ + %{pam} \ + %{pyzfs} +make %{?_smp_mflags} + +%install +%{__rm} -rf $RPM_BUILD_ROOT +make install DESTDIR=%{?buildroot} +find %{?buildroot}%{_libdir} -name '*.la' -exec rm -f {} \; +%if 0%{!?__brp_mangle_shebangs:1} +find %{?buildroot}%{_bindir} \ + \( -name zarcsummary -or -name zarcstat -or -name dbufstat \ + -or -name zilstat \) \ + -exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; +find %{?buildroot}%{_datadir} \ + \( -name test-runner.py -or -name zts-report.py \) \ + -exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; +%endif + +%post +%if 0%{?_systemd} +%if 0%{?systemd_post:1} +%systemd_post %{systemd_svcs} +%else +if [ "$1" = "1" -o "$1" = "install" ] ; then + # Initial installation + systemctl preset %{systemd_svcs} >/dev/null || true +fi +%endif +%else +if [ -x /sbin/chkconfig ]; then + /sbin/chkconfig --add zfs-import + /sbin/chkconfig --add zfs-load-key + /sbin/chkconfig --add zfs-mount + /sbin/chkconfig --add zfs-share + /sbin/chkconfig --add zfs-zed +fi +%endif +exit 0 + +# On RHEL/CentOS 7 the static nodes aren't refreshed by default after +# installing a package. This is the default behavior for Fedora. +%posttrans +%if 0%{?rhel} == 7 || 0%{?centos} == 7 +systemctl restart kmod-static-nodes +systemctl restart systemd-tmpfiles-setup-dev +udevadm trigger +%endif + +%preun +%if 0%{?_systemd} +%if 0%{?systemd_preun:1} +%systemd_preun %{systemd_svcs} +%else +if [ "$1" = "0" -o "$1" = "remove" ] ; then + # Package removal, not upgrade + systemctl --no-reload disable %{systemd_svcs} >/dev/null || true + systemctl stop %{systemd_svcs} >/dev/null || true +fi +%endif +%else +if [ "$1" = "0" -o "$1" = "remove" ] && [ -x /sbin/chkconfig ]; then + /sbin/chkconfig --del zfs-import + /sbin/chkconfig --del zfs-load-key + /sbin/chkconfig --del zfs-mount + /sbin/chkconfig --del zfs-share + /sbin/chkconfig --del zfs-zed +fi +%endif +exit 0 + +%postun +%if 0%{?_systemd} +%if 0%{?systemd_postun:1} +%systemd_postun %{systemd_svcs} +%else +systemctl --system daemon-reload >/dev/null || true +%endif +%endif + +%files +# Core utilities +%{_sbindir}/* +%{_bindir}/raidz_test +%{_bindir}/zvol_wait +# Optional Python 3 scripts +%{_bindir}/zarcsummary +%{_bindir}/zarcstat +%{_bindir}/dbufstat +%{_bindir}/zilstat +# Man pages +%{_mandir}/man1/* +%{_mandir}/man4/* +%{_mandir}/man5/* +%{_mandir}/man7/* +%{_mandir}/man8/* +# Configuration files and scripts +%{_libexecdir}/%{name} +%{_udevdir}/vdev_id +%{_udevdir}/zvol_id +%{_udevdir}/rules.d/* +%{_datadir}/%{name}/compatibility.d +%if ! 0%{?_systemd} || 0%{?_initramfs} +# Files needed for sysvinit and initramfs-tools +%{_sysconfdir}/%{name}/zfs-functions +%config(noreplace) %{_initconfdir}/zfs +%else +%exclude %{_sysconfdir}/%{name}/zfs-functions +%exclude %{_initconfdir}/zfs +%endif +%if 0%{?_systemd} +%{_unitdir}/* +%{_presetdir}/* +%{_modulesloaddir}/* +%{_systemdgeneratordir}/* +%else +%config(noreplace) %{_sysconfdir}/init.d/* +%endif +%config(noreplace) %{_sysconfdir}/%{name}/zed.d/* +%config(noreplace) %{_sysconfdir}/%{name}/zpool.d/* +%config(noreplace) %{_sysconfdir}/%{name}/vdev_id.conf.*.example +%attr(440, root, root) %config(noreplace) %{_sysconfdir}/sudoers.d/* + +%config(noreplace) %{_bashcompletiondir}/zfs +%config(noreplace) %{_bashcompletiondir}/zpool + +%files -n libzpool7 +%{_libdir}/libzpool.so.* + +%files -n libnvpair3 +%{_libdir}/libnvpair.so.* + +%files -n libuutil3 +%{_libdir}/libuutil.so.* + +%files -n libzfs7 +%{_libdir}/libzfs*.so.* + +%files -n libzfs7-devel +%{_pkgconfigdir}/libzfs.pc +%{_pkgconfigdir}/libzfsbootenv.pc +%{_pkgconfigdir}/libzfs_core.pc +%{_libdir}/*.so +%{_includedir}/* +%doc AUTHORS COPYRIGHT LICENSE NOTICE README.md + +%files test +%{_datadir}/%{name}/zfs-tests +%{_datadir}/%{name}/test-runner +%{_datadir}/%{name}/runfiles +%{_datadir}/%{name}/*.sh + +%files dracut +%doc contrib/dracut/README.md +%{_dracutdir}/modules.d/* + +%if %{with pyzfs} +%files -n python%{__python_pkg_version}-pyzfs +%doc contrib/pyzfs/README +%doc contrib/pyzfs/LICENSE +%defattr(-,root,root,-) +%{__python_sitelib}/libzfs_core/* +%{__python_sitelib}/pyzfs* +%endif + +%if 0%{?_initramfs} +%files initramfs +%doc contrib/initramfs/README.md +/usr/share/initramfs-tools/* +%else +# Since we're not building the initramfs package, +# ignore those files. +%exclude /usr/share/initramfs-tools +%endif + +%if %{with pam} +%files -n pam_zfs_key +%{_libdir}/security/* +%{_datadir}/pam-configs/* +%endif