diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-02-18T00·01+0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-02-18T00·01+0100 |
commit | 1aa19b24b27c6bbf4d46cdd7f6d06b534dd67c19 (patch) | |
tree | c406737fe705ef010f7efb555c6b319b1c984754 /src/nix-env | |
parent | 4ec626a286afd4a9596357fc6d36aaf8bc07442a (diff) |
Add a flag ‘--check’ to verify build determinism
The flag ‘--check’ to ‘nix-store -r’ or ‘nix-build’ will cause Nix to redo the build of a derivation whose output paths are already valid. If the new output differs from the original output, an error is printed. This makes it easier to test if a build is deterministic. (Obviously this cannot catch all sources of non-determinism, but it catches the most common one, namely the current time.) For example: $ nix-build '<nixpkgs>' -A patchelf ... $ nix-build '<nixpkgs>' -A patchelf --check error: derivation `/nix/store/1ipvxsdnbhl1rw6siz6x92s7sc8nwkkb-patchelf-0.6' may not be deterministic: hash mismatch in output `/nix/store/4pc1dmw5xkwmc6q3gdc9i5nbjl4dkjpp-patchelf-0.6.drv' The --check build fails if not all outputs are valid. Thus the first call to nix-build is necessary to ensure that all outputs are valid. The current outputs are left untouched: the new outputs are either put in a chroot or diverted to a different location in the store using hash rewriting.
Diffstat (limited to 'src/nix-env')
-rw-r--r-- | src/nix-env/nix-env.cc | 2 | ||||
-rw-r--r-- | src/nix-env/user-env.cc | 4 |
2 files changed, 3 insertions, 3 deletions
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index e2781e540bf2..333a7fe8c0ca 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -714,7 +714,7 @@ static void opSet(Globals & globals, PathSet paths = singleton<PathSet>(drv.queryDrvPath()); printMissing(*store, paths); if (globals.dryRun) return; - store->buildPaths(paths, globals.state.repair); + store->buildPaths(paths, globals.state.repair ? bmRepair : bmNormal); } else { printMissing(*store, singleton<PathSet>(drv.queryOutPath())); diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc index 3a73f2647a6b..75f5b54abf0a 100644 --- a/src/nix-env/user-env.cc +++ b/src/nix-env/user-env.cc @@ -38,7 +38,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, drvsToBuild.insert(i->queryDrvPath()); debug(format("building user environment dependencies")); - store->buildPaths(drvsToBuild, state.repair); + store->buildPaths(drvsToBuild, state.repair ? bmRepair : bmNormal); /* Construct the whole top level derivation. */ PathSet references; @@ -125,7 +125,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, /* Realise the resulting store expression. */ debug("building user environment"); - store->buildPaths(singleton<PathSet>(topLevelDrv), state.repair); + store->buildPaths(singleton<PathSet>(topLevelDrv), state.repair ? bmRepair : bmNormal); /* Switch the current user environment to the output path. */ PathLocks lock; |