1{ 2 supportedSystems, 3 nixpkgs, 4 pkgs, 5}: 6 7pkgs.runCommand "nixpkgs-release-checks" 8 { 9 src = nixpkgs; 10 buildInputs = [ pkgs.nix ]; 11 requiredSystemFeatures = [ "big-parallel" ]; # 1 thread but ~10G RAM; see #227945 12 } 13 '' 14 set -o pipefail 15 16 export NIX_STORE_DIR=$TMPDIR/store 17 export NIX_STATE_DIR=$TMPDIR/state 18 export NIX_PATH=nixpkgs=$TMPDIR/barf.nix 19 opts=() 20 nix-store --init 21 22 echo 'abort "Illegal use of <nixpkgs> in Nixpkgs."' > $TMPDIR/barf.nix 23 24 # Make sure that Nixpkgs does not use <nixpkgs>. 25 badFiles=$(find $src/pkgs -type f -name '*.nix' -print | xargs grep -l '^[^#]*<nixpkgs/' || true) 26 if [[ -n $badFiles ]]; then 27 echo "Nixpkgs is not allowed to use <nixpkgs> to refer to itself." 28 echo "The offending files: $badFiles" 29 exit 1 30 fi 31 32 # Make sure that no paths collide on case-preserving or case-insensitive filesysytems. 33 conflictingPaths=$(find $src | awk '{ print $1 " " tolower($1) }' | sort -k2 | uniq -D -f 1 | cut -d ' ' -f 1) 34 if [[ -n $conflictingPaths ]]; then 35 echo "Files in nixpkgs must not vary only by case" 36 echo "The offending paths: $conflictingPaths" 37 exit 1 38 fi 39 40 src2=$TMPDIR/foo 41 cp -rd $src $src2 42 43 # Check that all-packages.nix evaluates on a number of platforms without any warnings. 44 for platform in ${pkgs.lib.concatStringsSep " " supportedSystems}; do 45 echo "checking Nixpkgs on $platform" 46 47 # To get a call trace; see https://nixos.org/manual/nixpkgs/stable/#function-library-lib.trivial.warn 48 # Relies on impure eval 49 export NIX_ABORT_ON_WARN=true 50 51 # Suppress GC warnings 52 export GC_LARGE_ALLOC_WARN_INTERVAL=100000 53 54 set +e 55 ( 56 set -x 57 nix-env -f $src \ 58 --show-trace --argstr system "$platform" \ 59 --arg config '{ allowAliases = false; }' \ 60 --option experimental-features 'no-url-literals' \ 61 -qa --drv-path --system-filter \* --system \ 62 "''${opts[@]}" 2> eval-warnings.log > packages1 63 ) 64 rc=$? 65 set -e 66 if [ "$rc" != "0" ]; then 67 cat eval-warnings.log 68 exit $rc 69 fi 70 71 s1=$(sha1sum packages1 | cut -c1-40) 72 73 nix-env -f $src2 \ 74 --show-trace --argstr system "$platform" \ 75 --arg config '{ allowAliases = false; }' \ 76 --option experimental-features 'no-url-literals' \ 77 -qa --drv-path --system-filter \* --system \ 78 "''${opts[@]}" > packages2 79 80 s2=$(sha1sum packages2 | cut -c1-40) 81 82 if [[ $s1 != $s2 ]]; then 83 echo "Nixpkgs evaluation depends on Nixpkgs path" 84 diff packages1 packages2 85 exit 1 86 fi 87 88 # Catch any trace calls not caught by NIX_ABORT_ON_WARN (lib.warn) 89 if [ -s eval-warnings.log ]; then 90 echo "Nixpkgs on $platform evaluated with warnings, aborting" 91 echo "Warnings logged:" 92 cat eval-warnings.log 93 exit 1 94 fi 95 96 nix-env -f $src \ 97 --show-trace --argstr system "$platform" \ 98 --arg config '{ allowAliases = false; }' \ 99 --option experimental-features 'no-url-literals' \ 100 -qa --drv-path --system-filter \* --system --meta --xml \ 101 "''${opts[@]}" > /dev/null 102 done 103 104 touch $out 105 ''