python3: generate reproducible .pyc
authorJérôme Pouiller <jezz@sysmic.org>
Tue, 20 Dec 2016 13:46:24 +0000 (14:46 +0100)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Mon, 20 Mar 2017 22:03:18 +0000 (23:03 +0100)
.pyc files contain the modification time of the corresponding .py
source. In order to make the build reproducible, we fix the modification
time of all .py before compiling .pyc files.

In addition, since pycompile relies on the modification time to know if
a file needs to be recompiled, it is safer to force recompilation of all
source files.

This work was sponsored by `BA Robotic Systems'.

Signed-off-by: Jérôme Pouiller <jezz@sysmic.org>
Reviewed-by: Samuel Martin <s.martin49@gmail.com>
[Thomas: do not register PYTHON_FIX_TIME as a
 PYTHON_TARGET_FINALIZE_HOOKS, instead call it inside
 PYTHON_CREATE_PYC_FILES before doing the byte compilation.]
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
package/python3/python3.mk

index c8f8e1bf042700adb4e49d6013f6be8b9c679b1e..7bd6405b5d4e312742124af20019e395905fd91b 100644 (file)
@@ -237,10 +237,18 @@ PYTHON3_PATH = $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/sysconfigdat
 $(eval $(autotools-package))
 $(eval $(host-autotools-package))
 
+ifeq ($(BR2_REPRODUCIBLE),y)
+define PYTHON3_FIX_TIME
+       find $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR) -name '*.py' -print0 | \
+               xargs -0 --no-run-if-empty touch -d @$(SOURCE_DATE_EPOCH)
+endef
+endif
+
 define PYTHON3_CREATE_PYC_FILES
+       $(PYTHON3_FIX_TIME)
        PYTHONPATH="$(PYTHON3_PATH)" \
        $(HOST_DIR)/usr/bin/python$(PYTHON3_VERSION_MAJOR) \
-               support/scripts/pycompile.py \
+               support/scripts/pycompile.py $(if $(BR2_REPRODUCIBLE),--force) \
                $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)
 endef