|
From: | Gábor Boskovits |
Subject: | bug#22533: Python bytecode reproducibility |
Date: | Sun, 4 Mar 2018 16:30:59 +0100 |
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---
[Prev in Thread] | Current Thread | [Next in Thread] |