Python: add DETERMINISTIC_BUILD env var. If set, python doesn't write timestamps to pyc files. Tested by
building argparse, compiling from cli, compiling using py_compile.
This commit is contained in:
		
							parent
							
								
									a3bf1ca3b1
								
							
						
					
					
						commit
						09e6ae577b
					
				@ -25,6 +25,10 @@ let
 | 
			
		||||
      # doesn't work in Nix because Nix changes the mtime of files in
 | 
			
		||||
      # the Nix store to 1.  So treat that as a special case.
 | 
			
		||||
      ./nix-store-mtime.patch
 | 
			
		||||
 | 
			
		||||
      # patch python to put zero timestamp into pyc
 | 
			
		||||
      # if DETERMINISTIC_BUILD env var is set
 | 
			
		||||
      ./deterministic-build.patch
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
  postPatch = stdenv.lib.optionalString (stdenv.gcc.libc != null) ''
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,36 @@
 | 
			
		||||
diff -ur orig/Lib/py_compile.py new/Lib/py_compile.py
 | 
			
		||||
--- orig/Lib/py_compile.py
 | 
			
		||||
+++ new/Lib/py_compile.py
 | 
			
		||||
@@ -122,7 +122,10 @@
 | 
			
		||||
         cfile = file + (__debug__ and 'c' or 'o')
 | 
			
		||||
     with open(cfile, 'wb') as fc:
 | 
			
		||||
         fc.write('\0\0\0\0')
 | 
			
		||||
-        wr_long(fc, timestamp)
 | 
			
		||||
+        if "DETERMINISTIC_BUILD" in os.environ:
 | 
			
		||||
+            fc.write('\0\0\0\0')
 | 
			
		||||
+        else:
 | 
			
		||||
+            wr_long(fc, timestamp)
 | 
			
		||||
         marshal.dump(codeobject, fc)
 | 
			
		||||
         fc.flush()
 | 
			
		||||
         fc.seek(0, 0)
 | 
			
		||||
diff -ur orig/Python/import.c new/Python/import.c
 | 
			
		||||
--- orig/Python/import.c
 | 
			
		||||
+++ new/Python/import.c
 | 
			
		||||
@@ -939,10 +939,12 @@
 | 
			
		||||
         return;
 | 
			
		||||
     }
 | 
			
		||||
     /* Now write the true mtime (as a 32-bit field) */
 | 
			
		||||
-    fseek(fp, 4L, 0);
 | 
			
		||||
-    assert(mtime <= 0xFFFFFFFF);
 | 
			
		||||
-    PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
 | 
			
		||||
-    fflush(fp);
 | 
			
		||||
+    if (Py_GETENV("DETERMINISTIC_BUILD") == NULL) {
 | 
			
		||||
+        fseek(fp, 4L, 0);
 | 
			
		||||
+        assert(mtime <= 0xFFFFFFFF);
 | 
			
		||||
+        PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
 | 
			
		||||
+        fflush(fp);
 | 
			
		||||
+    }
 | 
			
		||||
     fclose(fp);
 | 
			
		||||
     if (Py_VerboseFlag)
 | 
			
		||||
         PySys_WriteStderr("# wrote %s\n", cpathname);
 | 
			
		||||
 | 
			
		||||
@ -68,6 +68,7 @@ python.stdenv.mkDerivation (attrs // {
 | 
			
		||||
  pythonPath = [ setuptools ] ++ pythonPath;
 | 
			
		||||
 | 
			
		||||
  preConfigure = ''
 | 
			
		||||
    export DETERMINISTIC_BUILD=1
 | 
			
		||||
    PYTHONPATH="${offlineDistutils}/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
 | 
			
		||||
    ${preConfigure}
 | 
			
		||||
  '';
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user