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