]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Stop mounting build sources when running package managers
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 22 Jul 2024 05:46:13 +0000 (07:46 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 22 Jul 2024 08:01:26 +0000 (10:01 +0200)
We now have PackageDirectories= to make local packages available
for installation so let's stop mounting build sources when running
package managers and tell users to use PackageDirectories= instead.

NEWS.md
mkosi/installer/apt.py
mkosi/installer/dnf.py
mkosi/installer/pacman.py
mkosi/installer/zypper.py
mkosi/resources/mkosi.md

diff --git a/NEWS.md b/NEWS.md
index fa8274d48a240b5a25d3e5fcf463975e6a7b4866..01efe912d61558e3960504256c3b807b5d8a5897 100644 (file)
--- a/NEWS.md
+++ b/NEWS.md
@@ -6,6 +6,9 @@
   other architectures) has been removed. The required `console=`
   argument to have the kernel output to the serial console has to be
   added manually from `v24` onwards.
+- Support for installing local packages located in directories in
+  `BuildSources=` was dropped. Instead, the packages can be made
+  available for installation via `PackageManagerTrees=`.
 
 ## v23.1
 
index 2dd816d1f56d7c740db55d60f3f7192cc9eb4950..77225755767fd096e173c9e7704f18b9eb17f427 100644 (file)
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 
 import dataclasses
-import os
 import textwrap
 from collections.abc import Iterable, Sequence
 from pathlib import Path
@@ -11,7 +10,6 @@ from mkosi.config import PACKAGE_GLOBS, Config, ConfigFeature
 from mkosi.context import Context
 from mkosi.installer import PackageManager
 from mkosi.log import die
-from mkosi.mounts import finalize_source_mounts
 from mkosi.run import run
 from mkosi.sandbox import Mount, apivfs_cmd
 from mkosi.types import _FILE, CompletedProcess, PathString
@@ -213,25 +211,20 @@ class Apt(PackageManager):
         mounts: Sequence[Mount] = (),
         stdout: _FILE = None,
     ) -> CompletedProcess:
-        with finalize_source_mounts(
-            context.config,
-            ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral,
-        ) as sources:
-            return run(
-                cls.cmd(context, "apt-get") + [operation, *arguments],
-                sandbox=(
-                    context.sandbox(
-                        binary="apt-get",
-                        network=True,
-                        vartmp=True,
-                        mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources, *mounts],
-                        options=["--dir", "/work/src", "--chdir", "/work/src"],
-                        extra=apivfs_cmd() if apivfs else []
-                    )
-                ),
-                env=context.config.environment | cls.finalize_environment(context),
-                stdout=stdout,
-            )
+        return run(
+            cls.cmd(context, "apt-get") + [operation, *arguments],
+            sandbox=(
+                context.sandbox(
+                    binary="apt-get",
+                    network=True,
+                    vartmp=True,
+                    mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *mounts],
+                    extra=apivfs_cmd() if apivfs else []
+                )
+            ),
+            env=context.config.environment | cls.finalize_environment(context),
+            stdout=stdout,
+        )
 
     @classmethod
     def sync(cls, context: Context, force: bool) -> None:
index 12b77b889d79b0257599339fa46a069f8f10d7ae..10e230f3a9988b4b6367bd3d75bb95d9c4954c3e 100644 (file)
@@ -1,5 +1,4 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
-import os
 import textwrap
 from collections.abc import Iterable, Sequence
 from pathlib import Path
@@ -9,7 +8,6 @@ from mkosi.context import Context
 from mkosi.installer import PackageManager
 from mkosi.installer.rpm import RpmRepository, rpm_cmd
 from mkosi.log import ARG_DEBUG
-from mkosi.mounts import finalize_source_mounts
 from mkosi.run import run
 from mkosi.sandbox import Mount, apivfs_cmd
 from mkosi.types import _FILE, CompletedProcess, PathString
@@ -194,25 +192,20 @@ class Dnf(PackageManager):
         cached_metadata: bool = True,
     ) -> CompletedProcess:
         try:
-            with finalize_source_mounts(
-                context.config,
-                ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral,
-            ) as sources:
-                return run(
-                    cls.cmd(context, cached_metadata=cached_metadata) + [operation, *arguments],
-                    sandbox=(
-                        context.sandbox(
-                            binary=cls.executable(context.config),
-                            network=True,
-                            vartmp=True,
-                            mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources],
-                            options=["--dir", "/work/src", "--chdir", "/work/src"],
-                            extra=apivfs_cmd() if apivfs else [],
-                        )
-                    ),
-                    env=context.config.environment | cls.finalize_environment(context),
-                    stdout=stdout,
-                )
+            return run(
+                cls.cmd(context, cached_metadata=cached_metadata) + [operation, *arguments],
+                sandbox=(
+                    context.sandbox(
+                        binary=cls.executable(context.config),
+                        network=True,
+                        vartmp=True,
+                        mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context)],
+                        extra=apivfs_cmd() if apivfs else [],
+                    )
+                ),
+                env=context.config.environment | cls.finalize_environment(context),
+                stdout=stdout,
+            )
         finally:
             # dnf interprets the log directory relative to the install root so there's nothing we can do but to remove
             # the log files from the install root afterwards.
