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