summaryrefslogtreecommitdiff
blob: ef668aed9950eccdf7cc3c1b260d1a9185b0045d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 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
		[[ -x ${PYTHON} ]] || continue
		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