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