DKMS operations should be tied to kernel-<...>-devel packages

Before this commit, DKMS was called to build and install the external
kernel modules when kernel-<flavour> packages were installed, and
only if the development files were also available.

This is error-prone because there is no guarantee the -devel package
creates the necessary files before. As a result, some proprietary
drivers could not be built when the kernel is updated.

This is an attempt to fix the problem. Because kernel-<flavour>-devel
package is enough to build kernel modules with DKMS, I moved these build
and install operations to kernel-<flavour>-devel from kernel-<flavour>.
Some of the related code was simplified as well.
This commit is contained in:
Eugene Shatokhin 2015-04-21 15:35:28 +03:00
parent c0342f35bc
commit 3e9fece6bd

View file

@ -355,7 +355,7 @@ Source51: cpupower.config
Source52: cpupower-start.sh
Source53: cpupower.path
# Our patch tarball,
# Our patch tarball,
# see https://abf.rosalinux.ru/soft/kernel-patches-and-configs/
Source100: kernel-patches-and-configs-%{kversion}.tar.xz
@ -375,8 +375,8 @@ Patch2: ftp://ftp.kernel.org/pub/linux/kernel/v%{kernelversion}.x/stable-review
Source11: ftp://ftp.kernel.org/pub/linux/kernel/v%{kernelversion}.x/stable-review/patch-%{kversion}-%{kpatch}.sign
%else
Patch1: ftp://ftp.kernel.org/pub/linux/kernel/v%{kernelversion}.x/testing/patch-%{kernelversion}.%{patchlevel}-%{kpatch}.xz
Source10: ftp://ftp.kernel.org/pub/linux/kernel/v%{kernelversion}.x/testing/patch-%{kernelversion}.%{patchlevel}-%{kpatch}.sign
%endif
Source10: ftp://ftp.kernel.org/pub/linux/kernel/v%{kernelversion}.x/testing/patch-%{kernelversion}.%{patchlevel}-%{kpatch}.sign
%endif
%endif
%if %kgit
Patch2: ftp://ftp.kernel.org/pub/linux/kernel/v%{kernelversion}.x/snapshots/patch-%{kernelversion}.%{patchlevel}-%{kpatch}-git%{kgit}.xz
@ -532,7 +532,9 @@ Group: System/Kernel and hardware \
Version: %{fakever} \
Release: %{fakerel} \
Requires: glibc-devel ncurses-devel make gcc perl \
Summary: The kernel-devel files for %{kname}-%{1}-%{buildrel} \
Requires(post): dkms \
Requires(preun): dkms \
Summary: Development files for %{kname}-%{1}-%{buildrel} \
Group: Development/Kernel \
Provides: %{kname}-devel = %{kverrel} \
Provides: %{kname}-%{1}-devel \
@ -603,7 +605,6 @@ latest %{kname}-%{1}-devel installed... \
%endif \
\
%post -n %{kname}-%{1}-%{buildrel} -f kernel_files.%{1}-post \
%posttrans -n %{kname}-%{1}-%{buildrel} -f kernel_files.%{1}-posttrans \
%preun -n %{kname}-%{1}-%{buildrel} -f kernel_files.%{1}-preun \
%postun -n %{kname}-%{1}-%{buildrel} -f kernel_files.%{1}-postun \
\
@ -908,7 +909,7 @@ full preempt, rcu boost, CFS cpu scheduler and BFQ i/o scheduler.
#
%ifarch %{ix86}
#
# kernel-nrj-desktop-core2: nrj, Intel Core 2 and newer, smp-alternatives, 4 GB
# kernel-nrj-desktop-core2: nrj, Intel Core 2 and newer, smp-alternatives, 4 GB
#
%if %build_nrj_desktop_core2
%define summary_nrj_desktop_core2 Linux Kernel for desktop use with i686 & 4GB RAM
@ -1178,7 +1179,7 @@ PrepareKernel() {
config_dir=arch/arm64/configs
%endif
echo "Make config for kernel $extension"
pushd 3rdparty
perl mkbuild.pl
popd
@ -1237,7 +1238,7 @@ BuildKernel() {
install -d %{temp_modules}/$KernelVer
%smake INSTALL_MOD_PATH=%{temp_root} KERNELRELEASE=$KernelVer modules_install
# headers
# headers
%make INSTALL_HDR_PATH=%{temp_root}%{_prefix} KERNELRELEASE=$KernelVer headers_install
find %{temp_root}%{_prefix} -name .install -or -name ..install.cmd | %kxargs rm -f
@ -1248,7 +1249,8 @@ BuildKernel() {
SaveDevel() {
devel_flavour=$1
DevelRoot=/usr/src/linux-%{kversion}-$devel_flavour-%{buildrpmrel}
KernelVer=%{kversion}-$devel_flavour-%{buildrpmrel}
DevelRoot=/usr/src/linux-$KernelVer
TempDevelRoot=%{temp_root}$DevelRoot
mkdir -p $TempDevelRoot
@ -1328,6 +1330,12 @@ SaveDevel() {
# disable mrproper in -devel rpms
patch -p1 --fuzz=0 -d $TempDevelRoot -i %{SOURCE2}
# Create the symlinks needed by DKMS
ModulesRoot=%{temp_modules}/$KernelVer
mkdir -p $ModulesRoot
ln -sf $DevelRoot $ModulesRoot/build
ln -sf $DevelRoot $ModulesRoot/source
kernel_devel_files=../kernel_devel_files.$devel_flavour
@ -1398,33 +1406,31 @@ $DevelRoot/Makefile
$DevelRoot/Module.symvers
$DevelRoot/arch/Kconfig
%doc README.kernel-sources
%{_modulesdir}/$KernelVer/build
%{_modulesdir}/$KernelVer/source
EOF
### Create -devel Post script on the fly
cat > $kernel_devel_files-post <<EOF
if [ -d /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel} ]; then
rm -f /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel}/{build,source}
ln -sf $DevelRoot /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel}/build
ln -sf $DevelRoot /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel}/source
fi
/usr/sbin/dkms_autoinstaller start $KernelVer
EOF
### Create -devel Preun script on the fly
cat > $kernel_devel_files-preun <<EOF
if [ -L /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel}/build ]; then
rm -f /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel}/build
fi
if [ -L /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel}/source ]; then
rm -f /lib/modules/%{kversion}-$devel_flavour-%{buildrpmrel}/source
fi
exit 0
for ii in \$(/usr/sbin/dkms status -k $KernelVer); do
mod=\$(echo \$ii | awk -v FS=' ,' '{ print \$1; }')
ver=\$(echo \$ii | awk -v FS=' ,' '{ print \$2; }')
/usr/sbin/dkms --rpm_safe_upgrade remove -m \$mod -v \$ver -k $KernelVer || true
done
EOF
### Create -devel Postun script on the fly
cat > $kernel_devel_files-postun <<EOF
rm -rf /usr/src/linux-%{kversion}-$devel_flavour-%{buildrpmrel} >/dev/null
rm -rf /usr/src/linux-$KernelVer >/dev/null
# Remove the dir if it is already empty.
find /lib/modules/$KernelVer -maxdepth 0 -empty -exec rm -rf {} \;
EOF
}
@ -1460,6 +1466,7 @@ SaveDebug() {
CreateFiles() {
kernel_flavour=$1
KernelVer=%{kversion}-$kernel_flavour-%{buildrpmrel}
kernel_files=../kernel_files.$kernel_flavour
@ -1469,13 +1476,12 @@ if [ "$kernel_flavour" = "kirkwood" ]; then
fi
### Create the kernel_files.*
cat > $kernel_files <<EOF
%{_bootdir}/System.map-%{kversion}-$kernel_flavour-%{buildrpmrel}
%{_bootdir}/symvers-%{kversion}-$kernel_flavour-%{buildrpmrel}.xz
%{_bootdir}/config-%{kversion}-$kernel_flavour-%{buildrpmrel}
%{_bootdir}/$ker-%{kversion}-$kernel_flavour-%{buildrpmrel}
%dir %{_modulesdir}/%{kversion}-$kernel_flavour-%{buildrpmrel}/
%{_modulesdir}/%{kversion}-$kernel_flavour-%{buildrpmrel}/kernel
%{_modulesdir}/%{kversion}-$kernel_flavour-%{buildrpmrel}/modules.*
%{_bootdir}/System.map-$KernelVer
%{_bootdir}/symvers-$KernelVer.xz
%{_bootdir}/config-$KernelVer
%{_bootdir}/$ker-$KernelVer
%{_modulesdir}/$KernelVer/kernel
%{_modulesdir}/$KernelVer/modules.*
%doc README.kernel-sources
EOF
@ -1485,11 +1491,10 @@ EOF
### Create kernel Post script
cat > $kernel_files-post <<EOF
KVER=%{kversion}-$kernel_flavour-%{buildrpmrel}
INITRD=/boot/initrd-\${KVER}.img
INITRD=/boot/initrd-$KernelVer.img
if [ ! -e \${INITRD} ]; then
/sbin/dracut \${INITRD} \${KVER}
/sbin/dracut \${INITRD} $KernelVer
else
printf "WARNING: Initrd image \${INITRD} already exists and will not be replaced.\n"
fi
@ -1499,41 +1504,22 @@ pushd /boot > /dev/null
if [ -L vmlinuz-$kernel_flavour ]; then
rm -f vmlinuz-$kernel_flavour
fi
#ln -sf vmlinuz-\${KVER} vmlinuz-$kernel_flavour
if [ -L initrd-$kernel_flavour.img ]; then
rm -f initrd-$kernel_flavour.img
fi
#ln -sf initrd-\${KVER}.img initrd-$kernel_flavour.img
popd > /dev/null
%if %build_devel
# create kernel-devel symlinks if matching -devel- rpm is installed
if [ -d /usr/src/linux-\${KVER} ]; then
rm -f /lib/modules/\${KVER}/{build,source}
ln -sf /usr/src/linux-\${KVER} /lib/modules/\${KVER}/build
ln -sf /usr/src/linux-\${KVER} /lib/modules/\${KVER}/source
fi
%endif
EOF
### Create kernel Posttrans script
cat > $kernel_files-posttrans <<EOF
if [ -x /usr/sbin/dkms_autoinstaller -a -d /usr/src/linux-%{kversion}-$kernel_flavour-%{buildrpmrel} ]; then
/usr/sbin/dkms_autoinstaller start %{kversion}-$kernel_flavour-%{buildrpmrel}
fi
EOF
### Create kernel Preun script on the fly
cat > $kernel_files-preun <<EOF
KVER=%{kversion}-$kernel_flavour-%{buildrpmrel}
pushd /boot > /dev/null
if [ -L vmlinuz-$kernel_flavour ]; then
if [ "\$(readlink vmlinuz-$kernel_flavour)" = "vmlinuz-\${KVER}" ]; then
if [ "\$(readlink vmlinuz-$kernel_flavour)" = "vmlinuz-$KernelVer" ]; then
rm -f vmlinuz-$kernel_flavour
fi
fi
if [ -L initrd-$kernel_flavour.img ]; then
if [ "\$(readlink initrd-$kernel_flavour.img)" = "initrd-\${KVER}.img" ]; then
if [ "\$(readlink initrd-$kernel_flavour.img)" = "initrd-$KernelVer.img" ]; then
rm -f initrd-$kernel_flavour.img
fi
fi
@ -1541,35 +1527,18 @@ fi
/usr/sbin/update-grub2
popd > /dev/null
%if %build_devel
if [ -L /lib/modules/\${KVER}/build ]; then
rm -f /lib/modules/\${KVER}/build
fi
if [ -L /lib/modules/\${KVER}/source ]; then
rm -f /lib/modules/\${KVER}/source
fi
%endif
exit 0
EOF
### Create kernel Postun script on the fly
cat > $kernel_files-postun <<EOF
KVER=%{kversion}-$kernel_flavour-%{buildrpmrel}
KVER_DEVEL=%{kversion}-$devel_flavour-%{buildrpmrel}
rm -f /boot/initrd-\${KVER}.img
rm -f /boot/initrd-\${KVER}_old.img
rm -rf /lib/modules/\${KVER} >/dev/null
if [ -d /var/lib/dkms ]; then
rm -f /var/lib/dkms/*/kernel-\${KVER_DEVEL}-%{_target_cpu} >/dev/null
rm -rf /var/lib/dkms/*/*/\${KVER_DEVEL} >/dev/null
rm -f /var/lib/dkms-binary/*/kernel-\${KVER_DEVEL}-%{_target_cpu} >/dev/null
rm -rf /var/lib/dkms-binary/*/*/\${KVER_DEVEL} >/dev/null
fi
rm -f /boot/initrd-$KernelVer.img
rm -f /boot/initrd-$KernelVer_old.img
# Remove /lib/modules/<...>/ if it is empty (-devel uses it too).
find /lib/modules/$KernelVer -maxdepth 0 -empty -exec rm -rf {} \;
EOF
}
CreateKernel() {
flavour=$1
@ -1800,12 +1769,6 @@ find %{target_modules} -name "*.ko" | %kxargs xz -6e
find %{target_modules} -name "*.ko" | %kxargs gzip -9
%endif
# We used to have a copy of PrepareKernel here
# Now, we make sure that the thing in the linux dir is what we want it to be
for i in %{target_modules}/*; do
rm -f $i/build $i/source
done
# sniff, if we compressed all the modules, we change the stamp :(
# we really need the depmod -ae here
pushd %{target_modules}