buildEnv: support ignoreSingleFileOutputs
Add option to ignore single-file output instead of failing.
This commit is contained in:
@@ -77,7 +77,7 @@ for my $p (@pathsToLink) {
|
||||
sub findFiles;
|
||||
|
||||
sub findFilesInDir {
|
||||
my ($relName, $target, $ignoreCollisions, $checkCollisionContents, $priority) = @_;
|
||||
my ($relName, $target, $ignoreCollisions, $ignoreSingleFileOutputs, $checkCollisionContents, $priority) = @_;
|
||||
|
||||
opendir DIR, "$target" or die "cannot open `$target': $!";
|
||||
my @names = readdir DIR or die;
|
||||
@@ -85,7 +85,7 @@ sub findFilesInDir {
|
||||
|
||||
foreach my $name (@names) {
|
||||
next if $name eq "." || $name eq "..";
|
||||
findFiles("$relName/$name", "$target/$name", $name, $ignoreCollisions, $checkCollisionContents, $priority);
|
||||
findFiles("$relName/$name", "$target/$name", $name, $ignoreCollisions, $ignoreSingleFileOutputs, $checkCollisionContents, $priority);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,11 +115,16 @@ sub prependDangling {
|
||||
}
|
||||
|
||||
sub findFiles {
|
||||
my ($relName, $target, $baseName, $ignoreCollisions, $checkCollisionContents, $priority) = @_;
|
||||
my ($relName, $target, $baseName, $ignoreCollisions, $ignoreSingleFileOutputs, $checkCollisionContents, $priority) = @_;
|
||||
|
||||
# The store path must not be a file
|
||||
# The store path must not be a file when not ignoreSingleFileOutputs
|
||||
if (-f $target && isStorePath $target) {
|
||||
die "The store path $target is a file and can't be merged into an environment using pkgs.buildEnv!";
|
||||
if ($ignoreSingleFileOutputs) {
|
||||
warn "The store path $target is a file and can't be merged into an environment using pkgs.buildEnv";
|
||||
return;
|
||||
} else {
|
||||
die "The store path $target is a file and can't be merged into an environment using pkgs.buildEnv!";
|
||||
}
|
||||
}
|
||||
|
||||
# Urgh, hacky...
|
||||
@@ -188,8 +193,8 @@ sub findFiles {
|
||||
}
|
||||
}
|
||||
|
||||
findFilesInDir($relName, $oldTarget, $ignoreCollisions, $checkCollisionContents, $oldPriority) unless $oldTarget eq "";
|
||||
findFilesInDir($relName, $target, $ignoreCollisions, $checkCollisionContents, $priority);
|
||||
findFilesInDir($relName, $oldTarget, $ignoreCollisions, $ignoreSingleFileOutputs, $checkCollisionContents, $oldPriority) unless $oldTarget eq "";
|
||||
findFilesInDir($relName, $target, $ignoreCollisions, $ignoreSingleFileOutputs, $checkCollisionContents, $priority);
|
||||
|
||||
$symlinks{$relName} = ["", $priority]; # denotes directory
|
||||
}
|
||||
@@ -199,12 +204,12 @@ my %done;
|
||||
my %postponed;
|
||||
|
||||
sub addPkg {
|
||||
my ($pkgDir, $ignoreCollisions, $checkCollisionContents, $priority) = @_;
|
||||
my ($pkgDir, $ignoreCollisions, $ignoreSingleFileOutputs, $checkCollisionContents, $priority) = @_;
|
||||
|
||||
return if (defined $done{$pkgDir});
|
||||
$done{$pkgDir} = 1;
|
||||
|
||||
findFiles("", $pkgDir, "", $ignoreCollisions, $checkCollisionContents, $priority);
|
||||
findFiles("", $pkgDir, "", $ignoreCollisions, $ignoreSingleFileOutputs, $checkCollisionContents, $priority);
|
||||
|
||||
my $propagatedFN = "$pkgDir/nix-support/propagated-user-env-packages";
|
||||
if (-e $propagatedFN) {
|
||||
|
||||
@@ -23,6 +23,9 @@ lib.makeOverridable
|
||||
, # Whether to ignore collisions or abort.
|
||||
ignoreCollisions ? false
|
||||
|
||||
# Whether to ignore outputs that are a single file instead of a directory.
|
||||
, ignoreSingleFileOutputs ? false
|
||||
|
||||
, # Whether to include closures of all input paths.
|
||||
includeClosures ? false
|
||||
|
||||
@@ -78,7 +81,7 @@ let
|
||||
];
|
||||
in runCommand name
|
||||
(rec {
|
||||
inherit manifest ignoreCollisions checkCollisionContents passthru
|
||||
inherit manifest ignoreCollisions checkCollisionContents ignoreSingleFileOutputs passthru
|
||||
meta pathsToLink extraPrefix postBuild
|
||||
nativeBuildInputs buildInputs;
|
||||
pkgs = builtins.toJSON chosenOutputs;
|
||||
|
||||
Reference in New Issue
Block a user