diff --git a/kmodtool-kmodtool b/kmodtool-kmodtool index 3e561a0..36cd599 100644 --- a/kmodtool-kmodtool +++ b/kmodtool-kmodtool @@ -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 <= %{?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 <= %{?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 </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 < /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 <= %{?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 <