Standardize globally kmod package names macros and kernel_uname_r variables in order to ease the build of kmod packages for non-default distribution (Fedora), for example for RHEL

Signed-off-by: Nicolas Viéville <nicolas.vieville@uphf.fr>
This commit is contained in:
Nicolas Viéville 2019-10-16 23:01:07 +02:00
commit 4852d351ab

View file

@ -38,6 +38,16 @@ kernel_versions_to_build_for=
filterfile=
target=
kernel_uname_r=""
kernel_uname_r_vanilla=""
kernel_uname_r_short=""
kernel_uname_r_wo_arch=""
kernel_uname_r_dist=""
kernel_uname_r_rel=""
kernel_uname_r_rel_plus_one=""
kernel_uname_r_short_plus_one=""
kernel_uname_r_rel_minor=""
error_out()
{
local errorlevel=${1}
@ -57,6 +67,84 @@ print_rpmtemplate_header()
echo
}
init_kernel_uname_r_vars()
{
## Build some interesting strings with kernel uname -r
## Examples:
## - Fedora and rhel:
## kernel_uname_r 3.10.0-693.2.2.el7.x86_64
## kernel_uname_r_vanilla 3.10.0
## kernel_uname_r_short 3.10.0-693.el7
## kernel_uname_r_wo_arch 3.10.0-693.2.2.el7
## kernel_uname_r_dist el7
## kernel_uname_r_rel 693
## kernel_uname_r_rel_plus_one 694
## kernel_uname_r_short_plus_one 3.10.0-694.el7
## kernel_uname_r_rel_minor 2.2
##
kernel_uname_r=${1}
kernel_uname_r_vanilla=$(echo ${1} | sed -n -e "s/\.${target}//" -e "s/\([[:alnum:]\.]\+\|\)-\(.*\)/\1/p")
kernel_uname_r_short=$(echo ${1} | sed -n -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\)\(\.[[:alnum:]\.]\+\|\)\(\.el.*\|\.fc.*\)/\1-\2\4/p")
kernel_uname_r_wo_arch=$(echo ${1} | sed -e "s/\.${target}//")
kernel_uname_r_dist=$(echo ${1} | sed -n -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\.[[:alnum:]]\+\-\|[[:alnum:]]\+\)\([[:alnum:]\.]\+\|\)\(\.el.*\|\.fc.*\)/\4/" -e "s/^\.//p")
kernel_uname_r_rel=$(echo ${1} | sed -n -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\.[[:alnum:]]\+\-\|[[:alnum:]]\+\.\)\([[:alnum:]\.]\+\|\)\(.*\)/\2/" -e "s/^\.//" -e "s/[\.\-]$//p")
if $(echo "${kernel_uname_r_rel}" | grep -qE '^[0-9]+$') ; then
kernel_uname_r_rel_plus_one=$(( kernel_uname_r_rel+1 ))
else
kernel_uname_r_rel_plus_one=""
fi
kernel_uname_r_short_plus_one=$(echo ${kernel_uname_r_short} | sed -e "s/(//" -e "s/-${kernel_uname_r_rel}\./-${kernel_uname_r_rel_plus_one}\./")
kernel_uname_r_rel_minor=$(echo ${1} | sed -n -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\.[[:alnum:]]\+\-\|[[:alnum:]]\+\.\)\([[:alnum:]\.]\+\|\)\(\.el.*\|\.fc.*\)/\3/" -e "s/^\.//p")
}
print_rpmtemplate_macros()
{
# Defines package names macros depending on distributions (default
# is Fedora):
# - rhel_kabi is set if building for RHEL
# - kmod_pkg_name and pkg_kmod_name are the two possible forms of
# the package name used when building packages modules. First one
# uses kmod as prefix, the second one uses kmod as suffix. These
# macros allow to modify the naming schema regarding the target
# distribution (for example with suffix and prefix different from
# kmod).
# - kmod_obsolete_name same as kmod_pkg_name and pkg_kmod_name but
# for obsolete package name
#
if [[ -n ${obsolete_name} ]] ; then
echo '%global obsolete_name '${obsolete_name}
fi
cat <<EOF
%{?rhel:%global with_rhel_kabi 1}
%if 0%{?rhel} || 0%{?fedora}
%global kmod_pkg_name kmod-${kmodname}
%global pkg_kmod_name ${kmodname}-kmod
%{?obsolete_name:%global kmod_obsolete_name kmod-%{obsolete_name}}
%endif
EOF
}
print_rpmtemplate_macros_pkg_name_version()
{
# Defines package name with kernel version macros (depends on
# init_kernel_uname_r_vars for kernel_uname_r* variables):
# - rhel_kabi is set if building for RHEL
# - kmod_for_kernel defines target kernel version string
# - package_kmod_name complete package name including target kernel
# version
#
init_kernel_uname_r_vars ${1}
cat <<EOF
%if 0%{?rhel} || 0%{?fedora}
%global kmod_for_kernel %{?with_rhel_kabi:${kernel_uname_r_short}}%{!?with_rhel_kabi:${kernel_uname_r}}
%global package_kmod_name %{kmod_pkg_name}-%{kmod_for_kernel}
%endif
EOF
}
print_akmodtemplate ()
{
echo
@ -67,7 +155,7 @@ rpmbuild --define "_sourcedir %{_sourcedir}" \\\
--define "_srcrpmdir \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/" \\\
%{?dist:--define 'dist %{dist}}' \\\
-bs --nodeps %{_specdir}/%{name}.spec ; \\\
ln -s \$(ls \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/) \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/${kmodname}-kmod.latest
ln -s \$(ls \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/) \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/%{pkg_kmod_name}.latest
%package -n akmod-${kmodname}
Summary: Akmod package for ${kmodname} kernel module(s)
@ -75,8 +163,8 @@ Requires: kmodtool
Requires: akmods
%{?AkmodsBuildRequires:Requires: %{AkmodsBuildRequires}}
# same requires and provides as a kmods package would have
Requires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version}
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: %{pkg_kmod_name}-common >= %{?epoch:%{epoch}:}%{version}
Provides: %{pkg_kmod_name} = %{?epoch:%{epoch}:}%{version}-%{release}
EOF
if [[ -n "${obsolete_name}" ]] ; then
@ -93,7 +181,7 @@ This package provides the akmod package for the ${kmodname} kernel modules.
nohup /usr/sbin/akmods --from-akmod-posttrans --akmod ${kmodname} &> /dev/null &
%post -n akmod-${kmodname}
[ -x /usr/sbin/akmods-ostree-post ] && /usr/sbin/akmods-ostree-post ${kmodname} %{_usrsrc}/akmods/${kmodname}-kmod-%{version}-%{release}.src.rpm
[ -x /usr/sbin/akmods-ostree-post ] && /usr/sbin/akmods-ostree-post ${kmodname} %{_usrsrc}/akmods/%{pkg_kmod_name}-%{version}-%{release}.src.rpm
%files -n akmod-${kmodname}
%defattr(-,root,root,-)
@ -105,28 +193,28 @@ print_akmodmeta ()
{
cat <<EOF
%package -n kmod-${kmodname}
%package -n %{kmod_pkg_name}
Summary: Metapackage which tracks in ${kmodname} kernel module for newest kernel
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: kmod-${kmodname}-xen = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: kmod-${kmodname}-smp = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: kmod-${kmodname}-PAE = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: %{pkg_kmod_name} = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: %{kmod_pkg_name}-xen = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: %{kmod_pkg_name}-smp = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: %{kmod_pkg_name}-PAE = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: akmod-${kmodname} = %{?epoch:%{epoch}:}%{version}-%{release}
EOF
if [[ -n "${obsolete_name}" ]] ; then
echo "Provides: kmod-${obsolete_name} = ${obsolete_version}"
echo "Obsoletes: kmod-${obsolete_name} < ${obsolete_version}"
echo "Provides: %{kmod_obsolete_name} = ${obsolete_version}"
echo "Obsoletes: %{kmod_obsolete_name} < ${obsolete_version}"
fi
cat <<EOF
%description -n kmod-${kmodname}
%description -n %{kmod_pkg_name}
This is a meta-package without payload which sole purpose is to require the
${kmodname} kernel module(s) for the newest kernel,
to make sure you get it together with a new kernel.
%files -n kmod-${kmodname}
%files -n %{kmod_pkg_name}
%defattr(644,root,root,755)
EOF
}
@ -142,13 +230,6 @@ print_rpmtemplate_per_kmodpkg ()
local redhatkernel=true
fi
## Build some interesting strings with kernel uname -r
## Examples:
## kernel_uname_r 3.10.0-693.2.2.el7.x86_64
## kernel_uname_r_short 3.10.0-693.el7
local kernel_uname_r=${1}
local kernel_uname_r_short=$(echo ${1} | sed -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\)\(\.[[:alnum:]\.]\+\|\)\(\.el.*\|\.fc.*\)/\1-\2\4/")
if [[ -h /sbin ]] ; then
echo '%global _prefix_usr '/usr
fi
@ -165,51 +246,30 @@ print_rpmtemplate_per_kmodpkg ()
# Provides: installonlypkg(kernel-module)
cat <<EOF
%if 0%{?rhel}
%package -n kmod-${kmodname}-${kernel_uname_r}
Summary: ${kmodname} kernel module(s) for ${kernel_uname_r_short}
Provides: kernel-modules = ${kernel_uname_r}
%package -n %{package_kmod_name}
Summary: ${kmodname} kernel module(s) for %{kmod_for_kernel}
Provides: kernel-modules%{!?with_rhel_kabi:-for-kernel} = ${kernel_uname_r}
%if %{with rhel_kabi}
Provides: installonlypkg(kernel-module)
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version}
%endif
Provides: %{pkg_kmod_name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: %{pkg_kmod_name}-common >= %{?epoch:%{epoch}:}%{version}
Requires(post): %{?_prefix_usr}/sbin/depmod
Requires(postun): %{?_prefix_usr}/sbin/depmod
%if %{with rhel_kabi}
Requires(post): %{?_prefix_usr}/sbin/weak-modules
Requires(post): %{?_prefix_usr}/sbin/depmod
Requires(postun): %{?_prefix_usr}/sbin/weak-modules
Requires(postun): %{?_prefix_usr}/sbin/depmod
%else
%package -n kmod-${kmodname}-${kernel_uname_r}
Summary: ${kmodname} kernel module(s) for ${kernel_uname_r}
Provides: kernel-modules-for-kernel = ${kernel_uname_r}
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version}
Requires(post): %{?_prefix_usr}/sbin/depmod
Requires(postun): %{?_prefix_usr}/sbin/depmod
%endif
EOF
if [[ -n "${obsolete_name}" ]] ; then
echo
echo "Provides: kmod-${obsolete_name}-${kernel_uname_r} = ${obsolete_version}"
echo "Obsoletes: kmod-${obsolete_name}-${kernel_uname_r} < ${obsolete_version}"
echo "Provides: %{kmod_obsolete_name}-${kernel_uname_r} = ${obsolete_version}"
echo "Obsoletes: %{kmod_obsolete_name}-${kernel_uname_r} < ${obsolete_version}"
fi
# second part
if [[ ! -n "${customkernel}" ]] ; then
## Build some interesting strings with kernel uname -r
## Examples:
## kernel_uname_r_wo_arch 3.10.0-693.2.2.el7
## kernel_uname_r_dist el7
## kernel_uname_r_rel 693
## kernel_uname_r_rel_plus_one 694
## kernel_uname_r_short_plus_one 3.10.0-694.el7
## kernel_uname_r_rel_minor 2.2
local kernel_uname_r_wo_arch=$(echo ${1} | sed -e "s/\.${target}//")
local kernel_uname_r_dist=$(echo ${1} | sed -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\)\(\.[[:alnum:]\.]\+\|\)\(\.el.*\|\.fc.*\)/\4/" -e "s/^\.//")
local kernel_uname_r_rel=$(echo ${1} | sed -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\)\(\.[[:alnum:]\.]\+\|\)\(\.el.*\|\.fc.*\)/\2/" -e "s/^\.//")
local kernel_uname_r_rel_plus_one=$(( kernel_uname_r_rel+1 ))
local kernel_uname_r_short_plus_one=$(echo ${kernel_uname_r_short} | sed -e "s/(//" -e "s/-${kernel_uname_r_rel}\./-${kernel_uname_r_rel_plus_one}\./")
local kernel_uname_r_rel_minor=$(echo ${1} | sed -e "s/\.${target}//" -e "s/\(.*\)-\([[:alnum:]]\+\)\(\.[[:alnum:]\.]\+\|\)\(\.el.*\|\.fc.*\)/\3/" -e "s/^\.//")
cat <<EOF
%global _kmodtool_depmod_post \\\
if [ -f /boot/System.map-${kernel_uname_r} ] ; then \\\
@ -220,66 +280,67 @@ else \\\
%{?_prefix_usr}/sbin/depmod -a >/dev/null ; \\\
fi || :
%if 0%{?rhel}
%if %{with rhel_kabi}
Requires: kernel >= ${kernel_uname_r_short}
Requires: kernel < ${kernel_uname_r_short_plus_one}
BuildRequires: kernel-devel = ${kernel_uname_r_wo_arch} redhat-rpm-config kernel-abi-whitelists
%post -n kmod-${kmodname}-${kernel_uname_r}
%{_kmodtool_depmod_post}
modules=( \$(find ${usr_lib_modules}/${kernel_uname_r}/extra/${kmodname}/ -name "*.ko") )
printf '%s\n' "\${modules[@]}" | %{?_prefix_usr}/sbin/weak-modules --add-modules
%preun -n kmod-${kmodname}-${kernel_uname_r}
rpm -ql kmod-${kmodname}-${kernel_uname_r}-%{version}-%{release}.$(arch) | grep -e '\.ko$' > /var/run/rpm-kmod-${kmodname}-modules
%postun -n kmod-${kmodname}-${kernel_uname_r}
%{_kmodtool_depmod_post}
modules=( \$(cat /var/run/rpm-kmod-${kmodname}-modules) )
rm -f /var/run/rpm-kmod-${kmodname}-modules
printf '%s\n' "\${modules[@]}" | %{?_prefix_usr}/sbin/weak-modules --remove-modules
%else
Requires: kernel-uname-r = ${kernel_uname_r}
BuildRequires: kernel-devel-uname-r = ${kernel_uname_r}
BuildRequires: gcc
%post -n kmod-${kmodname}-${kernel_uname_r}
%endif
%post -n %{package_kmod_name}
%{_kmodtool_depmod_post}
%postun -n kmod-${kmodname}-${kernel_uname_r}
%if %{with rhel_kabi}
modules=( \$(find ${usr_lib_modules}/${kernel_uname_r}/extra/${kmodname}/ -name "*.ko") )
printf '%s\n' "\${modules[@]}" | %{?_prefix_usr}/sbin/weak-modules --add-modules
%endif
%if %{with rhel_kabi}
%preun -n %{package_kmod_name}
rpm -ql %{package_kmod_name}-%{version}-%{release}.$(arch) | grep -e '\.ko$' > /var/run/rpm-%{package_kmod_name}-modules
%endif
%postun -n %{package_kmod_name}
%{_kmodtool_depmod_post}
%if %{with rhel_kabi}
modules=( \$(cat /var/run/rpm-%{package_kmod_name}-modules) )
rm -f /var/run/rpm-%{package_kmod_name}-modules
printf '%s\n' "\${modules[@]}" | %{?_prefix_usr}/sbin/weak-modules --remove-modules
%endif
EOF
else
cat <<EOF
%if 0%{?rhel}
%post -n kmod-${kmodname}-${kernel_uname_r}
%post -n %{package_kmod_name}
[[ "\$(uname -r)" == "${kernel_uname_r}" ]] && %{?_prefix_usr}/sbin/depmod -a > /dev/null || :
%if %{with rhel_kabi}
if [[ "\$(uname -r)" == "${kernel_uname_r}" ]] ; then
modules=( \$(find ${usr_lib_modules}/${kernel_uname_r}/extra/${kmodname}/ -name "*.ko") )
printf '%s\n' "\${modules[@]}" | %{?_prefix_usr}/sbin/weak-modules --add-modules
fi
%endif
%preun -n kmod-${kmodname}-${kernel_uname_r}
%if %{with rhel_kabi}
%preun -n %{package_kmod_name}
if [[ "\$(uname -r)" == "${kernel_uname_r}" ]] ; then
rpm -ql kmod-${kmodname}-${kernel_uname_r}-%{version}-%{release}.$(arch) | grep -e '\.ko$' > /var/run/rpm-kmod-${kmodname}-modules
rpm -ql %{package_kmod_name}-%{version}-%{release}.$(arch) | grep -e '\.ko$' > /var/run/rpm-%{package_kmod_name}-modules
fi
%endif
%postun -n kmod-${kmodname}-${kernel_uname_r}
%postun -n %{package_kmod_name}
[[ "\$(uname -r)" == "${kernel_uname_r}" ]] && %{?_prefix_usr}/sbin/depmod -a > /dev/null || :
%if %{with rhel_kabi}
if [[ "\$(uname -r)" == "${kernel_uname_r}" ]] ; then
modules=( \$(cat /var/run/rpm-kmod-${kmodname}-modules) )
rm -f /var/run/rpm-kmod-${kmodname}-modules
modules=( \$(cat /var/run/rpm-%{package_kmod_name}-modules) )
rm -f /var/run/rpm-%{package_kmod_name}-modules
printf '%s\n' "\${modules[@]}" | %{?_prefix_usr}/sbin/weak-modules --remove-modules
fi
%else
%post -n kmod-${kmodname}-${kernel_uname_r}
[[ "\$(uname -r)" == "${kernel_uname_r}" ]] && %{?_prefix_usr}/sbin/depmod -a > /dev/null || :
%postun -n kmod-${kmodname}-${kernel_uname_r}
[[ "\$(uname -r)" == "${kernel_uname_r}" ]] && %{?_prefix_usr}/sbin/depmod -a > /dev/null || :
%endif
EOF
fi
@ -287,53 +348,42 @@ EOF
# third part
cat <<EOF
%if 0%{?rhel}
%description -n kmod-${kmodname}-${kernel_uname_r}
%description -n %{package_kmod_name}
This package provides the ${kmodname} kernel modules built for the Linux
kernel ${kernel_uname_r_short} for the %{_target_cpu} family of processors.
%files -n kmod-${kmodname}-${kernel_uname_r}
kernel %{kmod_for_kernel} for the %{_target_cpu} family of processors.
%files -n %{package_kmod_name}
%defattr(644,root,root,755)
%dir ${usr_lib_modules}/${kernel_uname_r}/extra
${usr_lib_modules}/${kernel_uname_r}/extra/${kmodname}/
%else
%description -n kmod-${kmodname}-${kernel_uname_r}
This package provides the ${kmodname} kernel modules built for the Linux
kernel ${kernel_uname_r} for the %{_target_cpu} family of processors.
%files -n kmod-${kmodname}-${kernel_uname_r}
%defattr(644,root,root,755)
%dir ${usr_lib_modules}/${kernel_uname_r}/extra
${usr_lib_modules}/${kernel_uname_r}/extra/${kmodname}/
%endif
EOF
}
print_rpmtemplate_kmodmetapkg ()
{
local kernel_uname_r=${1}
local kernel_variant="${2:+-${2}}"
local kernel_variant="${1:+-${1}}"
cat <<EOF
%package -n kmod-${kmodname}${kernel_variant}
%package -n %{kmod_pkg_name}${kernel_variant}
Summary: Metapackage which tracks in ${kmodname} kernel module for newest kernel${kernel_variant}
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: kmod-${kmodname}-${kernel_uname_r} >= %{?epoch:%{epoch}:}%{version}-%{release}
Provides: %{pkg_kmod_name} = %{?epoch:%{epoch}:}%{version}-%{release}
Requires: %{package_kmod_name} >= %{?epoch:%{epoch}:}%{version}-%{release}
EOF
if [[ -n "${obsolete_name}" ]] ; then
echo "Provides: kmod-${obsolete_name}${kernel_variant} = ${obsolete_version}"
echo "Obsoletes: kmod-${obsolete_name}${kernel_variant} < ${obsolete_version}"
echo "Provides: %{kmod_obsolete_name}${kernel_variant} = ${obsolete_version}"
echo "Obsoletes: %{kmod_obsolete_name}${kernel_variant} < ${obsolete_version}"
fi
cat <<EOF
%description -n kmod-${kmodname}${kernel_variant}
%description -n %{kmod_pkg_name}${kernel_variant}
This is a meta-package without payload which sole purpose is to require the
${kmodname} kernel module(s) for the newest kernel${kernel_variant}.
to make sure you get it together with a new kernel.
%files -n kmod-${kmodname}${kernel_variant}
%files -n %{kmod_pkg_name}${kernel_variant}
%defattr(644,root,root,755)
@ -350,7 +400,8 @@ print_customrpmtemplate ()
# parse kernel versions string and print template
local kernel_verrelarch=${kernel%%${kernels_known_variants}}
print_rpmtemplate_per_kmodpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}}
print_rpmtemplate_macros_pkg_name_version "${kernel}"
print_rpmtemplate_per_kmodpkg --redhat ${kernel##${kernel_verrelarch}}
elif [[ -e "${usr_lib_modules}"/"${kernel}"/build/Makefile ]] ; then
# likely a user-build-kernel with available buildfiles
# fixme: we should check if uname from Makefile is the same as ${kernel}
@ -383,11 +434,13 @@ print_rpmtemplate ()
local kernel_verrelarch=${kernel%%${kernels_known_variants}}
print_rpmtemplate_macros_pkg_name_version "${kernel}"
# create metapackage
print_rpmtemplate_kmodmetapkg ${kernel} ${kernel##${kernel_verrelarch}}
print_rpmtemplate_kmodmetapkg ${kernel##${kernel_verrelarch}}
# create package
print_rpmtemplate_per_kmodpkg ${kernel} ${kernel##${kernel_verrelarch}}
print_rpmtemplate_per_kmodpkg ${kernel##${kernel_verrelarch}}
done
}
@ -519,6 +572,7 @@ elif ( [[ -n "${obsolete_name}" ]] && [[ ! -n "${obsolete_version}" ]] ) || ( [
fi
# go
print_rpmtemplate_macros
if [[ -n "${for_kernels}" ]] ; then
# this is easy:
print_customrpmtemplate "${for_kernels}"