# 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"
)

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'
	)

	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
}