]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Add "none" output format 1635/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 20 Jun 2023 15:40:49 +0000 (17:40 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 20 Jun 2023 15:40:49 +0000 (17:40 +0200)
This is a re-implementation of the --skip-final-phase option, but
instead of doing it via an option, we do it via a new output format,
which feels much more natural. In combination with mounting the
staging directory into the build script, this allows using mkosi to
produce arbitrary artifacts using the build script.

mkosi.md
mkosi/__init__.py
mkosi/util.py

index 9cc16085f6d5096008d6e7e4c994db25d0dc6c42..a4cdbde7224cbae749ed0c833211f21b2f08d0f6 100644 (file)
--- a/mkosi.md
+++ b/mkosi.md
@@ -399,7 +399,9 @@ they should be specified with a boolean argument: either "1", "yes", or "true" t
 : The image format type to generate. One of `directory` (for generating OS
   images inside a local directory), `tar` (similar, but a tarball of the
   image is generated), `cpio` (similar, but a cpio archive is generated),
-  `disk` (a block device image with a GPT partition table).
+  `disk` (a block device image with a GPT partition table) or `none`
+  (the image is solely intended as a build image to produce another
+  artifact).
 
 `ManifestFormat=`, `--manifest-format=`
 
index 23008cd0647493840231770716cf62f52864f2a2..9ee596aff9f5ac51db1909b245c91d38b0b7388c 100644 (file)
@@ -1692,6 +1692,14 @@ def make_image(state: MkosiState, skip: Sequence[str] = [], split: bool = False)
     return f"roothash={roothash}" if roothash else f"usrhash={usrhash}" if usrhash else None, split_paths
 
 
+def finalize_staging(state: MkosiState) -> None:
+    for f in state.staging.iterdir():
+        if not f.is_dir():
+            os.chown(f, state.uid, state.gid)
+
+        shutil.move(f, state.config.output_dir)
+
+
 def build_image(args: MkosiArgs, config: MkosiConfig, uid: int, gid: int) -> None:
     state = MkosiState(args, config, uid, gid)
     manifest = Manifest(config)
@@ -1719,6 +1727,11 @@ def build_image(args: MkosiArgs, config: MkosiConfig, uid: int, gid: int) -> Non
             configure_autologin(state)
             configure_initrd(state)
             run_build_script(state)
+
+            if state.config.output_format == OutputFormat.none:
+                finalize_staging(state)
+                return
+
             install_build_dest(state)
             install_extra_trees(state)
             install_boot_loader(state)
@@ -1759,11 +1772,7 @@ def build_image(args: MkosiArgs, config: MkosiConfig, uid: int, gid: int) -> Non
         calculate_signature(state)
         save_manifest(state, manifest)
 
-        for f in state.staging.iterdir():
-            if not f.is_dir():
-                os.chown(f, uid, gid)
-
-            shutil.move(f, state.config.output_dir)
+        finalize_staging(state)
 
         output_base = state.config.output_dir.joinpath(state.config.output)
         if not output_base.exists() or output_base.is_symlink():
index 546df0cc7ebc0bc7ab4459932a981d43fa5f93b7..2317e2cab0a76b06b64101606bf6b9df47592033 100644 (file)
@@ -174,6 +174,7 @@ class OutputFormat(str, enum.Enum):
     tar = "tar"
     cpio = "cpio"
     disk = "disk"
+    none = "none"
 
 
 class ManifestFormat(str, enum.Enum):