]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Mount BuildSources= when executing package managers
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 9 Jan 2024 18:48:44 +0000 (19:48 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 9 Jan 2024 20:18:00 +0000 (21:18 +0100)
Users might have local packages which need to be mounted into the
sandbox as well. Let's make this possible by using BuildSources=.

mkosi/__init__.py
mkosi/installer/apt.py
mkosi/installer/dnf.py
mkosi/installer/pacman.py
mkosi/installer/zypper.py
mkosi/mounts.py

index be8e46cd47f9d5cbc052a0194501bf2a822266f9..62e0fbd51ed0af22c1913481f518c27065ac3e57 100644 (file)
@@ -52,7 +52,7 @@ from mkosi.installer import clean_package_manager_metadata, package_manager_scri
 from mkosi.kmod import gen_required_kernel_modules, process_kernel_modules
 from mkosi.log import ARG_DEBUG, complete_step, die, log_notice, log_step
 from mkosi.manifest import Manifest
-from mkosi.mounts import mount_overlay
+from mkosi.mounts import finalize_ephemeral_source_mounts, mount_overlay
 from mkosi.pager import page
 from mkosi.partition import Partition, finalize_root, finalize_roothash
 from mkosi.qemu import KernelType, copy_ephemeral, run_qemu, run_ssh
@@ -345,22 +345,6 @@ def mount_build_overlay(context: Context, volatile: bool = False) -> Iterator[Pa
         yield context.root
 
 
-@contextlib.contextmanager
-def finalize_source_mounts(config: Config) -> Iterator[list[PathString]]:
-    with contextlib.ExitStack() as stack:
-        mounts = [
-            (stack.enter_context(mount_overlay([source])) if config.build_sources_ephemeral else source, target)
-            for source, target
-            in (t.with_prefix(Path("/work/src")) for t in config.build_sources)
-        ]
-
-        options: list[PathString] = ["--dir", "/work/src"]
-        for src, target in sorted(set(mounts), key=lambda s: s[1]):
-            options += ["--bind", src, target]
-
-        yield options
-
-
 @contextlib.contextmanager
 def finalize_scripts(scripts: Mapping[str, Sequence[PathString]] = {}) -> Iterator[Path]:
     with tempfile.TemporaryDirectory(prefix="mkosi-scripts") as d:
@@ -436,7 +420,7 @@ def run_prepare_scripts(context: Context, build: bool) -> None:
             step_msg = "Running prepare script {}…"
             arg = "final"
 
-        sources = stack.enter_context(finalize_source_mounts(context.config))
+        sources = stack.enter_context(finalize_ephemeral_source_mounts(context.config))
         cd = stack.enter_context(finalize_chroot_scripts(context))
 
         for script in context.config.prepare_scripts:
@@ -511,7 +495,7 @@ def run_build_scripts(context: Context) -> None:
     with (
         mount_build_overlay(context, volatile=True),
         finalize_chroot_scripts(context) as cd,
-        finalize_source_mounts(context.config) as sources,
+        finalize_ephemeral_source_mounts(context.config) as sources,
     ):
         for script in context.config.build_scripts:
             chroot = chroot_cmd(
@@ -580,7 +564,7 @@ def run_postinst_scripts(context: Context) -> None:
 
     with (
         finalize_chroot_scripts(context) as cd,
-        finalize_source_mounts(context.config) as sources,
+        finalize_ephemeral_source_mounts(context.config) as sources,
     ):
         for script in context.config.postinst_scripts:
             chroot = chroot_cmd(
@@ -640,7 +624,7 @@ def run_finalize_scripts(context: Context) -> None:
 
     with (
         finalize_chroot_scripts(context) as cd,
-        finalize_source_mounts(context.config) as sources,
+        finalize_ephemeral_source_mounts(context.config) as sources,
     ):
         for script in context.config.finalize_scripts:
             chroot = chroot_cmd(
index 0ccecebf07085714917ce9b4ebc7b74885572c85..83b9a79672efd0d31d53f3834d42aed12459362b 100644 (file)
@@ -3,6 +3,7 @@ import textwrap
 from collections.abc import Sequence
 
 from mkosi.context import Context
+from mkosi.mounts import finalize_source_mounts
 from mkosi.run import find_binary, run
 from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
 from mkosi.types import PathString
@@ -111,7 +112,9 @@ def invoke_apt(
                     "--bind", context.cache_dir / "cache/apt", context.cache_dir / "cache/apt",
                     "--ro-bind", context.workspace / "apt.conf", context.workspace / "apt.conf",
                     *finalize_crypto_mounts(tools=context.config.tools()),
+                    *finalize_source_mounts(context.config),
                     *mounts,
+                    "--chdir", "/work/src",
                 ],
             ) + (apivfs_cmd(context.root) if apivfs else [])
         ),
index 8a7c283f6cdf0211ef26d97fe081c6275ea80278..dd2d5a7cf4190cd14e331b9386334b0115b7d9b7 100644 (file)
@@ -5,6 +5,7 @@ from pathlib import Path
 
 from mkosi.context import Context
 from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm
+from mkosi.mounts import finalize_source_mounts
 from mkosi.run import find_binary, run
 from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
 from mkosi.types import PathString
@@ -138,6 +139,8 @@ def invoke_dnf(context: Context, command: str, packages: Iterable[str], apivfs:
                     context.cache_dir / "lib" / dnf_subdir(context),
                     context.cache_dir / "lib" / dnf_subdir(context),
                     *finalize_crypto_mounts(tools=context.config.tools()),
+                    *finalize_source_mounts(context.config),
+                    "--chdir", "/work/src",
                 ],
             ) + (apivfs_cmd(context.root) if apivfs else [])
         ),
index 993aeaebff22911f25663b6f01739113af5ef1fc..beb4258f730346c86c6bb5d7092621df883a6324 100644 (file)
@@ -4,6 +4,7 @@ from collections.abc import Iterable, Sequence
 from typing import NamedTuple
 
 from mkosi.context import Context
+from mkosi.mounts import finalize_source_mounts
 from mkosi.run import run
 from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
 from mkosi.types import PathString
@@ -98,6 +99,8 @@ def invoke_pacman(
                     "--bind", context.root, context.root,
                     "--bind", context.cache_dir / "cache/pacman/pkg", context.cache_dir / "cache/pacman/pkg",
                     *finalize_crypto_mounts(tools=context.config.tools()),
+                    *finalize_source_mounts(context.config),
+                    "--chdir", "/work/src",
                 ],
             ) + (apivfs_cmd(context.root) if apivfs else [])
         ),
