summaryrefslogtreecommitdiff
blob: 7aeb91f938c1ef7860426754873233c44e38cdc6 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

DISTUTILS_EXT=1
DISTUTILS_USE_PEP517=setuptools
PYTHON_FULLY_TESTED=( python3_{11..14} )
PYTHON_TESTED=( "${PYTHON_FULLY_TESTED[@]}" pypy3_11 )
PYTHON_COMPAT=( "${PYTHON_TESTED[@]}" python3_{13,14}t )
PYTHON_REQ_USE="threads(+)"

inherit distutils-r1 multiprocessing pypi toolchain-funcs

DESCRIPTION="A Python to C compiler"
HOMEPAGE="
	https://cython.org/
	https://github.com/cython/cython/
	https://pypi.org/project/Cython/
"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="~alpha amd64 arm arm64 ~hppa ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 ~sparc x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
IUSE="test test-full"
RESTRICT="!test? ( test )"

BDEPEND="
	${RDEPEND}
	test? (
		test-full? (
			$(python_gen_cond_dep '
				dev-python/numpy[${PYTHON_USEDEP}]
			' "${PYTHON_FULLY_TESTED[@]}")
		)
	)
"

PATCHES=(
	"${FILESDIR}/${PN}-0.29.22-spawn-multiprocessing.patch"
	"${FILESDIR}/${PN}-0.29.23-pythran-parallel-install.patch"
	# https://github.com/cython/cython/pull/6957
	"${FILESDIR}/${P}-odr.patch"
)

distutils_enable_sphinx docs \
	dev-python/jinja2 \
	dev-python/sphinx-issues \
	dev-python/sphinx-tabs

python_compile() {
	# Python gets confused when it is in sys.path before build.
	local -x PYTHONPATH=

	if use elibc_musl ; then
		# Workaround for bug #925318
		local -x LDFLAGS="${LDFLAGS} -Wl,-z,stack-size=2097152"
	fi

	distutils-r1_python_compile
}

python_test() {
	# PYTHON_TESTED controls whether we expect the testsuite to
	# pass at all, while PYTHON_FULLY_TESTED allows skipping before
	# numpy is ported (and possibly other deps in future).
	if ! has "${EPYTHON/./_}" "${PYTHON_TESTED[@]}"; then
		einfo "Skipping tests on ${EPYTHON} (xfail)"
		return
	fi

	# Needed to avoid confusing cache tests
	unset CYTHON_FORCE_REGEN

	tc-export CC

	local testargs=(
		-vv
		-j "$(makeopts_jobs)"
		--work-dir "${BUILD_DIR}"/tests

		--no-examples
		--no-code-style

		# Fails to find embedded.c
		--exclude 'embedded'
		# coverage_installed_pkg needs dev-python/pip and doesn't like
		# 'externally-managed' (bug #927995), but we don't really
		# want automagic test dependencies at all, so just skip
		# unimportant-for-us coverage tests entirely.
		--exclude 'run.coverage*'
		--exclude 'Cython.Coverage'
		# Automagic on dev-python/python-tests, could add this in future
		--exclude 'run.test_exceptions'
		# TODO: Unpackaged dev-python/interpreters-pep-734 (interpreters_backport)
		# This only shows up as a failure with >=3.13.
		--exclude 'subinterpreters_threading_stress_test'

		# The fix for https://github.com/cython/cython/issues/6938
		# changes these tests s.t. they break with our build layout.
		--exclude 'build.depfile*'
	)

	if [[ ${EPYTHON} == pypy3* ]] ; then
		testargs+=(
			# Recursion issue
			--exclude 'run.if_else_expr'
			--exclude 'run.test_patma*'
			# Slight output difference (missing '<')
			--exclude 'run.cpp_exception_ptr_just_handler'

		)
	fi

	# Keep test-full for numpy as it's large and doesn't pass tests itself
	# on niche arches.
	if ! use test-full || ! has "${EPYTHON/./_}" "${PYTHON_FULLY_TESTED[@]}"; then
		testargs+=(
			--exclude 'run.numpy*'
			--exclude 'run.ufunc'
			--exclude 'numpy*'
		)
	fi

	"${PYTHON}" runtests.py "${testargs[@]}" || die "Tests fail with ${EPYTHON}"
}

python_install_all() {
	local DOCS=( CHANGES.rst README.rst ToDo.txt USAGE.txt )
	distutils-r1_python_install_all
}