summaryrefslogtreecommitdiff
blob: 0a1688a83c5e2f956b365dee53305f7c785305d4 (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
# Copyright 2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

# QA check: verify correctness of DISTUTILS_USE_SETUPTOOLS
# Maintainer: Python project <python@gentoo.org>

get_expected_distutils_use_setuptools() {
	local sitedir=${D}$(python_get_sitedir)
	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 grep -q -s -F '[console_scripts]' "${egg}"/entry_points.txt
		then
			# entry_points == we need rdepend
			new_expected=rdepend
		elif grep -q -E -s '^setuptools' "${egg}"/requires.txt
		then
			# explicit rdepend in package metadata
			new_expected=rdepend
		else
			new_expected=bdepend
		fi

		if ! has "${new_expected}" "${expected[@]}"; then
			expected+=( "${new_expected[@]}" )
		fi
	done < <(find "${sitedir}" -name '*.egg-info' -print0)
}

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

	local expected=()
	_distutils-r1_run_foreach_impl get_expected_distutils_use_setuptools

	# at this point, expected can contain: no bdepend rdepend
	if [[ ${#expected[@]} -eq 0 ]]; then
		eerror "No .egg-info found.  Please report a bug and CC python@"
	elif [[ ${#expected[@]} -gt 1 ]] && has no "${expected[@]}"; then
		# 'no' and '[rb]depend' are mutually exclusive
		eerror "The package seems to have used distutils and setuptools simultaneously."
		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
		# bdepend+rdepend=rdepend
		has rdepend "${expected[@]}" && expected=( rdepend )
		# at this point, expected should have exactly one value
		[[ ${#expected[@]} -eq 1 ]] || die "integrity error"

		if [[ ${DISTUTILS_USE_SETUPTOOLS} != ${expected} ]]; then
				local def=
				[[ ${DISTUTILS_USE_SETUPTOOLS} == bdepend ]] && def=' (or unset)'

				eqawarn "DISTUTILS_USE_SETUPTOOLS value is probably incorrect"
				eqawarn "  have:     DISTUTILS_USE_SETUPTOOLS=${DISTUTILS_USE_SETUPTOOLS}${def}"
				eqawarn "  expected: DISTUTILS_USE_SETUPTOOLS=${expected}"
		fi
	fi
}

distutils_use_setuptools_check

: # guarantee successful exit

# vim:ft=ebuild