Bug#835805: dh-python: please make builds reproducible with "mismatched" kernel and userland

Chris Lamb lamby at debian.org
Sun Aug 28 12:28:04 UTC 2016


Source: dh-python
Version: 2.20160818
Severity: wishlist
Tags: patch
User: reproducible-builds at lists.alioth.debian.org
Usertags: environment toolchain
X-Debbugs-Cc: reproducible-builds at lists.alioth.debian.org

Hi,

Whilst working on the Reproducible Builds effort [0], I noticed
that some packages on i386 are not reproducible as they embed
debugging symbols that vary depending on whether a 32 or 64-bit
kernel is being used.

The root cause is because temporary build directories include the
uname output:

 -'build/bdist.linux-x86_64' does not exist -- can't clean it
 +'build/bdist.linux-i686' does not exist -- can't clean it

This value comes from ``sysconfig.get_platform``:

  http://sources.debian.net/src/python2.7/2.7.12-2/Lib/sysconfig.py/#L572-L584
  http://sources.debian.net/src/python3.5/3.5.2-3/Lib/sysconfig.py/#L646-L658

We can easily fix it for all dh-python packages by exporting
_PYTHON_HOST_PLATFORM in the environment (if not set!) to something
that does not vary depending on the kernel. For example, combining
DEB_TARGET_ARCH_OS and DEB_TARGET_ARCH (eg. "linux-i386").

Patch attached.

 [0] https://reproducible-builds.org/


Regards,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      lamby at debian.org / chris-lamb.co.uk
       `-
-------------- next part --------------
diff --git a/dhpython/tools.py b/dhpython/tools.py
index 6e47e17..93bde14 100644
--- a/dhpython/tools.py
+++ b/dhpython/tools.py
@@ -199,6 +199,18 @@ def execute(command, cwd=None, env=None, log_output=None, shell=True):
         * None if output should be included in the returned dict, or
         * False if output should be redirectored to stdout/stderr
     """
+    if env is None:
+        env = os.environ
+    try:
+        # Override _PYTHON_HOST_PLATFORM if not set to ensure debugging symbols
+        # on, for example, i386 emded a constant name regardless of the
+        # 32/64-bit kernel.
+        env.setdefault(
+            '_PYTHON_HOST_PLATFORM',
+            '{env[DEB_TARGET_ARCH_OS]}-{env[DEB_TARGET_ARCH]}'.format(env=env),
+        )
+    except KeyError:
+        pass
     args = {'shell': shell, 'cwd': cwd, 'env': env}
     close = False
     if log_output is False:


More information about the Reproducible-builds mailing list