From 52a82bcfc9ea627c12ae32f3065b1582dfbf864b Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Wed, 16 Apr 2025 14:04:33 +0200 Subject: [PATCH] mkosi: Reuse main image prepare scripts in subimages In the subimages we also want to make sure all dependencies of the systemd packages are cached so reuse the same prepare scripts from the main image to do that. We only want required dependencies in the subimages, not recommended or suggested dependendencies, so add an environment variable $SYSTEMD_REQUIRED_DEPS_ONLY which the prepare scripts can check for and enable it for the subimages. --- mkosi/mkosi.conf.d/arch/mkosi.prepare | 18 ++++++++++-------- mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare | 7 ++++++- mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare | 9 +++++++-- mkosi/mkosi.conf.d/opensuse/mkosi.prepare | 6 +++++- mkosi/mkosi.images/exitrd/mkosi.conf | 3 +++ .../mkosi.images/exitrd/mkosi.conf.d/arch.conf | 1 + .../exitrd/mkosi.conf.d/centos-fedora.conf | 1 + .../exitrd/mkosi.conf.d/debian.conf | 1 + .../exitrd/mkosi.conf.d/opensuse.conf | 1 + .../exitrd/mkosi.conf.d/ubuntu.conf | 1 + mkosi/mkosi.images/initrd/mkosi.conf | 3 +++ .../mkosi.images/initrd/mkosi.conf.d/arch.conf | 1 + .../initrd/mkosi.conf.d/centos-fedora.conf | 1 + .../initrd/mkosi.conf.d/debian-ubuntu.conf | 1 + .../initrd/mkosi.conf.d/opensuse.conf | 1 + mkosi/mkosi.images/minimal-base/mkosi.conf | 3 +++ .../minimal-base/mkosi.conf.d/arch.conf | 1 + .../mkosi.conf.d/centos-fedora.conf | 1 + .../mkosi.conf.d/debian-ubuntu.conf | 1 + .../minimal-base/mkosi.conf.d/opensuse.conf | 1 + 20 files changed, 50 insertions(+), 12 deletions(-) diff --git a/mkosi/mkosi.conf.d/arch/mkosi.prepare b/mkosi/mkosi.conf.d/arch/mkosi.prepare index 76f67c14e52..052ce928652 100755 --- a/mkosi/mkosi.conf.d/arch/mkosi.prepare +++ b/mkosi/mkosi.conf.d/arch/mkosi.prepare @@ -17,14 +17,16 @@ for PACKAGE in "${PACKAGES[@]}"; do sed --quiet 's/^Depends On *: //p' # Filter out everything except "Depends On:" line and fetch dependencies from it. )" - DEPS="$DEPS $( - pacman --sync --info "$PACKAGE" | - sed '1,/^$/d' | # Only keep result from first repository (delete everything after first blank line). - sed --quiet '/Optional Deps/,/Conflicts With/{/Conflicts With/!p}' | # Get every line from "Optional Deps" (inclusive) until "Conflicts With" (exclusive). - sed 's/Optional Deps *: //' | # Drop "Optional Deps :" from first line. - sed 's/ *\(.*\):.*/\1/' | # Drop descriptions (everything after first colon for all lines). - tr '\n' ' ' # Transform newlines to whitespace. - )" + if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + DEPS="$DEPS $( + pacman --sync --info "$PACKAGE" | + sed '1,/^$/d' | # Only keep result from first repository (delete everything after first blank line). + sed --quiet '/Optional Deps/,/Conflicts With/{/Conflicts With/!p}' | # Get every line from "Optional Deps" (inclusive) until "Conflicts With" (exclusive). + sed 's/Optional Deps *: //' | # Drop "Optional Deps :" from first line. + sed 's/ *\(.*\):.*/\1/' | # Drop descriptions (everything after first colon for all lines). + tr '\n' ' ' # Transform newlines to whitespace. + )" + fi done echo "$DEPS" | diff --git a/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare b/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare index 1e5bd219958..9e5185bbc6d 100755 --- a/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare +++ b/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare @@ -8,7 +8,12 @@ fi mapfile -t PACKAGES < <(jq --raw-output .VolatilePackages[] <"$MKOSI_CONFIG") -for DEPS in --requires --recommends --suggests; do +DEP_TYPES=(--requires) +if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + DEP_TYPES+=(--recommends --suggests) +fi + +for DEPS in "${DEP_TYPES[@]}"; do # We need --latest-limit=1 to only consider the newest version of the packages. # --latest-limit=1 is per . so we have to pass --arch= explicitly to make sure i686 packages # are not considered on x86-64. diff --git a/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare b/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare index bf2c5eb91f6..22be35f8238 100755 --- a/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare +++ b/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare @@ -22,9 +22,14 @@ for PACKAGE in "${PACKAGES[@]}"; do # Get all the dependencies of the systemd packages including recommended and suggested dependencies. PATTERNS+=( "?and(?reverse-depends(?exact-name($PACKAGE)), $COMMON)" - "?and(?reverse-recommends(?exact-name($PACKAGE)), $COMMON)" - "?and(?reverse-suggests(?exact-name($PACKAGE)), $COMMON)" ) + + if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + PATTERNS+=( + "?and(?reverse-recommends(?exact-name($PACKAGE)), $COMMON)" + "?and(?reverse-suggests(?exact-name($PACKAGE)), $COMMON)" + ) + fi done mkosi-install "${PATTERNS[@]}" diff --git a/mkosi/mkosi.conf.d/opensuse/mkosi.prepare b/mkosi/mkosi.conf.d/opensuse/mkosi.prepare index 728b502b133..32a9312d293 100755 --- a/mkosi/mkosi.conf.d/opensuse/mkosi.prepare +++ b/mkosi/mkosi.conf.d/opensuse/mkosi.prepare @@ -9,11 +9,15 @@ fi mapfile -t PACKAGES < <(jq --raw-output .VolatilePackages[] <"$MKOSI_CONFIG") DEPS="" +DEP_TYPES=(--requires) +if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + DEP_TYPES+=(--recommends --suggests) +fi for PACKAGE in "${PACKAGES[@]}"; do # zypper's output is not machine readable so we make do with sed instead. DEPS="$DEPS\n$( - zypper info --requires --recommends --suggests "$PACKAGE" | + zypper info "${DEP_TYPES[@]}" "$PACKAGE" | sed '/Requires/,$!d' | # Remove everything before Requires line sed --quiet 's/^ //p' # All indented lines have dependencies )" diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf b/mkosi/mkosi.images/exitrd/mkosi.conf index 8d8b7e97617..4a811e15e2f 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf @@ -3,6 +3,9 @@ [Output] Format=directory +[Build] +Environment=SYSTEMD_REQUIRED_DEPS_ONLY=1 + [Content] Bootable=no Locale=C.UTF-8 diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf index b5f3194a847..8ccf7222388 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf @@ -4,6 +4,7 @@ Distribution=arch [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/arch/mkosi.prepare VolatilePackages= systemd systemd-libs diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf index a1fa32b7860..1665f8b4714 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf @@ -5,5 +5,6 @@ Distribution=|centos Distribution=|fedora [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare VolatilePackages= systemd-standalone-shutdown diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf index 6ca310cbc26..c745a1a1d3f 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf @@ -4,5 +4,6 @@ Distribution=debian [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare VolatilePackages= systemd-standalone-shutdown diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf index 37f6220ea0f..7acc4813892 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf @@ -4,6 +4,7 @@ Distribution=opensuse [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/opensuse/mkosi.prepare Packages= diffutils grep diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf index 9a7e1d8cbb3..742d9985040 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf @@ -4,6 +4,7 @@ Distribution=ubuntu [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare VolatilePackages= libsystemd-shared libsystemd0 diff --git a/mkosi/mkosi.images/initrd/mkosi.conf b/mkosi/mkosi.images/initrd/mkosi.conf index b54fe2daf4b..2b731d4397e 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf @@ -6,6 +6,9 @@ Include= %D/mkosi/mkosi.sanitizers %D/mkosi/mkosi.coverage +[Build] +Environment=SYSTEMD_REQUIRED_DEPS_ONLY=1 + [Content] ExtraTrees=%D/mkosi/mkosi.extra.common diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf index 99e039d1dc5..74f4bee9c91 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf @@ -4,6 +4,7 @@ Distribution=arch [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/arch/mkosi.prepare Packages= btrfs-progs tpm2-tools diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf index 5c84cc4cd46..de1c8947a2e 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf @@ -5,6 +5,7 @@ Distribution=|centos Distribution=|fedora [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare Packages= tpm2-tools diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf index 577bf8f59f6..b2fb3a06cbb 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf @@ -5,6 +5,7 @@ Distribution=|debian Distribution=|ubuntu [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare Packages= btrfs-progs tpm2-tools diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf index deaa273b4df..18142a6dbd0 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf @@ -4,6 +4,7 @@ Distribution=opensuse [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/opensuse/mkosi.prepare Packages= btrfs-progs kmod diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf index b51ac638d6f..be80db6cc19 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf @@ -3,6 +3,9 @@ [Output] Format=directory +[Build] +Environment=SYSTEMD_REQUIRED_DEPS_ONLY=1 + [Content] Bootable=no Locale=C.UTF-8 diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf index 044199a6c13..070506b8f5d 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf @@ -4,6 +4,7 @@ Distribution=arch [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/arch/mkosi.prepare Packages= inetutils iproute diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf index e9893ad9897..6d4caebef43 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf @@ -5,6 +5,7 @@ Distribution=|centos Distribution=|fedora [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare Packages= hostname iproute diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf index d524ec17fee..ddf1a188075 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf @@ -5,6 +5,7 @@ Distribution=|debian Distribution=|ubuntu [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare Packages= hostname iproute2 diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf index 3d891b8ed0a..4f96c7d34b4 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf @@ -4,6 +4,7 @@ Distribution=opensuse [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/opensuse/mkosi.prepare Packages= diffutils grep -- 2.47.3