From: Daan De Meyer Date: Tue, 9 Jan 2024 18:48:44 +0000 (+0100) Subject: Mount BuildSources= when executing package managers X-Git-Tag: v20.1~12^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0669645b12ee8580cf8385a8de68d255e85f119e;p=thirdparty%2Fmkosi.git Mount BuildSources= when executing package managers Users might have local packages which need to be mounted into the sandbox as well. Let's make this possible by using BuildSources=. --- diff --git a/mkosi/__init__.py b/mkosi/__init__.py index be8e46cd4..62e0fbd51 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -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( diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index 0ccecebf0..83b9a7967 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -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 []) ), diff --git a/mkosi/installer/dnf.py b/mkosi/installer/dnf.py index 8a7c283f6..dd2d5a7cf 100644 --- a/mkosi/installer/dnf.py +++ b/mkosi/installer/dnf.py @@ -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 []) ), diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py index 993aeaebf..beb4258f7 100644 --- a/mkosi/installer/pacman.py +++ b/mkosi/installer/pacman.py @@ -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 []) ), diff --git a/mkosi/installer/zypper.py b/mkosi/installer/zypper.py index 91e0caadd..6457b4bcc 100644 --- a/mkosi/installer/zypper.py +++ b/mkosi/installer/zypper.py @@ -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 []) ), diff --git a/mkosi/mounts.py b/mkosi/mounts.py index 9fc75d5c0..4ccb179f9 100644 --- a/mkosi/mounts.py +++ b/mkosi/mounts.py @@ -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