lol
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

buildEnv: Support package priorities like nix-env

This gets rid of a bunch of collision warnings.

+53 -32
+1
nixos/modules/system/boot/modprobe.nix
··· 35 35 fi 36 36 37 37 ''; 38 + meta.priority = 4; 38 39 }; 39 40 description = '' 40 41 Wrapper around modprobe that sets the path to the modules
+41 -29
pkgs/build-support/buildenv/builder.pl
··· 5 5 use IO::Handle; 6 6 use File::Path; 7 7 use File::Basename; 8 + use JSON::PP; 8 9 9 10 STDOUT->autoflush(1); 10 11 ··· 17 18 $path = "/" if $path eq ""; 18 19 foreach my $elem (@pathsToLink) { 19 20 return 1 if 20 - $elem eq "/" || 21 + $elem eq "/" || 21 22 (substr($path, 0, length($elem)) eq $elem 22 23 && (($path eq $elem) || (substr($path, length($elem), 1) eq "/"))); 23 24 } ··· 28 29 # For each activated package, determine what symlinks to create. 29 30 30 31 my %symlinks; 31 - $symlinks{""} = ""; # create root directory 32 + $symlinks{""} = ["", 0]; # create root directory 33 + 34 + my %priorities; 32 35 33 36 sub findFiles; 34 37 35 38 sub findFilesInDir { 36 - my ($relName, $target, $ignoreCollisions) = @_; 39 + my ($relName, $target, $ignoreCollisions, $priority) = @_; 37 40 38 41 opendir DIR, "$target" or die "cannot open `$target': $!"; 39 42 my @names = readdir DIR or die; 40 43 closedir DIR; 41 - 44 + 42 45 foreach my $name (@names) { 43 46 next if $name eq "." || $name eq ".."; 44 - findFiles("$relName/$name", "$target/$name", $name, $ignoreCollisions); 47 + findFiles("$relName/$name", "$target/$name", $name, $ignoreCollisions, $priority); 45 48 } 46 49 } 47 - 50 + 48 51 sub findFiles { 49 - my ($relName, $target, $baseName, $ignoreCollisions) = @_; 52 + my ($relName, $target, $baseName, $ignoreCollisions, $priority) = @_; 50 53 51 54 # Urgh, hacky... 52 55 return if ··· 57 60 $baseName eq "perllocal.pod" || 58 61 $baseName eq "log"; 59 62 60 - my $oldTarget = $symlinks{$relName}; 63 + my ($oldTarget, $oldPriority) = @{$symlinks{$relName} // [undef, undef]}; 64 + 65 + # If target doesn't exist, create it. If it already exists as a 66 + # symlink to a file (not a directory) in a lower-priority package, 67 + # overwrite it. 68 + if (!defined $oldTarget || ($priority < $oldPriority && ($oldTarget ne "" && ! -d $oldTarget))) { 69 + $symlinks{$relName} = [$target, $priority]; 70 + return; 71 + } 61 72 62 - if (!defined $oldTarget) { 63 - $symlinks{$relName} = $target; 73 + # If target already exists as a symlink to a file (not a 74 + # directory) in a higher-priority package, skip. 75 + if (defined $oldTarget && $priority > $oldPriority && $oldTarget ne "" && ! -d $oldTarget) { 64 76 return; 65 77 } 66 78 67 79 unless (-d $target && ($oldTarget eq "" || -d $oldTarget)) { 68 80 if ($ignoreCollisions) { 69 - warn "collision between `$target' and `$oldTarget'" if $ignoreCollisions == 1; 81 + warn "collision between `$target' and `$oldTarget'\n" if $ignoreCollisions == 1; 70 82 return; 71 83 } else { 72 - die "collision between `$target' and `$oldTarget'"; 84 + die "collision between `$target' and `$oldTarget'\n"; 73 85 } 74 86 } 75 87 76 - findFilesInDir($relName, $oldTarget, $ignoreCollisions) unless $oldTarget eq ""; 77 - findFilesInDir($relName, $target, $ignoreCollisions); 78 - 79 - $symlinks{$relName} = ""; # denotes directory 88 + findFilesInDir($relName, $oldTarget, $ignoreCollisions, $oldPriority) unless $oldTarget eq ""; 89 + findFilesInDir($relName, $target, $ignoreCollisions, $priority); 90 + 91 + $symlinks{$relName} = ["", $priority]; # denotes directory 80 92 } 81 93 82 94 83 95 my %done; 84 96 my %postponed; 85 97 86 - sub addPkg; 87 - sub addPkg($;$) { 88 - my $pkgDir = shift; 89 - my $ignoreCollisions = shift; 98 + sub addPkg { 99 + my ($pkgDir, $ignoreCollisions, $priority) = @_; 90 100 91 101 return if (defined $done{$pkgDir}); 92 102 $done{$pkgDir} = 1; 93 103 94 - findFiles("", "$pkgDir", "", $ignoreCollisions); 104 + findFiles("", $pkgDir, "", $ignoreCollisions, $priority); 95 105 96 106 my $propagatedFN = "$pkgDir/nix-support/propagated-user-env-packages"; 97 107 if (-e $propagatedFN) { ··· 106 116 } 107 117 108 118 109 - # Symlink to the packages that have been installed explicitly by the user. 110 - my @args = split ' ', $ENV{"paths"}; 111 - 112 - foreach my $pkgDir (@args) { 113 - addPkg($pkgDir, $ENV{"ignoreCollisions"} eq "1") if -e $pkgDir; 119 + # Symlink to the packages that have been installed explicitly by the 120 + # user. 121 + for my $pkg (@{decode_json $ENV{"pkgs"}}) { 122 + for my $path (@{$pkg->{paths}}) { 123 + addPkg($path, $ENV{"ignoreCollisions"} eq "1", $pkg->{priority}) if -e $path; 124 + } 114 125 } 115 126 116 127 117 128 # Symlink to the packages that have been "propagated" by packages 118 - # installed by the user (i.e., package X declares that it want Y 129 + # installed by the user (i.e., package X declares that it wants Y 119 130 # installed as well). We do these later because they have a lower 120 131 # priority in case of collisions. 132 + my $priorityCounter = 1000; # don't care about collisions 121 133 while (scalar(keys %postponed) > 0) { 122 134 my @pkgDirs = keys %postponed; 123 135 %postponed = (); 124 136 foreach my $pkgDir (sort @pkgDirs) { 125 - addPkg($pkgDir, 2); 137 + addPkg($pkgDir, 2, $priorityCounter++); 126 138 } 127 139 } 128 140 ··· 130 142 # Create the symlinks. 131 143 my $nrLinks = 0; 132 144 foreach my $relName (sort keys %symlinks) { 133 - my $target = $symlinks{$relName}; 145 + my ($target, $priority) = @{$symlinks{$relName}}; 134 146 my $abs = "$out/$relName"; 135 147 next unless isInPathsToLink $relName; 136 148 if ($target eq "") {
+7 -3
pkgs/build-support/buildenv/default.nix
··· 9 9 , # The manifest file (if any). A symlink $out/manifest will be 10 10 # created to it. 11 11 manifest ? "" 12 - 12 + 13 13 , # The paths to symlink. 14 14 paths 15 - 15 + 16 16 , # Whether to ignore collisions or abort. 17 17 ignoreCollisions ? false 18 18 ··· 28 28 }: 29 29 30 30 runCommand name 31 - { inherit manifest paths ignoreCollisions passthru pathsToLink postBuild; 31 + { inherit manifest ignoreCollisions passthru pathsToLink postBuild; 32 + pkgs = builtins.toJSON (map (drv: { 33 + paths = [ drv ]; # FIXME: handle multiple outputs 34 + priority = drv.meta.priority or 5; 35 + }) paths); 32 36 preferLocalBuild = true; 33 37 } 34 38 ''
+1
pkgs/os-specific/linux/firmware/firmware-linux-nonfree/default.nix
··· 30 30 license = licenses.unfreeRedistributableFirmware; 31 31 platforms = platforms.linux; 32 32 maintainers = with maintainers; [ wkennington ]; 33 + priority = 6; # give precedence to kernel firmware 33 34 }; 34 35 35 36 passthru = { inherit version; };
+1
pkgs/os-specific/linux/nvidia-x11/default.nix
··· 63 63 license = licenses.unfreeRedistributable; 64 64 platforms = platforms.linux; 65 65 maintainers = [ maintainers.vcunat ]; 66 + priority = 4; # resolves collision with xorg-server's "lib/xorg/modules/extensions/libglx.so" 66 67 }; 67 68 }
+1
pkgs/os-specific/linux/util-linux/default.nix
··· 53 53 homepage = http://www.kernel.org/pub/linux/utils/util-linux/; 54 54 description = "A set of system utilities for Linux"; 55 55 platforms = stdenv.lib.platforms.linux; 56 + priority = 6; # lower priority than coreutils ("kill") and shadow ("login" etc.) packages 56 57 }; 57 58 }
+1
pkgs/tools/archivers/cpio/default.nix
··· 35 35 homepage = http://www.gnu.org/software/cpio/; 36 36 description = "A program to create or extract from cpio archives"; 37 37 platforms = stdenv.lib.platforms.all; 38 + priority = 6; # resolves collision with gnutar's "libexec/rmt" 38 39 }; 39 40 }