From e85353bc3532bc5fbe01c292204cc633c22a2f1c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 11 Jun 2025 11:07:55 +0200
Subject: [PATCH] chore: better compression for sysext images

---
 flake.nix           | 54 +++++++++++++++++----------------------------
 lib/make-sysext.nix | 22 +++++++++++++++++-
 2 files changed, 41 insertions(+), 35 deletions(-)

diff --git a/flake.nix b/flake.nix
index 3567477..cfbd77c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -46,45 +46,31 @@
             name = "debug-tools";
             version = "0.0.1";
             packages = [
-              { drv = pkgs.curl; path = "bin/curl"; }
-              { drv = pkgs.bash; path = "bin/bash"; }
+              { drv = pkgs.curl; path = "bin/"; }
+              { drv = pkgs.bash; path = "bin/"; }
+              { drv = pkgs.keyutils; path = "bin/"; }
+              { drv = pkgs.gnutar; path = "bin/"; }
+              { drv = pkgs.strace; path = "bin/"; }
+              { drv = pkgs.cryptsetup; path = "bin/"; }
+              { drv = pkgs.erofs-utils; path = "bin/"; }
+              { drv = pkgs.binutils-unwrapped; path = "bin/"; }
+              { drv = pkgs.binutils-unwrapped.lib; path = "lib/"; }
+              { drv = pkgs.util-linuxMinimal; path = "bin/"; }
+              { drv = pkgs.util-linuxMinimal.mount; path = "bin/"; }
+              { drv = pkgs.util-linuxMinimal.login; path = "bin/"; }
+              { drv = pkgs.util-linuxMinimal.swap; path = "bin/"; }
               { drv = patosPkgs.glibc; path = "bin/ldd"; }
-              { drv = pkgs.util-linux; path = "bin/sfdisk"; }
-              { drv = pkgs.readline.out; path = "lib/libreadline.so.8.2"; }
-              { drv = pkgs.readline.out; path = "lib/libreadline.so.8"; }
-              { drv = pkgs.readline.out; path = "lib/libhistory.so.8.2"; }
-              { drv = pkgs.readline.out; path = "lib/libhistory.so.8"; }
-              { drv = pkgs.ncurses.out; path = "/lib/libncursesw.so.6.5"; }
-              { drv = pkgs.ncurses.out; path = "/lib/libncursesw.so.6"; }
-              { drv = pkgs.keyutils; path = "bin/keyctl"; }
-              { drv = pkgs.gnutar; path = "bin/tar"; }
-              { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
-              { drv = pkgs.strace; path = "bin/strace"; }
               { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
               { drv = patosPkgs.openssl; path = "bin/openssl"; }
-              { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
-              { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
-              { drv = pkgs.erofs-utils; path = "bin/mkfs.erofs"; }
-              # shared lib required for cryptsetup
-              { drv = pkgs.popt; path = "lib/libpopt.so.0.0.2"; }
-              { drv = pkgs.popt; path = "lib/libpopt.so.0"; }
-              { drv = pkgs.popt; path = "lib/libpopt.so"; }
               # shared lib required for mkfs.erofs
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1.10.0"; }
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1"; }
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so"; }
-              # shared lib required for binutils
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1.0.0"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.44.so"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd.so"; }
+              { drv = pkgs.lz4.lib; path = "lib/"; }
+              # shared lib required for cryptsetup
+              { drv = pkgs.popt; path = "lib/"; }
               # shared lib required for strace
-              { drv = pkgs.elfutils.out; path = "lib/libdw-0.192.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libdw.so.1"; }
-              { drv = pkgs.elfutils.out; path = "lib/libdw.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf-0.192.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf.so.1"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf.so"; }
+              { drv = pkgs.elfutils.out; path = "lib/"; }
+              # shared lib required for bash
+              { drv = pkgs.readline.out; path = "lib/"; }
+              { drv = pkgs.ncurses.out; path = "lib/"; }
             ];
           };
         };
diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
index 6de1e63..59b04cf 100644
--- a/lib/make-sysext.nix
+++ b/lib/make-sysext.nix
@@ -46,6 +46,7 @@ runCommand name
 
   }
   ''
+    set -ex -o pipefail
     do_copy () {
       local prefix="$1"
       local drv="$2"
@@ -60,6 +61,25 @@ runCommand name
       destdir="$(dirname -- "$destfile")"
 
       mkdir -pv "$destdir"
+
+      # recursively copy if ending with /
+      if [[ "$destfile" =~ /$ ]]; then
+        basedir="$(dirname -- "$destfile")"
+        chmod -R 755 "$basedir"
+        # remove if exists
+        for f in $srcfile/*; do
+          basename="$(basename -- "$f")"
+          rm -f "$destfile/$basename"
+        done
+        cp -rPv "$srcfile" "$basedir"
+        chmod -R 755 "$basedir"
+        for f in $destfile/*; do
+          patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 $f || true
+          patchelf --set-rpath /usr/lib $f || true
+        done
+        return
+      fi
+
       cp -Pv "$srcfile" "$destfile"
 
       chmod 755 "$destfile"
@@ -79,7 +99,7 @@ runCommand name
 
     pushd $out
     find tree -type d -exec chmod 0755 {} \;
-    mkfs.erofs --all-root $name.raw tree/
+    mkfs.erofs -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking --all-root $name.raw tree/
     veritysetup format --root-hash-file $name.roothash $name.raw $name.verity
     # TODO: pcks7 signature
     # openssl smime -sign -nocerts -noattr -binary -in ${name}.roothash \