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