return
with complete_step(f"Installing extra packages for {context.config.distribution.pretty_name()}"):
- context.config.distribution.install_packages(context, context.config.packages)
+ context.config.distribution.package_manager(context.config).install(
+ context, context.config.packages
+ )
else:
if context.config.overlay or context.config.output_format.is_extension_image():
if context.config.packages:
(context.root / "boot/loader/entries.srel").write_text("type1\n")
if context.config.packages:
- context.config.distribution.install_packages(context, context.config.packages)
+ context.config.distribution.package_manager(context.config).install(
+ context, context.config.packages
+ )
for f in (
"var/lib/systemd/random-seed",
complete_step(f"Installing build packages for {context.config.distribution.pretty_name()}"),
setup_build_overlay(context),
):
- context.config.distribution.install_packages(context, context.config.build_packages)
+ context.config.distribution.package_manager(context.config).install(
+ context, context.config.build_packages
+ )
def install_volatile_packages(context: Context) -> None:
return
with complete_step(f"Installing volatile packages for {context.config.distribution.pretty_name()}"):
- context.config.distribution.install_packages(context, context.config.volatile_packages)
+ context.config.distribution.package_manager(context.config).install(
+ context, context.config.volatile_packages
+ )
def remove_packages(context: Context) -> None:
with complete_step(f"Removing {len(context.config.remove_packages)} packages…"):
try:
- context.config.distribution.remove_packages(context, context.config.remove_packages)
+ context.config.distribution.package_manager(context.config).remove(
+ context, context.config.remove_packages
+ )
except NotImplementedError:
die(f"Removing packages is not supported for {context.config.distribution}")
import enum
import importlib
import urllib.parse
-from collections.abc import Sequence
from pathlib import Path
from typing import TYPE_CHECKING, Optional, cast
def install(cls, context: "Context") -> None:
raise NotImplementedError
- @classmethod
- def install_packages(cls, context: "Context", packages: Sequence[str]) -> None:
- raise NotImplementedError
-
- @classmethod
- def remove_packages(cls, context: "Context", packages: Sequence[str]) -> None:
- raise NotImplementedError
-
@classmethod
def filesystem(cls) -> str:
return "ext4"
def install(self, context: "Context") -> None:
return self.installer().install(context)
- def install_packages(self, context: "Context", packages: Sequence[str]) -> None:
- return self.installer().install_packages(context, packages)
-
- def remove_packages(self, context: "Context", packages: Sequence[str]) -> None:
- return self.installer().remove_packages(context, packages)
-
def filesystem(self) -> str:
return self.installer().filesystem()
# SPDX-License-Identifier: LGPL-2.1-or-later
import tempfile
-from collections.abc import Iterable, Sequence
+from collections.abc import Iterable
from pathlib import Path
from mkosi.archive import extract_tar
@classmethod
def install(cls, context: Context) -> None:
- cls.install_packages(context, ["filesystem"], apivfs=False)
-
- @classmethod
- def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None:
- Pacman.invoke(
- context,
- "--sync",
- ["--needed", "--assume-installed", "initramfs", *packages],
- apivfs=apivfs,
- )
-
- @classmethod
- def remove_packages(cls, context: Context, packages: Sequence[str]) -> None:
- Pacman.invoke(context, "--remove", ["--nosave", "--recursive", *packages], apivfs=True)
+ Pacman.install(context, ["filesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[PacmanRepository]:
@classmethod
def install(cls, context: Context) -> None:
- cls.install_packages(context, ["filesystem", "azurelinux-release"], apivfs=False)
+ Dnf.install(context, ["filesystem", "azurelinux-release"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
# SPDX-License-Identifier: LGPL-2.1-or-later
-from collections.abc import Iterable, Sequence
+from collections.abc import Iterable
from mkosi.config import Architecture, Config
from mkosi.context import Context
@classmethod
def install(cls, context: Context) -> None:
- cls.install_packages(context, ["basesystem"], apivfs=False)
-
- @classmethod
- def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None:
- Dnf.invoke(context, "install", packages, apivfs=apivfs)
-
- @classmethod
- def remove_packages(cls, context: Context, packages: Sequence[str]) -> None:
- Dnf.invoke(context, "remove", packages, apivfs=True)
+ Dnf.install(context, ["basesystem"], apivfs=False)
@classmethod
def architecture(cls, arch: Architecture) -> str:
# SPDX-License-Identifier: LGPL-2.1-or-later
-from collections.abc import Sequence
from mkosi.config import Architecture, Config
from mkosi.context import Context
from mkosi.distributions import DistributionInstaller
from mkosi.installer import PackageManager
-from mkosi.log import die
class Installer(DistributionInstaller):
@classmethod
def install(cls, context: Context) -> None:
pass
-
- @classmethod
- def install_packages(cls, context: Context, packages: Sequence[str]) -> None:
- if packages:
- die("Installing packages is not supported for custom distributions'")
-
- @classmethod
- def remove_packages(cls, context: Context, packages: Sequence[str]) -> None:
- if packages:
- die("Removing packages is not supported for custom distributions")
# SPDX-License-Identifier: LGPL-2.1-or-later
+import itertools
import tempfile
-from collections.abc import Iterable, Sequence
+from collections.abc import Iterable
from pathlib import Path
from mkosi.archive import extract_tar
# Finally, run apt to properly install packages in the chroot without having to worry that maintainer
# scripts won't find basic tools that they depend on.
- cls.install_packages(
- context, [Path(deb).name.partition("_")[0].removesuffix(".deb") for deb in essential]
- )
+ Apt.install(context, [Path(deb).name.partition("_")[0].removesuffix(".deb") for deb in essential])
fixup_os_release(context)
- @classmethod
- def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None:
- Apt.invoke(context, "install", packages, apivfs=apivfs)
- install_apt_sources(context, cls.repositories(context, local=False))
-
- # systemd-gpt-auto-generator is disabled by default in Ubuntu:
- # https://git.launchpad.net/ubuntu/+source/systemd/tree/debian/systemd.links?h=ubuntu/noble-proposed.
- # Let's make sure it is enabled by default in our images.
- (context.root / "etc/systemd/system-generators/systemd-gpt-auto-generator").unlink(missing_ok=True)
-
- @classmethod
- def remove_packages(cls, context: Context, packages: Sequence[str]) -> None:
- Apt.invoke(context, "purge", packages, apivfs=True)
+ if "apt" in itertools.chain(context.config.packages, context.config.volatile_packages):
+ install_apt_sources(context, cls.repositories(context, local=False))
@classmethod
def architecture(cls, arch: Architecture) -> str:
import re
import subprocess
import tempfile
-from collections.abc import Iterable, Sequence
+from collections.abc import Iterable
from pathlib import Path
from mkosi.config import Architecture, Config
@classmethod
def install(cls, context: Context) -> None:
- cls.install_packages(context, ["basesystem"], apivfs=False)
-
- @classmethod
- def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None:
- Dnf.invoke(context, "install", packages, apivfs=apivfs)
-
- @classmethod
- def remove_packages(cls, context: Context, packages: Sequence[str]) -> None:
- Dnf.invoke(context, "remove", packages, apivfs=True)
+ Dnf.install(context, ["basesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
from mkosi.config import Architecture
from mkosi.context import Context
from mkosi.distributions import fedora, join_mirror
+from mkosi.installer.dnf import Dnf
from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
from mkosi.log import die
@classmethod
def install(cls, context: Context) -> None:
- cls.install_packages(context, ["filesystem"], apivfs=False)
+ Dnf.install(context, ["filesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
from mkosi.config import Architecture
from mkosi.context import Context
from mkosi.distributions import fedora, join_mirror
+from mkosi.installer.dnf import Dnf
from mkosi.installer.rpm import RpmRepository, find_rpm_gpgkey
from mkosi.log import die
@classmethod
def install(cls, context: Context) -> None:
- cls.install_packages(context, ["filesystem"], apivfs=False)
+ Dnf.install(context, ["filesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
# SPDX-License-Identifier: LGPL-2.1-or-later
import tempfile
-from collections.abc import Iterable, Sequence
+from collections.abc import Iterable
from pathlib import Path
from xml.etree import ElementTree
@classmethod
def install(cls, context: Context) -> None:
- cls.install_packages(context, ["filesystem"], apivfs=False)
-
- @classmethod
- def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None:
- if context.config.find_binary("zypper"):
- Zypper.invoke(
- context,
- "install",
- [
- "--download", "in-advance",
- "--recommends" if context.config.with_recommends else "--no-recommends",
- *packages,
- ],
- apivfs=apivfs,
- ) # fmt: skip
- else:
- Dnf.invoke(context, "install", packages, apivfs=apivfs)
-
- @classmethod
- def remove_packages(cls, context: Context, packages: Sequence[str]) -> None:
- if context.config.find_binary("zypper"):
- Zypper.invoke(context, "remove", ["--clean-deps", *packages], apivfs=True)
- else:
- Dnf.invoke(context, "remove", packages, apivfs=True)
+ cls.package_manager(context.config).install(context, ["filesystem"], apivfs=False)
@classmethod
def repositories(cls, context: Context) -> Iterable[RpmRepository]:
],
) # fmt: skip
+ @classmethod
+ def install(
+ cls,
+ context: Context,
+ packages: Sequence[str],
+ *,
+ apivfs: bool = True,
+ ) -> None:
+ pass
+
+ @classmethod
+ def remove(cls, context: Context, packages: Sequence[str]) -> None:
+ pass
+
@classmethod
def sync(cls, context: Context, force: bool) -> None:
pass
stdout=stdout,
)
+ @classmethod
+ def install(
+ cls,
+ context: Context,
+ packages: Sequence[str],
+ *,
+ apivfs: bool = True,
+ ) -> None:
+ cls.invoke(context, "install", packages, apivfs=apivfs)
+
+ # systemd-gpt-auto-generator is disabled by default in Ubuntu:
+ # https://git.launchpad.net/ubuntu/+source/systemd/tree/debian/systemd.links?h=ubuntu/noble-proposed.
+ # Let's make sure it is enabled by default in our images.
+ (context.root / "etc/systemd/system-generators/systemd-gpt-auto-generator").unlink(missing_ok=True)
+
+ @classmethod
+ def remove(cls, context: Context, packages: Sequence[str]) -> None:
+ cls.invoke(context, "purge", packages, apivfs=True)
+
@classmethod
def sync(cls, context: Context, force: bool) -> None:
cls.invoke(context, "update")
if any(p.name.startswith(prefix) for prefix in ("dnf", "hawkey", "yum")):
p.unlink()
+ @classmethod
+ def install(
+ cls,
+ context: Context,
+ packages: Sequence[str],
+ *,
+ apivfs: bool = True,
+ ) -> None:
+ cls.invoke(context, "install", packages, apivfs=apivfs)
+
+ @classmethod
+ def remove(cls, context: Context, packages: Sequence[str]) -> None:
+ cls.invoke(context, "remove", packages, apivfs=True)
+
@classmethod
def sync(cls, context: Context, force: bool, arguments: Sequence[str] = ()) -> None:
cls.invoke(
stdout=stdout,
)
+ @classmethod
+ def install(
+ cls,
+ context: Context,
+ packages: Sequence[str],
+ *,
+ apivfs: bool = True,
+ ) -> None:
+ arguments = ["--needed", "--assume-installed", "initramfs", *packages]
+ cls.invoke(context, "--sync", arguments, apivfs=apivfs)
+
+ @classmethod
+ def remove(cls, context: Context, packages: Sequence[str]) -> None:
+ cls.invoke(context, "--remove", ["--nosave", "--recursive", *packages], apivfs=True)
+
@classmethod
def keyring(cls, context: Context) -> None:
def sandbox() -> AbstractContextManager[list[PathString]]:
stdout=stdout,
)
+ @classmethod
+ def install(
+ cls,
+ context: Context,
+ packages: Sequence[str],
+ *,
+ apivfs: bool = True,
+ ) -> None:
+ arguments = [
+ "--download", "in-advance",
+ "--recommends" if context.config.with_recommends else "--no-recommends",
+ *packages,
+ ] # fmt: skip
+
+ cls.invoke(context, "install", arguments, apivfs=apivfs)
+
+ @classmethod
+ def remove(cls, context: Context, packages: Sequence[str]) -> None:
+ cls.invoke(context, "remove", ["--clean-deps", *packages], apivfs=True)
+
@classmethod
def sync(cls, context: Context, force: bool, arguments: Sequence[str] = ()) -> None:
cls.invoke(context, "refresh", [*(["--force"] if force else []), *arguments])