commit:     db0195c3d66fc9ca1ee966b2177b2174a7d7bd02
Author:     Andrew Ammerlaan <andrewammerlaan <AT> gentoo <DOT> org>
AuthorDate: Wed Nov  8 13:46:19 2023 +0000
Commit:     Andrew Ammerlaan <andrewammerlaan <AT> gentoo <DOT> org>
CommitDate: Tue Dec  5 10:27:41 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=db0195c3

eclass/(dist-)kernel{-utils,-install}: More flexible initrd generation

We only need to call dracut to generate an initrd/uki if we are using
<=sys-kernel/installkernel-gentoo-7. sys-kernel/installkernel-systemd
already calls dracut via its plugin system if it is installed.
sys-kernel/installkernel-gentoo-8[dracut] now also contains the code
required to generate an initrd or uki.

This change makes it possible for users to use other/custom initrd
generators with our dist kernels if they are using installkernel-systemd.

Signed-off-by: Andrew Ammerlaan <andrewammerlaan <AT> gentoo.org>

 eclass/dist-kernel-utils.eclass | 50 ++++++++++++++++++++++++-----------------
 eclass/kernel-install.eclass    | 30 ++++++++++++++++++-------
 2 files changed, 52 insertions(+), 28 deletions(-)

diff --git a/eclass/dist-kernel-utils.eclass b/eclass/dist-kernel-utils.eclass
index 76a2f8d48cdf..62750d1721a2 100644
--- a/eclass/dist-kernel-utils.eclass
+++ b/eclass/dist-kernel-utils.eclass
@@ -116,21 +116,23 @@ dist-kernel_install_kernel() {
        local image=${2}
        local map=${3}
 
-       # if dracut is used in uefi=yes mode, initrd will actually
-       # be a combined kernel+initramfs UEFI executable.  we can easily
-       # recognize it by PE magic (vs cpio for a regular initramfs)
-       local initrd=${image%/*}/initrd
-       local magic
-       [[ -s ${initrd} ]] && read -n 2 magic < "${initrd}"
-       if [[ ${magic} == MZ ]]; then
-               einfo "Combined UEFI kernel+initramfs executable found"
-               # install the combined executable in place of kernel
-               image=${initrd%/*}/uki.efi
-               mv "${initrd}" "${image}" || die
-
-               if [[ ${KERNEL_IUSE_SECUREBOOT} ]]; then
-                       # Ensure the uki is signed if dracut hasn't already 
done so.
-                       secureboot_sign_efi_file "${image}"
+       if has_version "<=sys-kernel/installkernel-gentoo-7"; then
+               # if dracut is used in uefi=yes mode, initrd will actually
+               # be a combined kernel+initramfs UEFI executable.  we can easily
+               # recognize it by PE magic (vs cpio for a regular initramfs)
+               local initrd=${image%/*}/initrd
+               local magic
+               [[ -s ${initrd} ]] && read -n 2 magic < "${initrd}"
+               if [[ ${magic} == MZ ]]; then
+                       einfo "Combined UEFI kernel+initramfs executable found"
+                       # install the combined executable in place of kernel
+                       image=${initrd%/*}/uki.efi
+                       mv "${initrd}" "${image}" || die
+
+                       if [[ ${KERNEL_IUSE_SECUREBOOT} ]]; then
+                               # Ensure the uki is signed if dracut hasn't 
already done so.
+                               secureboot_sign_efi_file "${image}"
+                       fi
                fi
        fi
 
@@ -150,6 +152,10 @@ dist-kernel_install_kernel() {
 # The function will determine whether <kernel-dir> is actually
 # a dist-kernel, and whether initramfs was used.
 #
+# With sys-kernel/installkernel-systemd, or version 8 or greater of
+# sys-kernel/installkernel-gentoo, the generation of the initrd via dracut
+# is handled by kernel-install instead.
+#
 # This function is to be used in pkg_postinst() of ebuilds installing
 # kernel modules that are included in the initramfs.
 dist-kernel_reinstall_initramfs() {
@@ -160,19 +166,23 @@ dist-kernel_reinstall_initramfs() {
        local ver=${2}
 
        local image_path=${kernel_dir}/$(dist-kernel_get_image_path)
-       local initramfs_path=${image_path%/*}/initrd
        if [[ ! -f ${image_path} ]]; then
                eerror "Kernel install missing, image not found:"
                eerror "  ${image_path}"
                eerror "Initramfs will not be updated.  Please reinstall your 
kernel."
                return
        fi
-       if [[ ! -f ${initramfs_path} && ! -f ${initramfs_path%/*}/uki.efi ]]; 
then
-               einfo "No initramfs or uki found at ${image_path}"
-               return
+
+       if has_version "<=sys-kernel/installkernel-gentoo-7"; then
+               local initramfs_path=${image_path%/*}/initrd
+               if [[ ! -f ${initramfs_path} && ! -f 
${initramfs_path%/*}/uki.efi ]]; then
+                       einfo "No initramfs or uki found at ${image_path}"
+                       return
+               fi
+
+               dist-kernel_build_initramfs "${initramfs_path}" "${ver}"
        fi
 
-       dist-kernel_build_initramfs "${initramfs_path}" "${ver}"
        dist-kernel_install_kernel "${ver}" "${image_path}" \
                "${kernel_dir}/System.map"
 }

diff --git a/eclass/kernel-install.eclass b/eclass/kernel-install.eclass
index a0eceae8280b..b4d84f3986c0 100644
--- a/eclass/kernel-install.eclass
+++ b/eclass/kernel-install.eclass
@@ -48,11 +48,21 @@ RESTRICT+="
 
 # note: we need installkernel with initramfs support!
 IDEPEND="
-       || (
-               sys-kernel/installkernel-gentoo
-               sys-kernel/installkernel-systemd
+       !initramfs? (
+               || (
+                       sys-kernel/installkernel-gentoo
+                       sys-kernel/installkernel-systemd
+               )
        )
-       initramfs? ( >=sys-kernel/dracut-059-r4 )"
+       initramfs? (
+               >=sys-kernel/dracut-059-r4
+               || (
+                       <=sys-kernel/installkernel-gentoo-7
+                       >=sys-kernel/installkernel-gentoo-8[dracut(-)]
+                       sys-kernel/installkernel-systemd
+               )
+       )
+"
 # needed by objtool that is installed along with the kernel and used
 # to build external modules
 # NB: linux-mod.eclass also adds this dep but it's cleaner to have
@@ -429,9 +439,13 @@ kernel-install_pkg_preinst() {
 # @FUNCTION: kernel-install_install_all
 # @USAGE: <ver>
 # @DESCRIPTION:
-# Build an initramfs for the kernel and install the kernel.  This is
-# called from pkg_postinst() and pkg_config().  <ver> is the full
-# kernel version.
+# Build an initramfs for the kernel if required and install the kernel.
+# This is called from pkg_postinst() and pkg_config().  <ver> is the
+# full kernel version.
+#
+# With sys-kernel/installkernel-systemd, or version 8 or greater of
+# sys-kernel/installkernel-gentoo, the generation of the initrd via dracut
+# is handled by kernel-install instead.
 kernel-install_install_all() {
        debug-print-function ${FUNCNAME} "${@}"
 
@@ -448,7 +462,7 @@ kernel-install_install_all() {
                nonfatal mount-boot_check_status || break
 
                local image_path=$(dist-kernel_get_image_path)
-               if use initramfs; then
+               if use initramfs && has_version 
"<=sys-kernel/installkernel-gentoo-7"; then
                        # putting it alongside kernel image as 'initrd' makes
                        # kernel-install happier
                        nonfatal dist-kernel_build_initramfs \

Reply via email to