From 09e6ae577bcd7eb8d8e142fc473798f938cbae1c Mon Sep 17 00:00:00 2001 From: Evgeny Egorochkin Date: Sat, 22 Jun 2013 08:52:27 +0300 Subject: [PATCH] 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. --- .../interpreters/python/2.7/default.nix | 4 +++ .../python/2.7/deterministic-build.patch | 36 +++++++++++++++++++ .../python-modules/generic/default.nix | 1 + 3 files changed, 41 insertions(+) create mode 100644 pkgs/development/interpreters/python/2.7/deterministic-build.patch diff --git a/pkgs/development/interpreters/python/2.7/default.nix b/pkgs/development/interpreters/python/2.7/default.nix index 4110f2502dc..ccb423ef32e 100644 --- a/pkgs/development/interpreters/python/2.7/default.nix +++ b/pkgs/development/interpreters/python/2.7/default.nix @@ -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) '' diff --git a/pkgs/development/interpreters/python/2.7/deterministic-build.patch b/pkgs/development/interpreters/python/2.7/deterministic-build.patch new file mode 100644 index 00000000000..98d9d339fa1 --- /dev/null +++ b/pkgs/development/interpreters/python/2.7/deterministic-build.patch @@ -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); + diff --git a/pkgs/development/python-modules/generic/default.nix b/pkgs/development/python-modules/generic/default.nix index f72fbff1806..d32c6818bb2 100644 --- a/pkgs/development/python-modules/generic/default.nix +++ b/pkgs/development/python-modules/generic/default.nix @@ -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} '';