If the package is creating at least one pure Python wheel, check whether
the baseline package contents (i.e. everything but compiled Python
modules, extensions and .dist-info) match between implementations.
This is meant to ensure that we can safely optimize builds by reusing
pure Python wheels from previous builds.

Signed-off-by: Michał Górny <mgo...@gentoo.org>
---
 eclass/distutils-r1.eclass | 40 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index 955c41fe4e2d..29e901720e6c 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -2022,6 +2022,44 @@ distutils-r1_src_configure() {
        return ${ret}
 }
 
+# @FUNCTION: _distutils-r1_compare_installed_files
+# @INTERNAL
+# @DESCRIPTION:
+# Verify the the match between files installed between this and previous
+# implementation.
+_distutils-r1_compare_installed_files() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       # QA check requires diff(1).
+       if ! type -P diff &>/dev/null; then
+               return
+       fi
+
+       # Perform the check only if at least one potentially reusable wheel
+       # has been produced.  Nonpure packages (e.g. NumPy) may install
+       # interpreter configuration details into sitedir.
+       if [[ ${!DISTUTILS_WHEELS[*]} != *-none-any.whl* &&
+                       ${!DISTUTILS_WHEELS[*]} != *-abi3-*.whl ]]; then
+               return
+       fi
+
+       local sitedir=${BUILD_DIR}/install$(python_get_sitedir)
+       if [[ -n ${_DISTUTILS_PREVIOUS_SITE} ]]; then
+               diff -dur \
+                       --exclude=__pycache__ \
+                       --exclude='*.dist-info' \
+                       --exclude="*$(get_modname)" \
+                       "${_DISTUTILS_PREVIOUS_SITE}" "${sitedir}"
+               if [[ ${?} -ne 0 ]]; then
+                       eqawarn "Package creating at least one pure Python 
wheel installs different"
+                       eqawarn "Python files between implementations.  See 
diff in build log, above"
+                       eqawarn "this message."
+               fi
+       fi
+
+       _DISTUTILS_PREVIOUS_SITE=${sitedir}
+}
+
 # @FUNCTION: _distutils-r1_post_python_compile
 # @INTERNAL
 # @DESCRIPTION:
@@ -2056,6 +2094,8 @@ _distutils-r1_post_python_compile() {
                find "${bindir}" -type f -exec sed -i \
                        -e 
"1s@^#!\(${EPREFIX}/usr/bin/\(python\|pypy\)\)@#!${root}\1@" \
                        {} + || die
+
+               _distutils-r1_compare_installed_files
        fi
 }
 
-- 
2.45.1


Reply via email to