# Copyright 2019-2022 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_pyc_check() { local save=$(shopt -p nullglob) shopt -s nullglob local progs=( "${EPREFIX}"/usr/lib/python-exec/*/gpep517 ) ${save} local invalid=() local mismatched_timestamp=() local mismatched_data=() local missing=() local stray=() # Avoid running the check if sufficiently new gpep517 is not installed # yet. It's valid to schedule (for merge order) >=gpep517-8 after # packages which have this check run if they don't use distutils-r1. nonfatal has_version ">=dev-python/gpep517-8" || return for prog in "${progs[@]}"; do local impl=${prog%/*} impl=${impl##*/} [[ -d "${ED}"/usr/lib/${impl}/site-packages ]] || continue einfo "Verifying compiled files for ${impl}" local kind pyc py while IFS=: read -r kind pyc py extra; do case ${kind} in invalid) invalid+=( "${pyc}" ) ;; mismatched) case ${extra} in timestamp) mismatched_timestamp+=( "${pyc}" ) ;; *) mismatched_data+=( "${pyc}" ) ;; esac ;; missing) missing+=( "${pyc}" ) ;; older) # older warnings were produced by earlier version # of gpep517 but the check was incorrect, so we just # ignore them ;; stray) stray+=( "${pyc}" ) ;; esac done < <("${prog}" verify-pyc --destdir "${D}" --prefix "${EPREFIX}"/usr) done local found= if [[ ${missing[@]} ]]; then eqawarn eqawarn "QA Notice: This package installs one or more Python modules that are" eqawarn "not byte-compiled." eqawarn "The following files are missing:" eqawarn eqatag -v python-pyc.missing "${missing[@]}" found=1 fi if [[ ${invalid[@]} ]]; then eqawarn eqawarn "QA Notice: This package installs one or more compiled Python modules" eqawarn "that seem to be invalid (do not have the correct header)." eqawarn "The following files are invalid:" eqawarn eqatag -v python-pyc.invalid "${invalid[@]}" found=1 fi if [[ ${mismatched_data[@]} ]]; then eqawarn eqawarn "QA Notice: This package installs one or more compiled Python modules whose" eqawarn ".py files have different content (size or hash) than recorded:" eqawarn eqatag -v python-pyc.mismatched.data "${mismatched_data[@]}" found=1 fi if [[ ${mismatched_timestamp[@]} ]]; then eqawarn eqawarn "QA Notice: This package installs one or more compiled Python modules whose" eqawarn ".py files have different timestamps than recorded:" eqawarn eqatag -v python-pyc.mismatched.timestamp "${mismatched_timestamp[@]}" found=1 fi if [[ ${stray[@]} ]]; then eqawarn eqawarn "QA Notice: This package installs one or more compiled Python modules" eqawarn "that do not match installed modules (or their implementation)." eqawarn "The following files are stray:" eqawarn eqatag -v python-pyc.stray "${stray[@]}" found=1 fi if [[ ${found} ]]; then eqawarn eqawarn "For more information on bytecode files and related issues, please see:" eqawarn " https://projects.gentoo.org/python/guide/qawarn.html#compiled-bytecode-related-warnings" fi } python_pyc_check : # guarantee successful exit # vim:ft=ebuild