commit:     ebbbba47ad3ae3109c17c002a7b4bb31e9936bf2
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Oct 25 17:07:38 2022 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Oct 29 15:31:00 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ebbbba47

kernel-install.eclass: Account for PV/KV mismatch

Do not assume PV and kernel version must always match.  Use PV for
kernel install directory (i.e. /usr/src/linux) but get the release
from the kernel build directory for the module directory.  Update
preinst version check to account for live ebuilds.

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 eclass/kernel-install.eclass | 67 +++++++++++++++++++++++++++-----------------
 1 file changed, 41 insertions(+), 26 deletions(-)

diff --git a/eclass/kernel-install.eclass b/eclass/kernel-install.eclass
index dc77cb514b1a..9aece24bbff5 100644
--- a/eclass/kernel-install.eclass
+++ b/eclass/kernel-install.eclass
@@ -403,24 +403,34 @@ kernel-install_src_test() {
 kernel-install_pkg_preinst() {
        debug-print-function ${FUNCNAME} "${@}"
 
-       local ver="${PV}${KV_LOCALVERSION}"
-       local kdir="${ED}/usr/src/linux-${ver}"
-       local relfile="${kdir}/include/config/kernel.release"
-       [[ ! -d ${kdir} ]] && die "Kernel directory ${kdir} not installed!"
-       [[ ! -f ${relfile} ]] && die "Release file ${relfile} not installed!"
-       local release="$(<"${relfile}")"
-       if [[ ${release} != ${PV}* ]]; then
-               eerror "Kernel release mismatch!"
-               eerror "  expected (PV): ${PV}*"
-               eerror "          found: ${release}"
-               eerror "Please verify that you are applying the correct 
patches."
-               die "Kernel release mismatch (${release} instead of ${PV}*)"
+       local dir_ver=${PV}${KV_LOCALVERSION}
+       local kernel_dir=${ED}/usr/src/linux-${dir_ver}
+       local relfile=${kernel_dir}/include/config/kernel.release
+       [[ ! -d ${kernel_dir} ]] &&
+               die "Kernel directory ${kernel_dir} not installed!"
+       [[ ! -f ${relfile} ]] &&
+               die "Release file ${relfile} not installed!"
+       local release
+       release="$(<"${relfile}")" || die
+
+       # perform the version check for release ebuilds only
+       if [[ ${PV} != *9999 ]]; then
+               local expected_ver=$(dist-kernel_PV_to_KV "${PV}")
+
+               if [[ ${release} != ${expected_ver}* ]]; then
+                       eerror "Kernel release mismatch!"
+                       eerror "  expected (PV): ${expected_ver}*"
+                       eerror "          found: ${release}"
+                       eerror "Please verify that you are applying the correct 
patches."
+                       die "Kernel release mismatch (${release} instead of 
${expected_ver}*)"
+               fi
        fi
+
        if [[ -L ${EROOT}/lib && ${EROOT}/lib -ef ${EROOT}/usr/lib ]]; then
                # Adjust symlinks for merged-usr.
-               rm "${ED}/lib/modules/${ver}"/{build,source} || die
-               dosym "../../../src/linux-${ver}" 
"/usr/lib/modules/${ver}/build"
-               dosym "../../../src/linux-${ver}" 
"/usr/lib/modules/${ver}/source"
+               rm "${ED}/lib/modules/${release}"/{build,source} || die
+               dosym "../../../src/linux-${dir_ver}" 
"/usr/lib/modules/${release}/build"
+               dosym "../../../src/linux-${dir_ver}" 
"/usr/lib/modules/${release}/source"
        fi
 }
 
@@ -434,7 +444,11 @@ kernel-install_install_all() {
        debug-print-function ${FUNCNAME} "${@}"
 
        [[ ${#} -eq 1 ]] || die "${FUNCNAME}: invalid arguments"
-       local ver=${1}
+       local dir_ver=${1}
+       local kernel_dir=${EROOT}/usr/src/linux-${dir_ver}
+       local relfile=${kernel_dir}/include/config/kernel.release
+       local module_ver
+       module_ver=$(<"${relfile}") || die
 
        local success=
        # not an actual loop but allows error handling with 'break'
@@ -446,13 +460,13 @@ kernel-install_install_all() {
                        # putting it alongside kernel image as 'initrd' makes
                        # kernel-install happier
                        nonfatal dist-kernel_build_initramfs \
-                               
"${EROOT}/usr/src/linux-${ver}/${image_path%/*}/initrd" \
-                               "${ver}" || break
+                               "${kernel_dir}/${image_path%/*}/initrd" \
+                               "${module_ver}" || break
                fi
 
-               nonfatal dist-kernel_install_kernel "${ver}" \
-                       "${EROOT}/usr/src/linux-${ver}/${image_path}" \
-                       "${EROOT}/usr/src/linux-${ver}/System.map" || break
+               nonfatal dist-kernel_install_kernel "${module_ver}" \
+                       "${kernel_dir}/${image_path}" \
+                       "${kernel_dir}/System.map" || break
 
                success=1
                break
@@ -476,11 +490,11 @@ kernel-install_install_all() {
 kernel-install_pkg_postinst() {
        debug-print-function ${FUNCNAME} "${@}"
 
-       local ver="${PV}${KV_LOCALVERSION}"
+       local dir_ver=${PV}${KV_LOCALVERSION}
        kernel-install_update_symlink "${EROOT}/usr/src/linux" "${ver}"
 
        if [[ -z ${ROOT} ]]; then
-               kernel-install_install_all "${ver}"
+               kernel-install_install_all "${dir_ver}"
        fi
 }
 
@@ -500,11 +514,12 @@ kernel-install_pkg_postrm() {
        debug-print-function ${FUNCNAME} "${@}"
 
        if [[ -z ${ROOT} ]] && use initramfs; then
-               local ver="${PV}${KV_LOCALVERSION}"
+               local dir_ver=${PV}${KV_LOCALVERSION}
+               local kernel_dir=${EROOT}/usr/src/linux-${dir_ver}
                local image_path=$(dist-kernel_get_image_path)
                ebegin "Removing initramfs"
-               rm -f 
"${EROOT}/usr/src/linux-${ver}/${image_path%/*}"/initrd{,.uefi} &&
-                       find "${EROOT}/usr/src/linux-${ver}" -depth -type d 
-empty -delete
+               rm -f "${kernel_dir}/${image_path%/*}"/initrd{,.uefi} &&
+                       find "${kernel_dir}" -depth -type d -empty -delete
                eend ${?}
        fi
 }

Reply via email to