1#!/bin/sh
2
3attr=$1
4
5: ${NIXPKGS=/etc/nixos/nixpkgs}
6
7tmp=$(mktemp --tmpdir -d nixpkgs-dep-license.XXXXXX)
8
9exitHandler() {
10 exitCode=$?
11 rm -rf "$tmp"
12 return $exitCode
13}
14
15trap "exitHandler" EXIT
16
17# fetch the trace and the drvPath of the attribute.
18nix-instantiate $NIXPKGS -A $attr --show-trace > "$tmp/drvPath" 2> "$tmp/trace" || {
19 cat 1>&2 - "$tmp/trace" <<EOF
20An error occurred while evaluating $attr.
21EOF
22 exit 1
23}
24
25# generate a sed script based on the trace output.
26sed '
27 \,@:.*:@, {
28 # \1 *.drv file
29 # \2 License terms
30 s,.*@:drv:\(.*\):\(.*\):@.*,s!\1!\1: \2!; t;,
31 s!Str(\\\"\([^,]*\)\\\",\[\])!\1!g
32 b
33 }
34 d
35' "$tmp/trace" > "$tmp/filter.sed"
36
37if test $(wc -l "$tmp/filter.sed" | sed 's/ .*//') == 0; then
38 echo 1>&2 "
39No derivation mentionned in the stack trace. Either your derivation does
40not use stdenv.mkDerivation or you forgot to use the stdenv adapter named
41traceDrvLicenses.
42
43- defaultStdenv = allStdenvs.stdenv;
44+ defaultStdenv = traceDrvLicenses allStdenvs.stdenv;
45"
46 exit 1
47fi
48
49
50# remove all dependencies which are using stdenv.mkDerivation
51echo '
52d
53' >> "$tmp/filter.sed"
54
55nix-store -q --tree $(cat "$tmp/drvPath") | sed -f "$tmp/filter.sed"
56
57exit 0;