diff --git a/mkosi/initrd.py b/mkosi/initrd.py index 075a9ae18..048f349e4 100644 --- a/mkosi/initrd.py +++ b/mkosi/initrd.py @@ -1,12 +1,15 @@ # SPDX-License-Identifier: LGPL-2.1-or-later import argparse +import json import os import platform import shutil +import subprocess import sys import tempfile from pathlib import Path +from typing import Optional, cast import mkosi.resources from mkosi.config import DocFormat, OutputFormat @@ -18,6 +21,31 @@ from mkosi.util import resource_path +def get_layout_output_dir() -> tuple[Optional[str], str]: + layout = "" + output_dir = "/boot" + + if find_binary("kernel-install"): + output = json.loads( + run( + ["kernel-install", "--json=short", "inspect"], + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + check=False, + ).stdout + ) + layout = cast(str, output["Layout"]) + if layout in ("bls", "uki"): + boot_root = cast(str, output["BootRoot"]) + if layout == "bls": + entry_token = cast(str, output["EntryToken"]) + output_dir = f"{boot_root}/{entry_token}" + else: + output_dir = f"{boot_root}/EFI/Linux" + + return (layout or None, output_dir) + + @uncaught_exception_handler() def main() -> None: log_setup() @@ -88,6 +116,15 @@ def main() -> None: show_docs("mkosi-initrd", DocFormat.all(), resources=r) return + if not args.output_dir: + layout, args.output_dir = get_layout_output_dir() + if layout == "bls": + args.output_dir += "/" + args.kernel_version + if not Path(args.output_dir).is_dir(): + args.output_dir = "" + elif layout == "other" and args.output == "initrd": + args.output += "-" + args.kernel_version + cmdline: list[PathString] = [ "mkosi", "--force",