xref: /freebsd/sys/contrib/openzfs/rpm/generic/zfs-kmod.spec.in (revision dd21556857e8d40f66bf5ad54754d9d52669ebf7)
1eda14cbcSMatt Macy%define module  @PACKAGE@
2eda14cbcSMatt Macy
3eda14cbcSMatt Macy%if !%{defined ksrc}
4bb2d13b6SMartin Matuska%if 0%{?rhel}%{?fedora}%{?openEuler}
5eda14cbcSMatt Macy%define ksrc    ${kernel_version##*___}
6eda14cbcSMatt Macy%else
7eda14cbcSMatt Macy%define ksrc    "$( \
8eda14cbcSMatt Macy        if [ -e "/usr/src/linux-${kernel_version%%___*}" ]; then \
9eda14cbcSMatt Macy            echo "/usr/src/linux-${kernel_version%%___*}"; \
10eda14cbcSMatt Macy        elif [ -e "/lib/modules/${kernel_version%%___*}/source" ]; then \
11eda14cbcSMatt Macy            echo "/lib/modules/${kernel_version%%___*}/source"; \
12eda14cbcSMatt Macy        else \
13eda14cbcSMatt Macy            echo "/lib/modules/${kernel_version%%___*}/build"; \
14eda14cbcSMatt Macy        fi)"
15eda14cbcSMatt Macy%endif
16eda14cbcSMatt Macy%endif
17eda14cbcSMatt Macy
18eda14cbcSMatt Macy%if !%{defined kobj}
19bb2d13b6SMartin Matuska%if 0%{?rhel}%{?fedora}%{?openEuler}
20eda14cbcSMatt Macy%define kobj    ${kernel_version##*___}
21eda14cbcSMatt Macy%else
22eda14cbcSMatt Macy%define kobj    "$( \
23eda14cbcSMatt Macy        if [ -e "/usr/src/linux-${kernel_version%%___*}" ]; then \
24eda14cbcSMatt Macy            echo "/usr/src/linux-${kernel_version%%___*}"; \
25eda14cbcSMatt Macy        else \
26eda14cbcSMatt Macy            echo "/lib/modules/${kernel_version%%___*}/build"; \
27eda14cbcSMatt Macy        fi)"
28eda14cbcSMatt Macy%endif
29eda14cbcSMatt Macy%endif
30eda14cbcSMatt Macy
31eda14cbcSMatt Macy#define repo    rpmfusion
32eda14cbcSMatt Macy#define repo    chaos
33eda14cbcSMatt Macy
34eda14cbcSMatt Macy# (un)define the next line to either build for the newest or all current kernels
35eda14cbcSMatt Macy%define buildforkernels newest
36eda14cbcSMatt Macy#define buildforkernels current
37eda14cbcSMatt Macy#define buildforkernels akmod
38eda14cbcSMatt Macy
39eda14cbcSMatt Macy%bcond_with     debug
40eda14cbcSMatt Macy%bcond_with     debuginfo
41eda14cbcSMatt Macy
42eda14cbcSMatt Macy
43eda14cbcSMatt MacyName:           %{module}-kmod
44eda14cbcSMatt Macy
45eda14cbcSMatt MacyVersion:        @VERSION@
46eda14cbcSMatt MacyRelease:        @RELEASE@%{?dist}
47eda14cbcSMatt MacySummary:        Kernel module(s)
48eda14cbcSMatt Macy
49eda14cbcSMatt MacyGroup:          System Environment/Kernel
50eda14cbcSMatt MacyLicense:        @ZFS_META_LICENSE@
51180f8225SMatt MacyURL:            https://github.com/openzfs/zfs
52eda14cbcSMatt MacySource0:        %{module}-%{version}.tar.gz
53eda14cbcSMatt MacySource10:       kmodtool
54eda14cbcSMatt MacyBuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id} -u -n)
55bb2d13b6SMartin Matuska%if 0%{?rhel}%{?fedora}%{?openEuler}
56eda14cbcSMatt MacyBuildRequires:  gcc, make
57eda14cbcSMatt MacyBuildRequires:  elfutils-libelf-devel
58eda14cbcSMatt Macy%endif
59eda14cbcSMatt Macy
60bb2d13b6SMartin Matuska%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9)
613ff01b23SMartin Matuska# We don't directly use it, but if this isn't installed, rpmbuild as root can
623ff01b23SMartin Matuska# crash+corrupt rpmdb
633ff01b23SMartin Matuska# See issue #12071
643ff01b23SMartin MatuskaBuildRequires:  ncompress
653ff01b23SMartin Matuska%endif
663ff01b23SMartin Matuska
67eda14cbcSMatt Macy# The developments headers will conflict with the dkms packages.
68eda14cbcSMatt MacyConflicts:      %{module}-dkms
69eda14cbcSMatt Macy
70eda14cbcSMatt Macy%if %{defined repo}
71eda14cbcSMatt Macy
72eda14cbcSMatt Macy# Building for a repository use the proper build-sysbuild package
73eda14cbcSMatt Macy# to determine which kernel-devel packages should be installed.
74eda14cbcSMatt MacyBuildRequires:  %{_bindir}/kmodtool
75eda14cbcSMatt Macy%{!?kernels:BuildRequires: buildsys-build-%{repo}-kerneldevpkgs-%{?buildforkernels:%{buildforkernels}}%{!?buildforkernels:current}-%{_target_cpu}}
76eda14cbcSMatt Macy
77eda14cbcSMatt Macy%else
78eda14cbcSMatt Macy
79eda14cbcSMatt Macy# Building local packages attempt to to use the installed kernel.
80eda14cbcSMatt Macy%{?rhel:BuildRequires: kernel-devel}
81eda14cbcSMatt Macy%{?fedora:BuildRequires: kernel-devel}
82bb2d13b6SMartin Matuska%{?openEuler:BuildRequires: kernel-devel}
83eda14cbcSMatt Macy%{?suse_version:BuildRequires: kernel-source}
84eda14cbcSMatt Macy
85eda14cbcSMatt Macy%if !%{defined kernels} && !%{defined build_src_rpm}
86bb2d13b6SMartin Matuska    %if 0%{?rhel}%{?fedora}%{?suse_version}%{?openEuler}
87eda14cbcSMatt Macy        %define kernels %(ls -1 /usr/src/kernels)
88eda14cbcSMatt Macy    %else
89eda14cbcSMatt Macy        %define kernels %(ls -1 /lib/modules)
90eda14cbcSMatt Macy    %endif
91eda14cbcSMatt Macy%endif
92eda14cbcSMatt Macy%endif
93eda14cbcSMatt Macy
94eda14cbcSMatt Macy# LDFLAGS are not sanitized by arch/*/Makefile for these architectures.
95eda14cbcSMatt Macy%ifarch ppc ppc64 ppc64le aarch64
96eda14cbcSMatt Macy%global __global_ldflags %{nil}
97eda14cbcSMatt Macy%endif
98eda14cbcSMatt Macy
99eda14cbcSMatt Macy# Kmodtool does its magic here.  A patched version of kmodtool is shipped
100eda14cbcSMatt Macy# with the source rpm until kmod development packages are supported upstream.
101eda14cbcSMatt Macy# https://bugzilla.rpmfusion.org/show_bug.cgi?id=2714
102e3aa18adSMartin Matuska%{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) }
103eda14cbcSMatt Macy
104eda14cbcSMatt Macy
105eda14cbcSMatt Macy%description
106eda14cbcSMatt MacyThis package contains the ZFS kernel modules.
107eda14cbcSMatt Macy
108eda14cbcSMatt Macy%prep
109eda14cbcSMatt Macy# Error out if there was something wrong with kmodtool.
110eda14cbcSMatt Macy%{?kmodtool_check}
111eda14cbcSMatt Macy
112eda14cbcSMatt Macy# Print kmodtool output for debugging purposes:
113e3aa18adSMartin Matuskabash %{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
114eda14cbcSMatt Macy
115eda14cbcSMatt Macy%if %{with debug}
116eda14cbcSMatt Macy    %define debug --enable-debug
117eda14cbcSMatt Macy%else
118eda14cbcSMatt Macy    %define debug --disable-debug
119eda14cbcSMatt Macy%endif
120eda14cbcSMatt Macy
121eda14cbcSMatt Macy%if %{with debuginfo}
122eda14cbcSMatt Macy    %define debuginfo --enable-debuginfo
123eda14cbcSMatt Macy%else
124eda14cbcSMatt Macy    %define debuginfo --disable-debuginfo
125eda14cbcSMatt Macy%endif
126eda14cbcSMatt Macy
127eda14cbcSMatt Macy# Leverage VPATH from configure to avoid making multiple copies.
128eda14cbcSMatt Macy%define _configure ../%{module}-%{version}/configure
129eda14cbcSMatt Macy
130eda14cbcSMatt Macy%setup -q -c -T -a 0
131eda14cbcSMatt Macy
132eda14cbcSMatt Macyfor kernel_version in %{?kernel_versions}; do
133eda14cbcSMatt Macy    %{__mkdir} _kmod_build_${kernel_version%%___*}
134eda14cbcSMatt Macydone
135eda14cbcSMatt Macy
136eda14cbcSMatt Macy%build
137eda14cbcSMatt Macyfor kernel_version in %{?kernel_versions}; do
138eda14cbcSMatt Macy    cd _kmod_build_${kernel_version%%___*}
139eda14cbcSMatt Macy    %configure \
140eda14cbcSMatt Macy        --with-config=kernel \
141eda14cbcSMatt Macy        --with-linux=%{ksrc} \
142eda14cbcSMatt Macy        --with-linux-obj=%{kobj} \
143eda14cbcSMatt Macy        %{debug} \
144c03c5b1cSMartin Matuska        %{debuginfo} \
145c03c5b1cSMartin Matuska        %{?kernel_cc} \
146c03c5b1cSMartin Matuska        %{?kernel_ld} \
147*dd215568SMartin Matuska        %{?kernel_llvm} \
148*dd215568SMartin Matuska        %{?kernel_cross_compile} \
149*dd215568SMartin Matuska        %{?kernel_arch}
150e2df9bb4SMartin Matuska
151e2df9bb4SMartin Matuska    # Pre-6.10 kernel builds didn't need to copy over the source files to the
152e2df9bb4SMartin Matuska    # build directory.  However we do need to do it though post-6.10 due to
153e2df9bb4SMartin Matuska    # these commits:
154e2df9bb4SMartin Matuska    #
155e2df9bb4SMartin Matuska    # b1992c3772e6 kbuild: use $(src) instead of $(srctree)/$(src) for source
156e2df9bb4SMartin Matuska    #                      directory
157e2df9bb4SMartin Matuska    #
158e2df9bb4SMartin Matuska    # 9a0ebe5011f4 kbuild: use $(obj)/ instead of $(src)/ for common pattern
159e2df9bb4SMartin Matuska    #                      rules
160e2df9bb4SMartin Matuska    #
161e2df9bb4SMartin Matuska    # Note that kmodtool actually copies over the source into the build
162e2df9bb4SMartin Matuska    # directory, so what we're doing here is normal.  For efficiency reasons
163e2df9bb4SMartin Matuska    # though we just use hardlinks instead of copying.
164e2df9bb4SMartin Matuska    #
165e2df9bb4SMartin Matuska    # See https://github.com/openzfs/zfs/issues/16439 for more info.
166e2df9bb4SMartin Matuska    cp -lR ../%{module}-%{version}/module/* module/
167e2df9bb4SMartin Matuska
168eda14cbcSMatt Macy    make %{?_smp_mflags}
169eda14cbcSMatt Macy    cd ..
170eda14cbcSMatt Macydone
171eda14cbcSMatt Macy
172eda14cbcSMatt Macy
17378ae60b4SMartin Matuska# Module signing (modsign)
17478ae60b4SMartin Matuska#
17578ae60b4SMartin Matuska# This must be run _after_ find-debuginfo.sh runs, otherwise that will strip
17678ae60b4SMartin Matuska# the signature off of the modules.
17778ae60b4SMartin Matuska# (Based on Fedora's kernel.spec workaround)
17878ae60b4SMartin Matuska%define __modsign_install_post \
17978ae60b4SMartin Matuska    sign_pem="%{ksrc}/certs/signing_key.pem"; \
18078ae60b4SMartin Matuska    sign_x509="%{ksrc}/certs/signing_key.x509"; \
18178ae60b4SMartin Matuska    if [ -f "${sign_x509}" ]\
18278ae60b4SMartin Matuska    then \
18378ae60b4SMartin Matuska        echo "Signing kernel modules ..."; \
18478ae60b4SMartin Matuska        for kmod in $(find ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/ -name \*.ko); do \
18578ae60b4SMartin Matuska            %{ksrc}/scripts/sign-file sha256 ${sign_pem} ${sign_x509} ${kmod}; \
18678ae60b4SMartin Matuska        done \
18778ae60b4SMartin Matuska    fi \
18878ae60b4SMartin Matuska%{nil}
18978ae60b4SMartin Matuska
19078ae60b4SMartin Matuska# hack to ensure signing happens after find-debuginfo.sh runs
19178ae60b4SMartin Matuska%define __spec_install_post \
19278ae60b4SMartin Matuska    %{?__debug_package:%{__debug_install_post}}\
19378ae60b4SMartin Matuska    %{__arch_install_post}\
19478ae60b4SMartin Matuska    %{__os_install_post}\
19578ae60b4SMartin Matuska    %{__modsign_install_post}
19678ae60b4SMartin Matuska
197eda14cbcSMatt Macy%install
198eda14cbcSMatt Macyrm -rf ${RPM_BUILD_ROOT}
199eda14cbcSMatt Macy
200eda14cbcSMatt Macy# Relies on the kernel 'modules_install' make target.
201eda14cbcSMatt Macyfor kernel_version in %{?kernel_versions}; do
202eda14cbcSMatt Macy    cd _kmod_build_${kernel_version%%___*}
203eda14cbcSMatt Macy    make install \
204eda14cbcSMatt Macy        DESTDIR=${RPM_BUILD_ROOT} \
205eda14cbcSMatt Macy        %{?prefix:INSTALL_MOD_PATH=%{?prefix}} \
206eda14cbcSMatt Macy        INSTALL_MOD_DIR=%{kmodinstdir_postfix}
207eda14cbcSMatt Macy    cd ..
208eda14cbcSMatt Macydone
209eda14cbcSMatt Macy# find-debuginfo.sh only considers executables
210716fd348SMartin Matuskachmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/*
211eda14cbcSMatt Macy%{?akmod_install}
212eda14cbcSMatt Macy
213eda14cbcSMatt Macy
214eda14cbcSMatt Macy%clean
215eda14cbcSMatt Macyrm -rf $RPM_BUILD_ROOT
216