[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gentoo-dev
Subject:    [gentoo-dev] [PATCH 3/4] kernel-install.eclass: Account for PV/KV mismatch
From:       Michał Górny <mgorny () gentoo ! org>
Date:       2022-10-26 11:31:39
Message-ID: 20221026113140.3213-4-mgorny () gentoo ! org
[Download RAW message or body]

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@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
 }
-- 
2.38.1


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic