]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Support SplitArtifacts= for extension images
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 23 Apr 2024 12:49:19 +0000 (14:49 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 23 Apr 2024 13:31:51 +0000 (15:31 +0200)
mkosi/__init__.py

index 59b03371725ca7affebbc933e0a00ac621960392..029ca092bf01e75188bb7409851c2f65e0494a7a 100644 (file)
@@ -3432,20 +3432,25 @@ def make_esp(context: Context, uki: Path) -> list[Partition]:
 
 
 def make_extension_image(context: Context, output: Path) -> None:
+    r = context.resources / f"repart/definitions/{context.config.output_format}.repart.d"
+
     cmdline: list[PathString] = [
         "systemd-repart",
         "--root=/buildroot",
+        "--json=pretty",
         "--dry-run=no",
         "--no-pager",
         f"--offline={yes_no(context.config.repart_offline)}",
         "--seed", str(context.config.seed) if context.config.seed else "random",
         "--empty=create",
         "--size=auto",
+        "--definitions", r,
         output,
     ]
     mounts = [
         Mount(output.parent, output.parent),
         Mount(context.root, "/buildroot", ro=True),
+        Mount(r, r, ro=True),
     ]
 
     if not context.config.architecture.is_native():
@@ -3464,29 +3469,33 @@ def make_extension_image(context: Context, output: Path) -> None:
         mounts += [Mount(context.config.verity_certificate, context.config.verity_certificate, ro=True)]
     if context.config.sector_size:
         cmdline += ["--sector-size", str(context.config.sector_size)]
-
-    env = {
-        option: value
-        for option, value in context.config.environment.items()
-        if option.startswith("SYSTEMD_REPART_MKFS_OPTIONS_") or option == "SOURCE_DATE_EPOCH"
-    }
+    if context.config.split_artifacts:
+        cmdline += ["--split=yes"]
 
     with complete_step(f"Building {context.config.output_format} extension image"):
-        r = context.resources / f"repart/definitions/{context.config.output_format}.repart.d"
-        mounts += [Mount(r, r, ro=True)]
-        run(
-            cmdline + ["--definitions", r],
-            env=env,
-            sandbox=context.sandbox(
-                binary="systemd-repart",
-                devices=(
-                    not context.config.repart_offline or
-                    context.config.verity_key_source.type != KeySource.Type.file
+        j = json.loads(
+            run(
+                cmdline,
+                stdout=subprocess.PIPE,
+                env=context.config.environment,
+                sandbox=context.sandbox(
+                    binary="systemd-repart",
+                    devices=(
+                        not context.config.repart_offline or
+                        context.config.verity_key_source.type != KeySource.Type.file
+                    ),
+                    mounts=mounts,
                 ),
-                mounts=mounts,
-            ),
+            ).stdout
         )
 
+    logging.debug(json.dumps(j, indent=4))
+
+    if context.config.split_artifacts:
+        for p in (Partition.from_dict(d) for d in j):
+            if p.split_path:
+                maybe_compress(context, context.config.compress_output, p.split_path)
+
 
 def finalize_staging(context: Context) -> None:
     rmtree(*(context.config.output_dir_or_cwd() / f.name for f in context.staging.iterdir()))