commit:     d21683ba377a5b2e5bc253e2f825ca7083c5188e
Author:     James Le Cuirot <chewi <AT> gentoo <DOT> org>
AuthorDate: Thu May 22 17:34:25 2025 +0000
Commit:     James Le Cuirot <chewi <AT> gentoo <DOT> org>
CommitDate: Thu Jun  5 10:55:08 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=d21683ba

linux-info.eclass: Rework get_version and fix output directory detection

get_version used to detect the output directory under /lib/modules if
KBUILD_OUTPUT wasn't explicitly set, but this broke when bug #662772 was
fixed. The code is still there but effectively does nothing as
OUTPUT_DIR is already used to set KV_OUT_DIR above.

Bug: https://bugs.gentoo.org/662772
Signed-off-by: James Le Cuirot <chewi <AT> gentoo.org>

 eclass/linux-info.eclass | 59 ++++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 30 deletions(-)

diff --git a/eclass/linux-info.eclass b/eclass/linux-info.eclass
index 067c94ccdc1f..a2b38d604b21 100644
--- a/eclass/linux-info.eclass
+++ b/eclass/linux-info.eclass
@@ -485,8 +485,6 @@ get_version() {
                die "${FUNCNAME}() called on non-Linux system, please fix the 
ebuild"
        fi
 
-       local tmplocal
-
        [[ -n ${SKIP_KERNEL_CHECK} ]] && return
 
        # No need to execute this twice assuming KV_FULL is populated.
@@ -541,13 +539,6 @@ get_version() {
                return 1
        fi
 
-       # OK so now we know our sources directory, but they might be using
-       # KBUILD_OUTPUT, and we need this for .config and localversions-*
-       # so we better find it, eh?
-       #
-       # Do we pass KBUILD_OUTPUT on the CLI?
-       local OUTPUT_DIR=${KBUILD_OUTPUT}
-
        # And contrary to existing functions, I feel we shouldn't trust the
        # directory name to find version information as this seems insane.
        # So we parse ${KERNEL_MAKEFILE}.
@@ -565,13 +556,35 @@ get_version() {
                return 1
        fi
 
-       [[ -d "${OUTPUT_DIR}" ]] && KV_OUT_DIR="${OUTPUT_DIR}"
-       if [[ -n "${KV_OUT_DIR}" ]]; then
+       # Assume there is no local version to begin with.
+       KV_FULL=${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}
+
+       # There may be separate source and output directories. Has the user set
+       # KBUILD_OUTPUT? If not, automatically fall back to finding the most
+       # relevant output directory. If so, but it doesn't exist, don't fall 
back as
+       # that's probably undesirable.
+       if [[ -n ${KBUILD_OUTPUT} ]]; then
+               if [[ -d ${KBUILD_OUTPUT} ]]; then
+                       KV_OUT_DIR=${KBUILD_OUTPUT}
+               else
+                       die "KBUILD_OUTPUT is set to ${KBUILD_OUTPUT} but it 
doesn't exist"
+               fi
+       else
+               for KV_OUT_DIR in "${SYSROOT}" "${ROOT}" ""; do
+                       # We cannot use the local version to find the output 
directory
+                       # because that is where it is written to.
+                       KV_OUT_DIR+="/lib/modules/${KV_FULL}/build"
+                       [[ -d ${KV_OUT_DIR} ]] && break
+               done
+       fi
+
+       if [[ -d ${KV_OUT_DIR} ]]; then
                qeinfo "Found kernel object directory:"
                qeinfo "    ${KV_OUT_DIR}"
+       else
+               # Just use KV_DIR as a last resort.
+               KV_OUT_DIR=${KV_DIR}
        fi
-       # and if we STILL have not got it, then we better just set it to KV_DIR
-       KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
 
        # Grab the kernel release from the output directory.
        # TODO: we MUST detect kernel.release being out of date, and 'return 1' 
from
@@ -585,7 +598,7 @@ get_version() {
        fi
 
        # KV_LOCAL currently contains the full release; discard the first bits.
-       tmplocal=${KV_LOCAL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}}
+       local tmplocal=${KV_LOCAL#"${KV_FULL}"}
 
        # If the updated local version was not changed, the tree is not 
prepared.
        # Clear out KV_LOCAL in that case.
@@ -597,22 +610,8 @@ get_version() {
                KV_LOCAL=${tmplocal}
        fi
 
-       # and in newer versions, we can also pull LOCALVERSION if it is set.
-       # but before we do this, we need to find if we use a different object 
directory.
-       # This *WILL* break if the user is using localversions, but we assume 
it was
-       # caught before this if they are.
-       if [[ -z ${OUTPUT_DIR} ]] ; then
-               # Try to locate a kernel that is most relevant for us.
-               for OUTPUT_DIR in "${SYSROOT}" "${ROOT}" "" ; do
-                       
OUTPUT_DIR+="/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}/build"
-                       if [[ -e ${OUTPUT_DIR} ]] ; then
-                               break
-                       fi
-               done
-       fi
-
-       # And we should set KV_FULL to the full expanded version
-       KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
+       # Append the local version now that we (maybe) have it.
+       KV_FULL+=${KV_LOCAL}
 
        qeinfo "Found sources for kernel version:"
        qeinfo "    ${KV_FULL}"

Reply via email to