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.
This commit is contained in:
		
							parent
							
								
									4ec626a286
								
							
						
					
					
						commit
						1aa19b24b2
					
				
					 9 changed files with 97 additions and 55 deletions
				
			
		|  | @ -98,6 +98,9 @@ struct ValidPathInfo | |||
| typedef list<ValidPathInfo> ValidPathInfos; | ||||
| 
 | ||||
| 
 | ||||
| enum BuildMode { bmNormal, bmRepair, bmCheck }; | ||||
| 
 | ||||
| 
 | ||||
| class StoreAPI  | ||||
| { | ||||
| public: | ||||
|  | @ -190,7 +193,7 @@ public: | |||
|        output paths can be created by running the builder, after | ||||
|        recursively building any sub-derivations. For inputs that are | ||||
|        not derivations, substitute them. */ | ||||
|     virtual void buildPaths(const PathSet & paths, bool repair = false) = 0; | ||||
|     virtual void buildPaths(const PathSet & paths, BuildMode buildMode = bmNormal) = 0; | ||||
| 
 | ||||
|     /* Ensure that a path is valid.  If it is not currently valid, it
 | ||||
|        may be made valid by running a substitute (if defined for the | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue