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