index 91e0caadd3424c4af559534ff67c4b8cf6247bd6..6457b4bcccb30263ece0da78cc8b6206561cbeac 100644 (file)
@@ -5,6 +5,7 @@ from collections.abc import Sequence
 from mkosi.config import yes_no
 from mkosi.context import Context
 from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm
+from mkosi.mounts import finalize_source_mounts
 from mkosi.run import run
 from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
 from mkosi.types import PathString
@@ -86,6 +87,8 @@ def invoke_zypper(
                     "--bind", context.root, context.root,
                     "--bind", context.cache_dir / "cache/zypp", context.cache_dir / "cache/zypp",
                     *finalize_crypto_mounts(tools=context.config.tools()),
+                    *finalize_source_mounts(context.config),
+                    "--chdir", "/work/src",
                 ],
             ) + (apivfs_cmd(context.root) if apivfs else [])
         ),
index 9fc75d5c0140e45a6e27f7c89fb9b50227ddf108..4ccb179f9d546542ec78381afc8b87711fdc9751 100644 (file)
@@ -9,6 +9,7 @@ from collections.abc import Iterator, Sequence
 from pathlib import Path
 from typing import Optional
 
+from mkosi.config import Config
 from mkosi.run import run
 from mkosi.types import PathString
 from mkosi.util import umask
@@ -119,3 +120,29 @@ def mount_overlay(
                 yield where
         finally:
             delete_whiteout_files(upperdir)
+
+
+def finalize_source_mounts(config: Config) -> list[PathString]:
+    mounts = {t.with_prefix(Path("/work/src")) for t in config.build_sources}
+
+    options: list[PathString] = ["--dir", "/work/src"]
+    for src, target in sorted(mounts, key=lambda s: s[1]):
+        options += ["--ro-bind", src, target]
+
+    return options
+
+
+@contextlib.contextmanager
+def finalize_ephemeral_source_mounts(config: Config) -> Iterator[list[PathString]]:
+    with contextlib.ExitStack() as stack:
+        mounts = (
+            (stack.enter_context(mount_overlay([source])) if config.build_sources_ephemeral else source, target)
+            for source, target
+            in {t.with_prefix(Path("/work/src")) for t in config.build_sources}
+        )
+
+        options: list[PathString] = ["--dir", "/work/src"]
+        for src, target in sorted(mounts, key=lambda s: s[1]):
+            options += ["--bind", src, target]
+
+        yield options