Make different builds of nvidia modules packages not conflict by files

This commit is contained in:
Mikhail Novosyolov 2022-09-14 12:09:59 +03:00
parent ce61ac233b
commit 34a69ebc4a
3 changed files with 56 additions and 20 deletions

View file

@ -70,6 +70,7 @@ Generators of RPM provides for proprietary Nvidia drivers
%package rpm-macros
Summary: RPM macros for packaging of binary kernel modules for Nvidia drivers
Requires: coreutils
Requires: gawk
%description rpm-macros
RPM macros for packaging of binary kernel modules for Nvidia drivers

View file

@ -5,8 +5,42 @@
# Unfortunately, if we generate release inside %%kroko_kmod_pkg, every usage of
# a macro with it will cause its regeneration, so it may be incosistent across one package.
# Usage example:
# %%define kroko_release %%kroko_mk_release -n %%{NAME}
# %%kroko_kmod_pkg -r %%kroko_mk_release <...>
%kroko_mk_release %(echo $(( $(date +%%s) - $(date -d "Mon Sep 12 00:00:00 MSK 2022" +%%s) ))).%(printf "%%d" "'$(head -c1 /dev/urandom | base64)")
%kroko_mk_release(n:) %(echo $(( $(date +%%s) - $(date -d "Sep 12 00:00:00 MSK 2022" +%%s) ))).%(printf "%%d" "'$(head -c1 /dev/urandom | base64)").%(echo %{-n*} | sha1sum | head -c5)
# Usage:
# %%kroko_swap_numbers -n <number>
# Example input: 123456789
# Example output: 987654321
%kroko_swap_numbers(n:) %(set -e; \
n=%{-n*} \
o="" \
for (( i = 0; i < ${#n}; i++ )) \
do \
a=${n:$i:1} \
if [ $a = 1 ]; then b=9; fi \
if [ $a = 2 ]; then b=8; fi \
if [ $a = 3 ]; then b=7; fi \
if [ $a = 4 ]; then b=6; fi \
if [ $a = 5 ]; then b=5; fi \
if [ $a = 6 ]; then b=4; fi \
if [ $a = 7 ]; then b=3; fi \
if [ $a = 8 ]; then b=2; fi \
if [ $a = 9 ]; then b=1; fi \
o=${o}${b} \
done \
echo $o
)
# mdf - module directory suffix
# depmod order is non-human:
# nvidia510.20 will have more priority than nvidia510.30, but
# nvidia510.100 will have more priority than nvidia510.20
# We need to give higher priority to a newer build: reverse (swap) numbers to achieve this.
# -r is value generated with %%kroko_mk_release
%kroko_mk_mdf(r:) %{kroko_swap_numbers -n %(echo %{-r*} | awk -F '.' '{print $1}')}.%(echo %{-r*} | awk -F '.' '{print $2 "." $3}')
# r - Release, generated using %%kroko_mk_release
# j - major Nvidia version (e.g. 390 from full version 390.13)
@ -17,39 +51,39 @@
# p - full kernel version (uname -r), e.g.: 5.10.71-generic-1rosa2021.1-x86_64)
# s - source package name (e.g.: nvidia390, kernel-5.10-generic)
# c - module compression (.zst, .xz, .gz or "")
%kroko_kmod_pkg(r:j:n:f:k:m:p:s:c:) \
# d - suffix generated with %%kroko_mk_mdf
%kroko_kmod_pkg(r:j:n:f:k:m:p:s:c:d:) \
# e.g.: kernel-modules-nvidia390-5.10-generic \
%define pkg kernel-modules-nvidia%{-j*}-%{-k*}-%{-f*} \
%define rel %{-r*}.%(echo %{-s*} | sha1sum | head -c5) \
\
%{expand: \
%package -n %{pkg} \
Summary: Binary modules of Nvidia %{-j*}.%{-n*} for kernel-%{-k*}-%{-f*} \
Group: System/Kernel and hardware \
Version: %{-j*}.%{-n*} \
Release: %{rel} \
Release: %{-r*} \
Supplements: (kernel-%{-k*}-%{-f*} and nvidia%{-j*}) \
Provides: installonlypkg(kernel) = %{-k*}.%{-m*}.module \
# e.g.: kmod-nvidia390.13-kabi(5.10.71-generic-1rosa2021.1-x86_64) = 456.2e9d1.15 \
Provides: kmod-nvidia%{-j*}.%{-n*}-kabi(%{-p*}) = %{rel} \
Provides: kmod-nvidia%{-j*}-kabi(%{-p*}) = %{rel} \
Provides: kmod-nvidia%{-j*}.%{-n*}-kabi(%{-p*}) = %{-r*} \
Provides: kmod-nvidia%{-j*}-kabi(%{-p*}) = %{-r*} \
# e.g.: kmod-nvidia390-kabi(5.10.71-generic-1rosa2021.1-x86_64) = 456.2e9d1.15 \
# Do not keep older builds for the same kernel installed via installonlypkg() \
# () and provides are not allowed in Obsoletes, only real package names work as Obsoletes, \
# so we can't write: "Obsoletes: kmod-nvidia%{-j*}.%{-n*}-kabi(%{-p*}) < %{rel}" \\
# so we can't write: "Obsoletes: kmod-nvidia%{-j*}.%{-n*}-kabi(%{-p*}) < %{-r*}" \\
# XXX Without Obsoletes for now, otherwise modules for e.g. 5.10.71 will be removed when updating to 5.10.72 \
#Obsoletes: %{pkg} < %{-j*}.%{-n*}-%{rel} \
#Obsoletes: %{pkg} < %{-j*}.%{-n*}-%{-r*} \
# the same files conflict \
#Conflicts: kmod-nvidia%{-j*}.%{-n*}-kabi(%{-p*}) < %{rel} \
#Conflicts: kmod-nvidia%{-j*}.%{-n*}-kabi(%{-p*}) < %{-r*} \
# e.g.: kmod-nvidia-5.10-generic(390.13) = 456.2e9d1.15 \
Provides: kmod-nvidia-%{-k*}-%{-f*}(%{-j*}.%{-n*}) = %{rel} \
Provides: kmod-nvidia-%{-k*}-%{-f*}(%{-j*}.%{-n*}) = %{-r*}0 \
Requires: kernel-abi(%{-p*}) \
%description -n %{pkg} \
Binary modules of Nvidia %{-j*}.%{-n*} for kernel-%{-k*}-%{-f*} \
Built from %{-s*} \
%files -n %{pkg} \
%dir /lib/modules/%{-p*}/kernel/drivers/video/nvidia%{-j*} \
/lib/modules/%{-p*}/kernel/drivers/video/nvidia%{-j*}/*.ko%{-c*} \
%dir /lib/modules/%{-p*}/kernel/drivers/video/nvidia%{-j*}.%{-d*} \
/lib/modules/%{-p*}/kernel/drivers/video/nvidia%{-j*}.%{-d*}/*.ko%{-c*} \
%{nil} \
}

View file

@ -1,6 +1,8 @@
# Test macros for creating RPM packages
%define kroko_release %kroko_mk_release
%{load:macros.krokodil}
%global kroko_release %kroko_mk_release -n %{NAME}
%global kroko_mdf %kroko_mk_mdf -r %{kroko_release}
Name: kroko-test
Summary: Test autokrokodil macros
@ -9,8 +11,6 @@ Release: 0
License: GPLv3
Group: System/Kernel and hardware
%{load:macros.krokodil}
%description
%{summary}
@ -25,13 +25,13 @@ Group: System/Kernel and hardware
# p - full kernel version (uname -r), e.g.: 5.10.71-generic-1rosa2021.1-x86_64)
# s - source package name (e.g.: nvidia390, kernel-5.10-generic)
# c - module compression (.zst, .xz, .gz or "")
%kroko_kmod_pkg -r %{kroko_release} -j 100 -n 10 -f test -k 5.0 -m 1 -p 5.0.1-test-1rosa202.1-x86_64 -s kroko-test -c .zst
%kroko_kmod_pkg -r %{kroko_release} -j 100 -n 10 -f test -k 5.0 -m 1 -p 5.0.1-test-1rosa2021.1-x86_64 -s kroko-test -c .zst -d %{kroko_mdf}
#------------------------------------------------------------------------------
%package kabi
Summary: Fake provide of kernel abi to satisfy deps
Provides: kernel-abi(5.0.1-test-1rosa202.1-x86_64)
Provides: kernel-abi(5.0.1-test-1rosa2021.1-x86_64)
# in sync with package generated by %%kroko_kmod_pkg
Version: 100.10
Release: %{kroko_release}
@ -40,9 +40,10 @@ Release: %{kroko_release}
%{summary}
%files kabi
#------------------------------------------------------------------------------
%install
mkdir -p %{buildroot}/lib/modules/5.0.1-test-1rosa202.1-x86_64/kernel/drivers/video/nvidia100
echo test > %{buildroot}/lib/modules/5.0.1-test-1rosa202.1-x86_64/kernel/drivers/video/nvidia100/test.ko
zstd --rm %{buildroot}/lib/modules/5.0.1-test-1rosa202.1-x86_64/kernel/drivers/video/nvidia100/test.ko
mkdir -p %{buildroot}/lib/modules/5.0.1-test-1rosa2021.1-x86_64/kernel/drivers/video/nvidia100.%{kroko_mdf}
echo test > %{buildroot}/lib/modules/5.0.1-test-1rosa2021.1-x86_64/kernel/drivers/video/nvidia100.%{kroko_mdf}/test.ko
zstd --rm %{buildroot}/lib/modules/5.0.1-test-1rosa2021.1-x86_64/kernel/drivers/video/nvidia100.%{kroko_mdf}/test.ko