writeReferencesToFile: docs and tests

Changed files
+42
doc
pkgs
build-support
trivial-builders
+26
doc/builders/trivial-builders.chapter.md
···
This can be used to put many derivations into the same directory structure. It works by creating a new derivation and adding symlinks to each of the paths listed. It expects two arguments, `name`, and `paths`. `name` is the name used in the Nix store path for the created derivation. `paths` is a list of paths that will be symlinked. These paths can be to Nix store derivations or any other subdirectory contained within.
+
## `writeReferencesToFile` {#trivial-builder-writeReferencesToFile}
+
+
Writes the closure of transitive dependencies to a file.
+
+
This produces the equivalent of `nix-store -q --requisites`.
+
+
For example,
+
+
```nix
+
writeReferencesToFile (writeScriptBin "hi" ''${hello}/bin/hello'')
+
```
+
+
produces an output path `/nix/store/<hash>-runtime-deps` containing
+
+
```nix
+
/nix/store/<hash>-hello-2.10
+
/nix/store/<hash>-hi
+
/nix/store/<hash>-libidn2-2.3.0
+
/nix/store/<hash>-libunistring-0.9.10
+
/nix/store/<hash>-glibc-2.32-40
+
```
+
+
You can see that this includes `hi`, the original input path,
+
`hello`, which is a direct reference, but also
+
the other paths that are indirectly required to run `hello`.
+
## `writeDirectReferencesToFile` {#trivial-builder-writeDirectReferencesToFile}
Writes the set of references to the output file, that is, their immediate dependencies.
+16
pkgs/build-support/trivial-builders/test.sh
···
testDirectReferences 'writeText "hi" "hello ${hello}"'
testDirectReferences 'writeText "hi" "hello ${hello} ${figlet}"'
+
+
+
testClosure() {
+
expr="$1"
+
diff -U3 \
+
<(sort <$(nix-build --no-out-link --expr "with import ../../.. {}; writeReferencesToFile ($expr)")) \
+
<(nix-store -q --requisites $(nix-build --no-out-link --expr "with import ../../.. {}; ($expr)") | sort)
+
}
+
+
testClosure 'hello'
+
testClosure 'figlet'
+
testClosure 'writeText "hi" "hello"'
+
testClosure 'writeText "hi" "hello ${hello}"'
+
testClosure 'writeText "hi" "hello ${hello} ${figlet}"'
+
+
echo 'OK!'