1%global _sbindir /sbin 2%global _libdir /%{_lib} 3 4# Set the default udev directory based on distribution. 5%if %{undefined _udevdir} 6%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} 7%global _udevdir %{_prefix}/lib/udev 8%else 9%global _udevdir /lib/udev 10%endif 11%endif 12 13# Set the default udevrule directory based on distribution. 14%if %{undefined _udevruledir} 15%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} 16%global _udevruledir %{_prefix}/lib/udev/rules.d 17%else 18%global _udevruledir /lib/udev/rules.d 19%endif 20%endif 21 22# Set the default _bashcompletiondir directory based on distribution. 23%if %{undefined _bashcompletiondir} 24%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} 25%global _bashcompletiondir /etc/bash_completion.d 26%else 27%global _bashcompletiondir /usr/share/bash-completion 28%endif 29%endif 30 31# Set the default dracut directory based on distribution. 32%if %{undefined _dracutdir} 33%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} 34%global _dracutdir %{_prefix}/lib/dracut 35%else 36%global _dracutdir %{_prefix}/share/dracut 37%endif 38%endif 39 40%if %{undefined _initconfdir} 41%global _initconfdir /etc/sysconfig 42%endif 43 44%if %{undefined _unitdir} 45%global _unitdir %{_prefix}/lib/systemd/system 46%endif 47 48%if %{undefined _presetdir} 49%global _presetdir %{_prefix}/lib/systemd/system-preset 50%endif 51 52%if %{undefined _modulesloaddir} 53%global _modulesloaddir %{_prefix}/lib/modules-load.d 54%endif 55 56%if %{undefined _systemdgeneratordir} 57%global _systemdgeneratordir %{_prefix}/lib/systemd/system-generators 58%endif 59 60%if %{undefined _pkgconfigdir} 61%global _pkgconfigdir %{_prefix}/%{_lib}/pkgconfig 62%endif 63 64%bcond_with debug 65%bcond_with debuginfo 66%bcond_with asan 67%bcond_with ubsan 68%bcond_with systemd 69%bcond_with pam 70%bcond_without pyzfs 71 72# Generic enable switch for systemd 73%if %{with systemd} 74%define _systemd 1 75%endif 76 77# Distros below support systemd 78%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} 79%define _systemd 1 80%endif 81 82# When not specified default to distribution provided version. 83%if %{undefined __use_python} 84%define __python /usr/bin/python3 85%define __python_pkg_version 3 86%else 87%define __python %{__use_python} 88%define __python_pkg_version %{__use_python_pkg_version} 89%endif 90%define __python_sitelib %(%{__python} -Esc "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 2>/dev/null || %{__python} -Esc "import sysconfig; print(sysconfig.get_path('purelib'))") 91 92Name: @PACKAGE@ 93Version: @VERSION@ 94Release: @RELEASE@%{?dist} 95Summary: Commands to control the kernel modules and libraries 96 97Group: System Environment/Kernel 98License: @ZFS_META_LICENSE@ 99URL: https://github.com/openzfs/zfs 100Source0: %{name}-%{version}.tar.gz 101BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) 102Requires: libzpool5%{?_isa} = %{version}-%{release} 103Requires: libnvpair3%{?_isa} = %{version}-%{release} 104Requires: libuutil3%{?_isa} = %{version}-%{release} 105Requires: libzfs5%{?_isa} = %{version}-%{release} 106Requires: %{name}-kmod = %{version} 107Provides: %{name}-kmod-common = %{version}-%{release} 108Obsoletes: spl <= %{version} 109 110# zfs-fuse provides the same commands and man pages that OpenZFS does. 111# Renaming those on either side would conflict with all available documentation. 112Conflicts: zfs-fuse 113 114%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} 115BuildRequires: gcc, make 116BuildRequires: zlib-devel 117BuildRequires: libuuid-devel 118BuildRequires: libblkid-devel 119BuildRequires: libudev-devel 120BuildRequires: libattr-devel 121BuildRequires: openssl-devel 122%if 0%{?fedora}%{?suse_version}%{?openEuler} || 0%{?rhel} >= 8 || 0%{?centos} >= 8 123BuildRequires: libtirpc-devel 124%endif 125 126%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) 127# We don't directly use it, but if this isn't installed, rpmbuild as root can 128# crash+corrupt rpmdb 129# See issue #12071 130BuildRequires: ncompress 131%endif 132 133Requires: openssl 134%if 0%{?_systemd} 135BuildRequires: systemd 136%endif 137 138%endif 139 140%if 0%{?_systemd} 141Requires(post): systemd 142Requires(preun): systemd 143Requires(postun): systemd 144%endif 145 146# The zpool iostat/status -c scripts call some utilities like lsblk and iostat 147Requires: util-linux 148Requires: sysstat 149 150%description 151This package contains the core ZFS command line utilities. 152 153%package -n libzpool5 154Summary: Native ZFS pool library for Linux 155Group: System Environment/Kernel 156Obsoletes: libzpool2 <= %{version} 157Obsoletes: libzpool4 <= %{version} 158 159%description -n libzpool5 160This package contains the zpool library, which provides support 161for managing zpools 162 163%if %{defined ldconfig_scriptlets} 164%ldconfig_scriptlets -n libzpool5 165%else 166%post -n libzpool5 -p /sbin/ldconfig 167%postun -n libzpool5 -p /sbin/ldconfig 168%endif 169 170%package -n libnvpair3 171Summary: Solaris name-value library for Linux 172Group: System Environment/Kernel 173Obsoletes: libnvpair1 <= %{version} 174 175%description -n libnvpair3 176This package contains routines for packing and unpacking name-value 177pairs. This functionality is used to portably transport data across 178process boundaries, between kernel and user space, and can be used 179to write self describing data structures on disk. 180 181%if %{defined ldconfig_scriptlets} 182%ldconfig_scriptlets -n libnvpair3 183%else 184%post -n libnvpair3 -p /sbin/ldconfig 185%postun -n libnvpair3 -p /sbin/ldconfig 186%endif 187 188%package -n libuutil3 189Summary: Solaris userland utility library for Linux 190Group: System Environment/Kernel 191Obsoletes: libuutil1 <= %{version} 192 193%description -n libuutil3 194This library provides a variety of compatibility functions for OpenZFS: 195 * libspl: The Solaris Porting Layer userland library, which provides APIs 196 that make it possible to run Solaris user code in a Linux environment 197 with relatively minimal modification. 198 * libavl: The Adelson-Velskii Landis balanced binary tree manipulation 199 library. 200 * libefi: The Extensible Firmware Interface library for GUID disk 201 partitioning. 202 * libshare: NFS, SMB, and iSCSI service integration for ZFS. 203 204%if %{defined ldconfig_scriptlets} 205%ldconfig_scriptlets -n libuutil3 206%else 207%post -n libuutil3 -p /sbin/ldconfig 208%postun -n libuutil3 -p /sbin/ldconfig 209%endif 210 211# The library version is encoded in the package name. When updating the 212# version information it is important to add an obsoletes line below for 213# the previous version of the package. 214%package -n libzfs5 215Summary: Native ZFS filesystem library for Linux 216Group: System Environment/Kernel 217Obsoletes: libzfs2 <= %{version} 218Obsoletes: libzfs4 <= %{version} 219 220%description -n libzfs5 221This package provides support for managing ZFS filesystems 222 223%if %{defined ldconfig_scriptlets} 224%ldconfig_scriptlets -n libzfs5 225%else 226%post -n libzfs5 -p /sbin/ldconfig 227%postun -n libzfs5 -p /sbin/ldconfig 228%endif 229 230%package -n libzfs5-devel 231Summary: Development headers 232Group: System Environment/Kernel 233Requires: libzfs5%{?_isa} = %{version}-%{release} 234Requires: libzpool5%{?_isa} = %{version}-%{release} 235Requires: libnvpair3%{?_isa} = %{version}-%{release} 236Requires: libuutil3%{?_isa} = %{version}-%{release} 237Provides: libzpool5-devel = %{version}-%{release} 238Provides: libnvpair3-devel = %{version}-%{release} 239Provides: libuutil3-devel = %{version}-%{release} 240Obsoletes: zfs-devel <= %{version} 241Obsoletes: libzfs2-devel <= %{version} 242Obsoletes: libzfs4-devel <= %{version} 243 244%description -n libzfs5-devel 245This package contains the header files needed for building additional 246applications against the ZFS libraries. 247 248%package test 249Summary: Test infrastructure 250Group: System Environment/Kernel 251Requires: %{name}%{?_isa} = %{version}-%{release} 252Requires: parted 253Requires: lsscsi 254Requires: mdadm 255Requires: bc 256Requires: ksh 257Requires: fio 258Requires: acl 259Requires: sudo 260Requires: sysstat 261Requires: libaio 262Requires: python%{__python_pkg_version} 263%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} 264BuildRequires: libaio-devel 265%endif 266AutoReqProv: no 267 268%description test 269This package contains test infrastructure and support scripts for 270validating the file system. 271 272%package dracut 273Summary: Dracut module 274Group: System Environment/Kernel 275BuildArch: noarch 276Requires: %{name} >= %{version} 277Requires: dracut 278Requires: /usr/bin/awk 279Requires: grep 280 281%description dracut 282This package contains a dracut module used to construct an initramfs 283image which is ZFS aware. 284 285%if %{with pyzfs} 286# Enforce `python36-` package prefix for CentOS 7 287# since dependencies come from EPEL and are named this way 288%package -n python%{__python_pkg_version}-pyzfs 289Summary: Python %{python_version} wrapper for libzfs_core 290Group: Development/Languages/Python 291License: Apache-2.0 292BuildArch: noarch 293Requires: libzfs5 = %{version}-%{release} 294Requires: libnvpair3 = %{version}-%{release} 295Requires: libffi 296Requires: python%{__python_pkg_version} 297 298%if 0%{?centos} == 7 299Requires: python36-cffi 300%else 301Requires: python%{__python_pkg_version}-cffi 302%endif 303 304%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} 305%if 0%{?centos} == 7 306BuildRequires: python36-packaging 307BuildRequires: python36-devel 308BuildRequires: python36-cffi 309BuildRequires: python36-setuptools 310%else 311BuildRequires: python%{__python_pkg_version}-packaging 312BuildRequires: python%{__python_pkg_version}-devel 313BuildRequires: python%{__python_pkg_version}-cffi 314BuildRequires: python%{__python_pkg_version}-setuptools 315%endif 316 317BuildRequires: libffi-devel 318%endif 319 320%description -n python%{__python_pkg_version}-pyzfs 321This package provides a python wrapper for the libzfs_core C library. 322%endif 323 324%if 0%{?_initramfs} 325%package initramfs 326Summary: Initramfs module 327Group: System Environment/Kernel 328Requires: %{name}%{?_isa} = %{version}-%{release} 329Requires: initramfs-tools 330 331%description initramfs 332This package contains a initramfs module used to construct an initramfs 333image which is ZFS aware. 334%endif 335 336%if %{with pam} 337%package -n pam_zfs_key 338Summary: PAM module for encrypted ZFS datasets 339 340%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} 341BuildRequires: pam-devel 342%endif 343 344%description -n pam_zfs_key 345This package contains the pam_zfs_key PAM module, which provides 346support for unlocking datasets on user login. 347%endif 348 349%prep 350%if %{with debug} 351 %define debug --enable-debug 352%else 353 %define debug --disable-debug 354%endif 355 356%if %{with debuginfo} 357 %define debuginfo --enable-debuginfo 358%else 359 %define debuginfo --disable-debuginfo 360%endif 361 362%if %{with asan} 363 %define asan --enable-asan 364%else 365 %define asan --disable-asan 366%endif 367 368%if %{with ubsan} 369 %define ubsan --enable-ubsan 370%else 371 %define ubsan --disable-ubsan 372%endif 373 374%if 0%{?_systemd} 375 %define systemd --enable-systemd --with-systemdunitdir=%{_unitdir} --with-systemdpresetdir=%{_presetdir} --with-systemdmodulesloaddir=%{_modulesloaddir} --with-systemdgeneratordir=%{_systemdgeneratordir} --disable-sysvinit 376 %define systemd_svcs zfs-import-cache.service zfs-import-scan.service zfs-mount.service zfs-share.service zfs-zed.service zfs.target zfs-import.target zfs-volume-wait.service zfs-volumes.target 377%else 378 %define systemd --enable-sysvinit --disable-systemd 379%endif 380 381%if %{with pyzfs} 382 %define pyzfs --enable-pyzfs 383%else 384 %define pyzfs --disable-pyzfs 385%endif 386 387%if %{with pam} 388 %define pam --enable-pam 389%else 390 %define pam --disable-pam 391%endif 392 393%setup -q 394 395%build 396%configure \ 397 --with-config=user \ 398 --with-udevdir=%{_udevdir} \ 399 --with-udevruledir=%{_udevruledir} \ 400 --with-dracutdir=%{_dracutdir} \ 401 --with-pamconfigsdir=%{_datadir}/pam-configs \ 402 --with-pammoduledir=%{_libdir}/security \ 403 --with-python=%{__python} \ 404 --with-pkgconfigdir=%{_pkgconfigdir} \ 405 --disable-static \ 406 %{debug} \ 407 %{debuginfo} \ 408 %{asan} \ 409 %{ubsan} \ 410 %{systemd} \ 411 %{pam} \ 412 %{pyzfs} 413make %{?_smp_mflags} 414 415%install 416%{__rm} -rf $RPM_BUILD_ROOT 417make install DESTDIR=%{?buildroot} 418find %{?buildroot}%{_libdir} -name '*.la' -exec rm -f {} \; 419%if 0%{!?__brp_mangle_shebangs:1} 420find %{?buildroot}%{_bindir} \ 421 \( -name arc_summary -or -name arcstat -or -name dbufstat \ 422 -or -name zilstat \) \ 423 -exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; 424find %{?buildroot}%{_datadir} \ 425 \( -name test-runner.py -or -name zts-report.py \) \ 426 -exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; 427%endif 428 429%post 430%if 0%{?_systemd} 431%if 0%{?systemd_post:1} 432%systemd_post %{systemd_svcs} 433%else 434if [ "$1" = "1" -o "$1" = "install" ] ; then 435 # Initial installation 436 systemctl preset %{systemd_svcs} >/dev/null || true 437fi 438%endif 439%else 440if [ -x /sbin/chkconfig ]; then 441 /sbin/chkconfig --add zfs-import 442 /sbin/chkconfig --add zfs-load-key 443 /sbin/chkconfig --add zfs-mount 444 /sbin/chkconfig --add zfs-share 445 /sbin/chkconfig --add zfs-zed 446fi 447%endif 448exit 0 449 450# On RHEL/CentOS 7 the static nodes aren't refreshed by default after 451# installing a package. This is the default behavior for Fedora. 452%posttrans 453%if 0%{?rhel} == 7 || 0%{?centos} == 7 454systemctl restart kmod-static-nodes 455systemctl restart systemd-tmpfiles-setup-dev 456udevadm trigger 457%endif 458 459%preun 460%if 0%{?_systemd} 461%if 0%{?systemd_preun:1} 462%systemd_preun %{systemd_svcs} 463%else 464if [ "$1" = "0" -o "$1" = "remove" ] ; then 465 # Package removal, not upgrade 466 systemctl --no-reload disable %{systemd_svcs} >/dev/null || true 467 systemctl stop %{systemd_svcs} >/dev/null || true 468fi 469%endif 470%else 471if [ "$1" = "0" -o "$1" = "remove" ] && [ -x /sbin/chkconfig ]; then 472 /sbin/chkconfig --del zfs-import 473 /sbin/chkconfig --del zfs-load-key 474 /sbin/chkconfig --del zfs-mount 475 /sbin/chkconfig --del zfs-share 476 /sbin/chkconfig --del zfs-zed 477fi 478%endif 479exit 0 480 481%postun 482%if 0%{?_systemd} 483%if 0%{?systemd_postun:1} 484%systemd_postun %{systemd_svcs} 485%else 486systemctl --system daemon-reload >/dev/null || true 487%endif 488%endif 489 490%files 491# Core utilities 492%{_sbindir}/* 493%{_bindir}/raidz_test 494%{_sbindir}/zgenhostid 495%{_bindir}/zvol_wait 496# Optional Python 3 scripts 497%{_bindir}/arc_summary 498%{_bindir}/arcstat 499%{_bindir}/dbufstat 500%{_bindir}/zilstat 501# Man pages 502%{_mandir}/man1/* 503%{_mandir}/man4/* 504%{_mandir}/man5/* 505%{_mandir}/man7/* 506%{_mandir}/man8/* 507# Configuration files and scripts 508%{_libexecdir}/%{name} 509%{_udevdir}/vdev_id 510%{_udevdir}/zvol_id 511%{_udevdir}/rules.d/* 512%{_datadir}/%{name}/compatibility.d 513%if ! 0%{?_systemd} || 0%{?_initramfs} 514# Files needed for sysvinit and initramfs-tools 515%{_sysconfdir}/%{name}/zfs-functions 516%config(noreplace) %{_initconfdir}/zfs 517%else 518%exclude %{_sysconfdir}/%{name}/zfs-functions 519%exclude %{_initconfdir}/zfs 520%endif 521%if 0%{?_systemd} 522%{_unitdir}/* 523%{_presetdir}/* 524%{_modulesloaddir}/* 525%{_systemdgeneratordir}/* 526%else 527%config(noreplace) %{_sysconfdir}/init.d/* 528%endif 529%config(noreplace) %{_sysconfdir}/%{name}/zed.d/* 530%config(noreplace) %{_sysconfdir}/%{name}/zpool.d/* 531%config(noreplace) %{_sysconfdir}/%{name}/vdev_id.conf.*.example 532%attr(440, root, root) %config(noreplace) %{_sysconfdir}/sudoers.d/* 533 534%config(noreplace) %{_bashcompletiondir}/zfs 535 536%files -n libzpool5 537%{_libdir}/libzpool.so.* 538 539%files -n libnvpair3 540%{_libdir}/libnvpair.so.* 541 542%files -n libuutil3 543%{_libdir}/libuutil.so.* 544 545%files -n libzfs5 546%{_libdir}/libzfs*.so.* 547 548%files -n libzfs5-devel 549%{_pkgconfigdir}/libzfs.pc 550%{_pkgconfigdir}/libzfsbootenv.pc 551%{_pkgconfigdir}/libzfs_core.pc 552%{_libdir}/*.so 553%{_includedir}/* 554%doc AUTHORS COPYRIGHT LICENSE NOTICE README.md 555 556%files test 557%{_datadir}/%{name}/zfs-tests 558%{_datadir}/%{name}/test-runner 559%{_datadir}/%{name}/runfiles 560%{_datadir}/%{name}/*.sh 561 562%files dracut 563%doc contrib/dracut/README.md 564%{_dracutdir}/modules.d/* 565 566%if %{with pyzfs} 567%files -n python%{__python_pkg_version}-pyzfs 568%doc contrib/pyzfs/README 569%doc contrib/pyzfs/LICENSE 570%defattr(-,root,root,-) 571%{__python_sitelib}/libzfs_core/* 572%{__python_sitelib}/pyzfs* 573%endif 574 575%if 0%{?_initramfs} 576%files initramfs 577%doc contrib/initramfs/README.md 578/usr/share/initramfs-tools/* 579%else 580# Since we're not building the initramfs package, 581# ignore those files. 582%exclude /usr/share/initramfs-tools 583%endif 584 585%if %{with pam} 586%files -n pam_zfs_key 587%{_libdir}/security/* 588%{_datadir}/pam-configs/* 589%endif 590