From 96c5a1f75766cc6e173c4aa5cb536dc63b8fd795 Mon Sep 17 00:00:00 2001 From: Stefan Frijters Date: Fri, 24 Apr 2026 11:02:35 +0200 Subject: [PATCH 1/3] build-support/vm: fix fillDiskWithDebs After __structuredAttrs was enabled in runInLinuxVM, the structure of 'debs' matters. The current implementation uses some IFS tricks so we just flatten into a string. Future improvements could include treating debs as a list in a more structured way. --- pkgs/build-support/vm/default.nix | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkgs/build-support/vm/default.nix b/pkgs/build-support/vm/default.nix index 68ec5189177e..f74fef9f3b63 100644 --- a/pkgs/build-support/vm/default.nix +++ b/pkgs/build-support/vm/default.nix @@ -730,7 +730,9 @@ let memSize ; - debs = (lib.intersperse "|" debs); + # Flatten this into string explicitly to allow IFS tricks below to work, + # and support structuredAttrs + debsInterspersed = toString (lib.intersperse "|" debs); preVM = createEmptyImage { inherit size fullName; }; @@ -749,7 +751,7 @@ let # (which have lots of circular dependencies) from barfing. echo "unpacking Debs..." - for deb in $debs; do + for deb in $debsInterspersed; do if test "$deb" != "|"; then echo "$deb..." dpkg-deb --extract "$deb" /mnt @@ -778,7 +780,7 @@ let oldIFS="$IFS" IFS="|" - for component in $debs; do + for component in $debsInterspersed; do IFS="$oldIFS" echo echo ">>> INSTALLING COMPONENT: $component" From 99872c2d5b8d5e3fc6bc7511fc5b415d8f412014 Mon Sep 17 00:00:00 2001 From: Stefan Frijters Date: Fri, 24 Apr 2026 12:01:00 +0200 Subject: [PATCH 2/3] build-support/vm: fix fillDiskWithRPMs With __structuredAttrs enabled, 'rpms' is a bash array. --- pkgs/build-support/vm/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/build-support/vm/default.nix b/pkgs/build-support/vm/default.nix index f74fef9f3b63..764ce8890209 100644 --- a/pkgs/build-support/vm/default.nix +++ b/pkgs/build-support/vm/default.nix @@ -568,7 +568,7 @@ let echo "unpacking RPMs..." set +o pipefail - for i in $rpms; do + for i in "''${rpms[@]}"; do echo "$i..." ${rpm}/bin/rpm2cpio "$i" | chroot /mnt ${cpio}/bin/cpio -i --make-directories --unconditional done @@ -585,7 +585,7 @@ let echo "installing RPMs..." PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \ - rpm -iv --nosignature ${lib.optionalString (!runScripts) "--noscripts"} $rpms + rpm -iv --nosignature ${lib.optionalString (!runScripts) "--noscripts"} "''${rpms[@]}" echo "running post-install script..." eval "$postInstall" From 85bdfb8ba6f98c8f30ebe57a70081c380afdf336 Mon Sep 17 00:00:00 2001 From: Stefan Frijters Date: Fri, 24 Apr 2026 13:27:06 +0200 Subject: [PATCH 3/3] build-support/vm: refactor IFS tricks in fillDiskWithDebs --- pkgs/build-support/vm/default.nix | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/pkgs/build-support/vm/default.nix b/pkgs/build-support/vm/default.nix index 764ce8890209..53cfe9317e28 100644 --- a/pkgs/build-support/vm/default.nix +++ b/pkgs/build-support/vm/default.nix @@ -730,9 +730,8 @@ let memSize ; - # Flatten this into string explicitly to allow IFS tricks below to work, - # and support structuredAttrs - debsInterspersed = toString (lib.intersperse "|" debs); + debsFlat = lib.flatten debs; + debsGrouped = debs; preVM = createEmptyImage { inherit size fullName; }; @@ -751,11 +750,9 @@ let # (which have lots of circular dependencies) from barfing. echo "unpacking Debs..." - for deb in $debsInterspersed; do - if test "$deb" != "|"; then - echo "$deb..." - dpkg-deb --extract "$deb" /mnt - fi + for deb in "''${debsFlat[@]}"; do + echo "$deb..." + dpkg-deb --extract "$deb" /mnt done # Make the Nix store available in /mnt, because that's where the .debs live. @@ -778,10 +775,7 @@ let export DEBIAN_FRONTEND=noninteractive - oldIFS="$IFS" - IFS="|" - for component in $debsInterspersed; do - IFS="$oldIFS" + for component in "''${debsGrouped[@]}"; do echo echo ">>> INSTALLING COMPONENT: $component" debs=