index cc17987c2a6854ec9a6a7c2da2b34d00227c043c..b3219a9172a40f9f9fc91e373b3e987613297ed4 100644 (file)
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 
 import dataclasses
-import os
 import shutil
 import textwrap
 from collections.abc import Iterable, Sequence
@@ -10,7 +9,6 @@ from pathlib import Path
 from mkosi.config import Config
 from mkosi.context import Context
 from mkosi.installer import PackageManager
-from mkosi.mounts import finalize_source_mounts
 from mkosi.run import run
 from mkosi.sandbox import Mount, apivfs_cmd
 from mkosi.types import _FILE, CompletedProcess, PathString
@@ -162,25 +160,20 @@ class Pacman(PackageManager):
         apivfs: bool = False,
         stdout: _FILE = None,
     ) -> CompletedProcess:
-        with finalize_source_mounts(
-            context.config,
-            ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral,
-        ) as sources:
-            return run(
-                cls.cmd(context) + [operation, *arguments],
-                sandbox=(
-                    context.sandbox(
-                        binary="pacman",
-                        network=True,
-                        vartmp=True,
-                        mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources],
-                        options=["--dir", "/work/src", "--chdir", "/work/src"],
-                        extra=apivfs_cmd() if apivfs else [],
-                    )
-                ),
-                env=context.config.environment | cls.finalize_environment(context),
-                stdout=stdout,
-            )
+        return run(
+            cls.cmd(context) + [operation, *arguments],
+            sandbox=(
+                context.sandbox(
+                    binary="pacman",
+                    network=True,
+                    vartmp=True,
+                    mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context)],
+                    extra=apivfs_cmd() if apivfs else [],
+                )
+            ),
+            env=context.config.environment | cls.finalize_environment(context),
+            stdout=stdout,
+        )
 
     @classmethod
     def sync(cls, context: Context, force: bool) -> None:
index b93c27096f9dc8d35c4093fade1391f23abc5f22..d58c6a6b888e5c821c62010caf82bbb56e9456a0 100644 (file)
@@ -1,6 +1,5 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 import hashlib
-import os
 import textwrap
 from collections.abc import Iterable, Sequence
 from pathlib import Path
@@ -9,7 +8,6 @@ from mkosi.config import Config, yes_no
 from mkosi.context import Context
 from mkosi.installer import PackageManager
 from mkosi.installer.rpm import RpmRepository, rpm_cmd
-from mkosi.mounts import finalize_source_mounts
 from mkosi.run import run
 from mkosi.sandbox import Mount, apivfs_cmd
 from mkosi.types import _FILE, CompletedProcess, PathString
@@ -127,25 +125,20 @@ class Zypper(PackageManager):
         apivfs: bool = False,
         stdout: _FILE = None,
     ) -> CompletedProcess:
-        with finalize_source_mounts(
-            context.config,
-            ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral,
-        ) as sources:
-            return run(
-                cls.cmd(context) + [operation, *arguments],
-                sandbox=(
-                    context.sandbox(
-                        binary="zypper",
-                        network=True,
-                        vartmp=True,
-                        mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources],
-                        options=["--dir", "/work/src", "--chdir", "/work/src"],
-                        extra=apivfs_cmd() if apivfs else [],
-                    )
-                ),
-                env=context.config.environment | cls.finalize_environment(context),
-                stdout=stdout,
-            )
+        return run(
+            cls.cmd(context) + [operation, *arguments],
+            sandbox=(
+                context.sandbox(
+                    binary="zypper",
+                    network=True,
+                    vartmp=True,
+                    mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context)],
+                    extra=apivfs_cmd() if apivfs else [],
+                )
+            ),
+            env=context.config.environment | cls.finalize_environment(context),
+            stdout=stdout,
+        )
 
     @classmethod
     def sync(cls, context: Context, force: bool, arguments: Sequence[str] = ()) -> None:
index bf34a42b128ef291648c365d2c2603818327c4a0..3438ec66b75b4d0eb8f291b7f913e26e7862d848 100644 (file)
@@ -736,17 +736,6 @@ boolean argument: either `1`, `yes`, or `true` to enable, or `0`, `no`,
              python3dist(mypy)
     ```
 
-    Note that since mkosi runs in a sandbox with most of the host files
-    unavailable, any local packages have to be mounted into the sandbox
-    explicitly using `BuildSources=`. For example, let's say we have a
-    local package located at `../my-packages/abc.rpm` relative to the mkosi
-    working directory, then we'd be able to install it as follows:
-
-    ```ini
-    BuildSources=../my-packages:my-packages-in-sandbox
-    Packages=my-packages-in-sandbox/abc.rpm
-    ```
-
 `BuildPackages=`, `--build-package=`
 :   Similar to `Packages=`, but configures packages to install only in an
     overlay that is made available on top of the image to the prepare