public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Michał Górny" <mgorny@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Cc: python@gentoo.org, "Michał Górny" <mgorny@gentoo.org>
Subject: [gentoo-dev] [PATCH] install-qa-check.d: Add check for missing Python bytecode (.pyc)
Date: Wed, 23 Oct 2019 12:14:47 +0200	[thread overview]
Message-ID: <20191023101447.157198-1-mgorny@gentoo.org> (raw)

Add a check that detects Python modules that were not compiled after
installation.  To limit false positives, this is only done on modules
installed to site-packages.

Early testing of this check made it possible to detect a bug
in python_optimize.

Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
 metadata/install-qa-check.d/60python-pyc | 83 ++++++++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 metadata/install-qa-check.d/60python-pyc

diff --git a/metadata/install-qa-check.d/60python-pyc b/metadata/install-qa-check.d/60python-pyc
new file mode 100644
index 000000000000..7fe3b0c963d1
--- /dev/null
+++ b/metadata/install-qa-check.d/60python-pyc
@@ -0,0 +1,83 @@
+# Copyright 2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# QA check: ensure that Python modules are compiled after installing
+# Maintainer: Python project <python@gentoo.org>
+
+inherit python-utils-r1
+
+python_pyc_check() {
+	local impl missing=() outdated=()
+	for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
+		python_export "${impl}" EPYTHON PYTHON
+		local sitedir=$(python_get_sitedir "${impl}")
+
+		if [[ -d ${D}${sitedir} ]]; then
+			local suffixes=() subdir=
+			case ${EPYTHON} in
+				python2*)
+					suffixes=( .py{c,o} )
+					;;
+				pypy)
+					suffixes=( .pyc )
+					;;
+				python3*|pypy3*)
+					local tag=$("${PYTHON}" -c 'import sys; print(sys.implementation.cache_tag)')
+					suffixes=( ".${tag}"{,.opt-{1,2}}.pyc )
+					subdir=__pycache__/
+					;;
+				*)
+					# skip testing unknown impl
+					continue
+					;;
+			esac
+
+			einfo "Verifying compiled files in ${sitedir}"
+			local f s
+			while read -d $'\0' -r f; do
+				local dir=${f%/*}
+				local basename=${f##*/}
+				basename=${basename%.py}
+
+				for s in "${suffixes[@]}"; do
+					local cache=${dir}/${subdir}${basename}${s}
+					if [[ ! -f ${cache} ]]; then
+						missing+=( "${cache}" )
+					elif [[ ${f} -nt ${cache} ]]; then
+						outdated+=( "${cache}" )
+					fi
+				done
+			done < <(find "${D}${sitedir}" -name '*.py' -print0)
+		fi
+	done
+
+	if [[ ${missing[@]} ]]; then
+		eqawarn
+		eqawarn "This package installs one or more Python modules that are not byte-compiled."
+		eqawarn "The following files are missing:"
+		eqawarn
+		eqatag -v python-pyc.missing "${missing[@]#${D}}"
+	fi
+
+	if [[ ${outdated[@]} ]]; then
+		eqawarn
+		eqawarn "This package installs one or more compiled Python modules that have older"
+		eqawarn "timestamps than the corresponding source files:"
+		eqawarn
+		eqatag -v python-pyc.outdated "${outdated[@]#${D}}"
+	fi
+
+	if [[ ${missing[@]} || ${outdated[@]} ]]; then
+		eqawarn
+		eqawarn "Please either fix the upstream build system to byte-compile Python modules"
+		eqawarn "correctly, or call python_optimize after installing them.  For more"
+		eqawarn "information, see:"
+		eqawarn "https://wiki.gentoo.org/wiki/Project:Python/Byte_compiling"
+		eqawarn
+	fi
+}
+
+python_pyc_check
+: # guarantee successful exit
+
+# vim:ft=ebuild
-- 
2.23.0



                 reply	other threads:[~2019-10-23 10:15 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191023101447.157198-1-mgorny@gentoo.org \
    --to=mgorny@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    --cc=python@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox