buildEnv: support ignoreSingleFileOutputs

Add option to ignore single-file output instead of failing.
This commit is contained in:
Yueh-Shun Li
2024-12-03 12:14:00 +08:00
parent 6f40e94649
commit 70038f0e4d
2 changed files with 18 additions and 10 deletions
+14 -9
View File
@@ -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) {
+4 -1
View File
@@ -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;