GNU bug report logs -
#22533
Non-determinism in python-3 ".pyc" bytecode
Previous Next
Reported by: Leo Famulari <leo <at> famulari.name>
Date: Tue, 2 Feb 2016 05:17:02 UTC
Severity: important
Done: Ricardo Wurmus <rekado <at> elephly.net>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Hi Gábor,
> Nix had this issue, it seems they have a python 3.5 solution, which
> should be easy to adopt: https://github.com/NixOS/nixpkgs/issues/22570.
> WDYT?
Here’s the patch for Nix:
https://patch-diff.githubusercontent.com/raw/NixOS/nixpkgs/pull/22585.diff
Here are the relevant changes to the Python packages:
* Python 3.4
substituteInPlace "Lib/py_compile.py" --replace "source_stats['mtime']" "(1 if 'DETERMINISTIC_BUILD' in os.environ else source_stats['mtime'])"
substituteInPlace "Lib/importlib/_bootstrap.py" --replace "source_mtime = int(source_stats['mtime'])" "source_mtime = 1"
* Python 3.5
substituteInPlace "Lib/py_compile.py" --replace "source_stats['mtime']" "(1 if 'DETERMINISTIC_BUILD' in os.environ else source_stats['mtime'])"
substituteInPlace "Lib/importlib/_bootstrap_external.py" --replace "source_mtime = int(st['mtime'])" "source_mtime = 1"
* Python 3.6
substituteInPlace "Lib/py_compile.py" --replace "source_stats['mtime']" "(1 if 'DETERMINISTIC_BUILD' in os.environ else source_stats['mtime'])"
substituteInPlace "Lib/importlib/_bootstrap_external.py" --replace "source_mtime = int(st['mtime'])" "source_mtime = 1"
For all packages they set these environment variables:
- set PYTHONHASHSEED=0 (for hashes of str, bytes and datetime objects)
- set DETERMINISTIC_BUILD; for conditional patching of the timestamp
for package builds. The timestamp is not patched in ad-hoc
environments, because that would mess with Python’s ability to
determine whether to compile source files.
They also rebuild all bytecode (with the exception of lib2to3 because it
is Python 2 code) three times, once for each optimization level.
--8<---------------cut here---------------start------------->8---
+ # Determinism: rebuild all bytecode
+ # We exclude lib2to3 because that's Python 2 code which fails
+ # We rebuild three times, once for each optimization level
+ find $out -name "*.py" | $out/bin/python -m compileall -q -f -x "lib2to3" -i -
+ find $out -name "*.py" | $out/bin/python -O -m compileall -q -f -x "lib2to3" -i -
+ find $out -name "*.py" | $out/bin/python -OO -m compileall -q -f -x "lib2to3" -i -
--8<---------------cut here---------------end--------------->8---
--
Ricardo
GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC
https://elephly.net
This bug report was last modified 6 years and 106 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.