diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-01-12 16:44:26 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2016-05-31 14:25:28 +0200 |
commit | 7f3b2510d6b050b8fb0974fa0cd7a164ac51f6d1 (patch) | |
tree | 7bebb78c038a8c6f4cc7290d291a87b03f8f2959 | |
parent | 7889e72dad81cdf9ab6c94635976a612662baa09 (diff) | |
download | guix-7f3b2510d6b050b8fb0974fa0cd7a164ac51f6d1.tar guix-7f3b2510d6b050b8fb0974fa0cd7a164ac51f6d1.tar.gz |
daemon: check: Keep the differing output if -K is given.
This makes it easier to investigate the non-determinism, e.g.
$ nix-build pkgs/stdenv/linux -A stage1.pkgs.zlib --check -K
error: derivation ‘/nix/store/l54i8wlw22656i4pk05c52ngv9rpl39q-zlib-1.2.8.drv’ may not be deterministic: output ‘/nix/store/11a27shh6n2ivi4a7s964i65ql80cf27-zlib-1.2.8’ differs from ‘/nix/store/11a27shh6n2ivi4a7s964i65ql80cf27-zlib-1.2.8-check’
$ diffoscope /nix/store/11a27shh6n2ivi4a7s964i65ql80cf27-zlib-1.2.8 /nix/store/11a27shh6n2ivi4a7s964i65ql80cf27-zlib-1.2.8-check
...
├── lib/libz.a
│ ├── metadata
│ │ @@ -1,15 +1,15 @@
│ │ -rw-r--r-- 30001/30000 3096 Jan 12 15:20 2016 adler32.o
...
│ │ +rw-r--r-- 30001/30000 3096 Jan 12 15:28 2016 adler32.o
...
Co-authored-by: Ludovic Courtès <ludo@gnu.org>
-rw-r--r-- | doc/guix.texi | 4 | ||||
-rw-r--r-- | nix/libstore/build.cc | 14 |
2 files changed, 16 insertions, 2 deletions
diff --git a/doc/guix.texi b/doc/guix.texi index 01363c1d13..cd4e550ef3 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -4332,6 +4332,10 @@ substitutes are genuine (@pxref{Substitutes}), or whether the build result of a package is deterministic. @xref{Invoking guix challenge}, for more background information and tools. +When used in conjunction with @option{--keep-failed}, the differing +output is kept in the store, under @file{/gnu/store/@dots{}-check}. +This makes it easy to look for differences between the two results. + @item --derivations @itemx -d Return the derivation paths, not the output paths, of the given diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc index dd8660dffe..d51705b48f 100644 --- a/nix/libstore/build.cc +++ b/nix/libstore/build.cc @@ -2431,8 +2431,18 @@ void DerivationGoal::registerOutputs() if (buildMode == bmCheck) { if (!store->isValidPath(path)) continue; ValidPathInfo info = worker.store.queryPathInfo(path); - if (hash.first != info.hash) - throw Error(format("derivation `%1%' may not be deterministic: hash mismatch in output `%2%'") % drvPath % path); + if (hash.first != info.hash) { + if (settings.keepFailed) { + Path dst = path + "-check"; + if (pathExists(dst)) deletePath(dst); + if (rename(actualPath.c_str(), dst.c_str())) + throw SysError(format("renaming `%1%' to `%2%'") % actualPath % dst); + throw Error(format("derivation `%1%' may not be deterministic: output `%2%' differs from ‘%3%’") + % drvPath % path % dst); + } else + throw Error(format("derivation `%1%' may not be deterministic: output `%2%' differs") + % drvPath % path); + } continue; } |