mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-25 08:23:09 +00:00
buildEnv: support pulling in closures of paths
This will become important for Steam.
This commit is contained in:
parent
4e803e9656
commit
4654ea4cc0
@ -255,6 +255,21 @@ while (scalar(keys %postponed) > 0) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $extraPathsFilePath = $ENV{"extraPathsFrom"};
|
||||||
|
if ($extraPathsFilePath) {
|
||||||
|
open FILE, $extraPathsFilePath or die "cannot open extra paths file $extraPathsFilePath: $!";
|
||||||
|
|
||||||
|
while(my $line = <FILE>) {
|
||||||
|
chomp $line;
|
||||||
|
addPkg($line,
|
||||||
|
$ENV{"ignoreCollisions"} eq "1",
|
||||||
|
$ENV{"checkCollisionContents"} eq "1",
|
||||||
|
1000)
|
||||||
|
if -d $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
close FILE;
|
||||||
|
}
|
||||||
|
|
||||||
# Create the symlinks.
|
# Create the symlinks.
|
||||||
my $nrLinks = 0;
|
my $nrLinks = 0;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# buildEnv creates a tree of symlinks to the specified paths. This is
|
# buildEnv creates a tree of symlinks to the specified paths. This is
|
||||||
# a fork of the hardcoded buildEnv in the Nix distribution.
|
# a fork of the hardcoded buildEnv in the Nix distribution.
|
||||||
|
|
||||||
{ buildPackages, runCommand, lib, substituteAll }:
|
{ buildPackages, runCommand, lib, substituteAll, writeClosure }:
|
||||||
|
|
||||||
let
|
let
|
||||||
builder = substituteAll {
|
builder = substituteAll {
|
||||||
@ -23,6 +23,9 @@ lib.makeOverridable
|
|||||||
, # Whether to ignore collisions or abort.
|
, # Whether to ignore collisions or abort.
|
||||||
ignoreCollisions ? false
|
ignoreCollisions ? false
|
||||||
|
|
||||||
|
, # Whether to include closures of all input paths.
|
||||||
|
includeClosures ? false
|
||||||
|
|
||||||
, # If there is a collision, check whether the contents and permissions match
|
, # If there is a collision, check whether the contents and permissions match
|
||||||
# and only if not, throw a collision error.
|
# and only if not, throw a collision error.
|
||||||
checkCollisionContents ? true
|
checkCollisionContents ? true
|
||||||
@ -49,27 +52,31 @@ lib.makeOverridable
|
|||||||
, passthru ? {}
|
, passthru ? {}
|
||||||
, meta ? {}
|
, meta ? {}
|
||||||
}:
|
}:
|
||||||
|
let
|
||||||
|
chosenOutputs = map (drv: {
|
||||||
|
paths =
|
||||||
|
# First add the usual output(s): respect if user has chosen explicitly,
|
||||||
|
# and otherwise use `meta.outputsToInstall`. The attribute is guaranteed
|
||||||
|
# to exist in mkDerivation-created cases. The other cases (e.g. runCommand)
|
||||||
|
# aren't expected to have multiple outputs.
|
||||||
|
(if (! drv ? outputSpecified || ! drv.outputSpecified)
|
||||||
|
&& drv.meta.outputsToInstall or null != null
|
||||||
|
then map (outName: drv.${outName}) drv.meta.outputsToInstall
|
||||||
|
else [ drv ])
|
||||||
|
# Add any extra outputs specified by the caller of `buildEnv`.
|
||||||
|
++ lib.filter (p: p!=null)
|
||||||
|
(builtins.map (outName: drv.${outName} or null) extraOutputsToInstall);
|
||||||
|
priority = drv.meta.priority or lib.meta.defaultPriority;
|
||||||
|
}) paths;
|
||||||
|
|
||||||
runCommand name
|
pathsForClosure = lib.flatten (map (p: p.paths) chosenOutputs);
|
||||||
|
in runCommand name
|
||||||
rec {
|
rec {
|
||||||
inherit manifest ignoreCollisions checkCollisionContents passthru
|
inherit manifest ignoreCollisions checkCollisionContents passthru
|
||||||
meta pathsToLink extraPrefix postBuild
|
meta pathsToLink extraPrefix postBuild
|
||||||
nativeBuildInputs buildInputs;
|
nativeBuildInputs buildInputs;
|
||||||
pkgs = builtins.toJSON (map (drv: {
|
pkgs = builtins.toJSON chosenOutputs;
|
||||||
paths =
|
extraPathsFrom = lib.optional includeClosures (writeClosure pathsForClosure);
|
||||||
# First add the usual output(s): respect if user has chosen explicitly,
|
|
||||||
# and otherwise use `meta.outputsToInstall`. The attribute is guaranteed
|
|
||||||
# to exist in mkDerivation-created cases. The other cases (e.g. runCommand)
|
|
||||||
# aren't expected to have multiple outputs.
|
|
||||||
(if (! drv ? outputSpecified || ! drv.outputSpecified)
|
|
||||||
&& drv.meta.outputsToInstall or null != null
|
|
||||||
then map (outName: drv.${outName}) drv.meta.outputsToInstall
|
|
||||||
else [ drv ])
|
|
||||||
# Add any extra outputs specified by the caller of `buildEnv`.
|
|
||||||
++ lib.filter (p: p!=null)
|
|
||||||
(builtins.map (outName: drv.${outName} or null) extraOutputsToInstall);
|
|
||||||
priority = drv.meta.priority or lib.meta.defaultPriority;
|
|
||||||
}) paths);
|
|
||||||
preferLocalBuild = true;
|
preferLocalBuild = true;
|
||||||
allowSubstitutes = false;
|
allowSubstitutes = false;
|
||||||
# XXX: The size is somewhat arbitrary
|
# XXX: The size is somewhat arbitrary
|
||||||
|
Loading…
Reference in New Issue
Block a user