From 81b028afd3d62e36da0924accdbe9b6db5a4eef1 Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Fri, 12 Nov 2021 20:34:45 +0100 Subject: modules/lazy-packages: factor wrapper to pkgs.vuizvui.lazy-packages This makes it usable outside of the module; should be a pure refactor. --- pkgs/build-support/lazy-packages/default.nix | 51 ++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 pkgs/build-support/lazy-packages/default.nix (limited to 'pkgs/build-support/lazy-packages') diff --git a/pkgs/build-support/lazy-packages/default.nix b/pkgs/build-support/lazy-packages/default.nix new file mode 100644 index 00000000..9040149a --- /dev/null +++ b/pkgs/build-support/lazy-packages/default.nix @@ -0,0 +1,51 @@ +{ pkgs, lib, ... }: +let + inherit (lib) escapeShellArg; + + # Encode the store path in base 64 so that the wrapper + # doesn't have a direct dependency on the package. + encoder = "${escapeShellArg "${pkgs.coreutils}/bin/base64"} -w0"; + decoder = "${escapeShellArg "${pkgs.coreutils}/bin/base64"} -d"; + + # The command used to fetch the store path from the binary cache. + fetchSubstitute = "${escapeShellArg "${pkgs.nix}/bin/nix-store"} -r"; + + mkWrapper = {package, extraErrorMessage ? ""}: pkgs.runCommandLocal "${package.name}-lazy" { + inherit package; + inherit extraErrorMessage; + } '' + encoded="$(echo "$package" | ${encoder})" + + if [ ! -e "$package/bin" ]; then + echo "Store path $package doesn't have a \`bin' directory" \ + "so we can't create lazy wrappers for it." \ + "$extraErrorMessage" >&2 + exit 1 + fi + + for bin in "$package"/bin/*; do + [ -x "$bin" -a ! -d "$bin" ] || continue + binpath="''${bin#$package/}" + + mkdir -p "$out/bin" + ( echo ${escapeShellArg "#!${pkgs.stdenv.shell}"} + echo "encoded='$encoded'" + echo "binpath='$binpath'" + echo -n ${escapeShellArg '' + storepath="$(echo "$encoded" | ${decoder})" + program="$storepath/$binpath" + if [ ! -e "$storepath" ]; then + ${fetchSubstitute} "$storepath" > /dev/null || exit $? + fi + exec "$program" "$@" + ''} + ) > "$out/bin/$(basename "$bin")" + chmod +x "$out/bin/$(basename "$bin")" + done + ''; + +in { + inherit + mkWrapper + ; +} -- cgit 1.4.1