{ runCommand, writeShellApplication, rsync, lib, ... }: args@{ name, paths, preferLocalBuild ? true, allowSubstitutes ? false, postBuild ? "" }: let env = builtins.removeAttrs args [ "name" "postBuild" ]] // { inherit preferLocalBuild allowSubstitutes; nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ rsync replaceBadSymlink ]; passAsFile = [ "paths" ]; }; # copyDirs = p: '' # ${lib.getExe rsync} -rv --copy-dirlinks --links --executability "${p}/" "$out" # ''; replaceBadSymlink = writeShellApplication { name = "replaceBadSymlink"; # runtimeInputs = [ coreutils ]; text = '' FILE="''${1-}" if [[ -z "$FILE" ]]; then >&2 echo "Need a file input" fi REALPATH="$(readlink -f "$FILE")" case "$REALPATH" in "/nix/store/"* ) echo "Replacing $FILE by $REALPATH" cp -v --remove-destination "$REALPATH" "$FILE" ;; esac ''; }; in runCommand name env '' mkdir -p $out for i in $(cat $pathsPath); do rsync -rv --copy-dirlinks --links --executability "$i/" "$out" done find $out -type l -exec "replaceBadSymlink {}" \; ${postBuild} ''