diff --git a/pkgs/build-support/trivial-builders.nix b/pkgs/build-support/trivial-builders.nix index a8c291b82324..f29027aa1c68 100644 --- a/pkgs/build-support/trivial-builders.nix +++ b/pkgs/build-support/trivial-builders.nix @@ -465,8 +465,11 @@ rec { * * This creates a simple derivation with symlinks to all inputs. * - * entries is a list of attribute sets like - * { name = "name" ; path = "/nix/store/..."; } + * entries can be a list of attribute sets like + * [ { name = "name" ; path = "/nix/store/..."; } ] + * + * or an attribute set name -> path like: + * { name = "/nix/store/..."; other = "/nix/store/..."; } * * Example: * @@ -482,14 +485,27 @@ rec { * * See the note on symlinkJoin for the difference between linkFarm and symlinkJoin. */ - linkFarm = name: entries: runCommand name { preferLocalBuild = true; allowSubstitutes = false; } - ''mkdir -p $out - cd $out - ${lib.concatMapStrings (x: '' - mkdir -p "$(dirname ${lib.escapeShellArg x.name})" - ln -s ${lib.escapeShellArg "${x.path}"} ${lib.escapeShellArg x.name} - '') entries} - ''; + linkFarm = name: entries: + let + entries' = + if (lib.isAttrs entries) then entries + else if (lib.isList entries) then lib.listToAttrs (map (x: lib.nameValuePair x.name x.path) entries) + else throw "linkFarm entries must be either attrs or a list!"; + + linkCommands = lib.mapAttrsToList (name: path: '' + mkdir -p "$(dirname ${lib.escapeShellArg "${name}"})" + ln -s ${lib.escapeShellArg "${path}"} ${lib.escapeShellArg "${name}"} + '') entries'; + in + runCommand name { + preferLocalBuild = true; + allowSubstitutes = false; + passthru.entries = entries'; + } '' + mkdir -p $out + cd $out + ${lib.concatStrings linkCommands} + ''; /* * Easily create a linkFarm from a set of derivations.