# Copyright 2020-2021 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # QA check: verify correctness of DISTUTILS_USE_SETUPTOOLS # Maintainer: Python project distutils_use_setuptools_check() { # applicable only to ebuilds inheriting distutils-r1 [[ ${_DISTUTILS_R1} ]] || return # 'manual' means no checking [[ ${DISTUTILS_USE_SETUPTOOLS} == manual ]] && return # pyproject.toml is verified by using it [[ ${DISTUTILS_USE_SETUPTOOLS} == pyproject.toml ]] && return # setuptools dep is not set if distutils is optional if [[ ${DISTUTILS_OPTIONAL} ]]; then if [[ ${DISTUTILS_USE_SETUPTOOLS} != bdepend ]]; then eerror "QA Notice: DISTUTILS_USE_SETUPTOOLS is not used when DISTUTILS_OPTIONAL" eerror "is enabled." fi return fi local expected=() for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do local EPYTHON PYTHON _python_export "${impl}" EPYTHON PYTHON [[ -x ${PYTHON} ]] || continue local sitedir=${D}$(python_get_sitedir) if [[ -d ${sitedir} ]]; then local egg new_expected while read -d $'\0' -r egg; do if [[ -f ${egg} ]]; then # if .egg-info is a file, it's plain distutils new_expected=no elif [[ -f ${egg}/requires.txt ]] && grep -q -s '^setuptools' \ <(sed -e '/^\[/,$d' "${egg}"/requires.txt) then # explicit *unconditional* rdepend in package metadata new_expected=rdepend elif grep -q -s '\[\(console\|gui\)_scripts\]' \ "${egg}"/entry_points.txt then new_expected=entry-point else new_expected=bdepend fi if ! has "${new_expected}" "${expected[@]}"; then expected+=( "${new_expected[@]}" ) fi done < <(find "${sitedir}" -name '*.egg-info' -print0) fi done if [[ ${#expected[@]} -gt 1 ]] && has no "${expected[@]}"; then # 'no' and '[rb]depend' are mutually exclusive eerror "QA Notice: The package seems to have used distutils and setuptools" eerror "simultaneously" eerror "" eerror "This could mean the package has bad conditions:" eerror "https://dev.gentoo.org/~mgorny/python-guide/distutils.html#conditional-distutils-setuptools-use-in-packages" eerror "Please report a bug about this and CC python@" else # if we did not find anything, also assume 'no' is desired, # we do not want the setuptools dep [[ ${#expected[@]} -eq 0 ]] && expected=( no ) # *+rdepend=rdepend has rdepend "${expected[@]}" && expected=( rdepend ) # NB: note that expected is overwritten above, so this implies !rdepend # if the package is using entry points, modern versions of setuptools # use built-in importlib.metadata module, so no rdep needed anymore # NB2: this is incorrect for pypy3.7 but we ignore this for the time # being has entry-point "${expected[@]}" && expected=( bdepend ) if ! has ${DISTUTILS_USE_SETUPTOOLS} "${expected[@]}"; then local def= [[ ${DISTUTILS_USE_SETUPTOOLS} == bdepend ]] && def=' (or unset)' eqawarn "QA Notice: DISTUTILS_USE_SETUPTOOLS value is probably incorrect" eqawarn " have: DISTUTILS_USE_SETUPTOOLS=${DISTUTILS_USE_SETUPTOOLS}${def}" if [[ ${expected[0]} == bdepend ]]; then eqawarn " expected: (unset)" else eqawarn " expected: DISTUTILS_USE_SETUPTOOLS=${expected[0]}" fi fi fi } distutils_use_setuptools_check : # guarantee successful exit # vim:ft=ebuild