forked from lix-project/lix
5cd72598fe
Impure derivations are derivations that can produce a different result every time they're built. Example: stdenv.mkDerivation { name = "impure"; __impure = true; # marks this derivation as impure outputHashAlgo = "sha256"; outputHashMode = "recursive"; buildCommand = "date > $out"; }; Some important characteristics: * This requires the 'impure-derivations' experimental feature. * Impure derivations are not "cached". Thus, running "nix-build" on the example above multiple times will cause a rebuild every time. * They are implemented similar to CA derivations, i.e. the output is moved to a content-addressed path in the store. The difference is that we don't register a realisation in the Nix database. * Pure derivations are not allowed to depend on impure derivations. In the future fixed-output derivations will be allowed to depend on impure derivations, thus forming an "impurity barrier" in the dependency graph. * When sandboxing is enabled, impure derivations can access the network in the same way as fixed-output derivations. In relaxed sandboxing mode, they can access the local filesystem.
47 lines
950 B
Nix
47 lines
950 B
Nix
with import ./config.nix;
|
|
|
|
rec {
|
|
|
|
impure = mkDerivation {
|
|
name = "impure";
|
|
outputs = [ "out" "stuff" ];
|
|
buildCommand =
|
|
''
|
|
x=$(< $TEST_ROOT/counter)
|
|
mkdir $out $stuff
|
|
echo $x > $out/n
|
|
ln -s $out/n $stuff/bla
|
|
printf $((x + 1)) > $TEST_ROOT/counter
|
|
'';
|
|
__impure = true;
|
|
outputHashAlgo = "sha256";
|
|
outputHashMode = "recursive";
|
|
impureEnvVars = [ "TEST_ROOT" ];
|
|
};
|
|
|
|
impureOnImpure = mkDerivation {
|
|
name = "impure-on-impure";
|
|
buildCommand =
|
|
''
|
|
x=$(< ${impure}/n)
|
|
mkdir $out
|
|
printf X$x > $out/n
|
|
ln -s ${impure.stuff} $out/symlink
|
|
ln -s $out $out/self
|
|
'';
|
|
__impure = true;
|
|
outputHashAlgo = "sha256";
|
|
outputHashMode = "recursive";
|
|
};
|
|
|
|
# This is not allowed.
|
|
inputAddressed = mkDerivation {
|
|
name = "input-addressed";
|
|
buildCommand =
|
|
''
|
|
cat ${impure} > $out
|
|
'';
|
|
};
|
|
|
|
}
|