git: 150c0018fdfe - main - Mk/Uses/python.mk: Introduce USE_PYTHON=cython3{,_run,_test}

From: Po-Chuan Hsieh <sunpoet_at_FreeBSD.org>
Date: Wed, 09 Apr 2025 15:00:30 UTC
The branch main has been updated by sunpoet:

URL: https://cgit.FreeBSD.org/ports/commit/?id=150c0018fdfece47d43cc508378c8faf26046149

commit 150c0018fdfece47d43cc508378c8faf26046149
Author:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
AuthorDate: 2025-04-09 14:53:16 +0000
Commit:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
CommitDate: 2025-04-09 14:55:11 +0000

    Mk/Uses/python.mk: Introduce USE_PYTHON=cython3{,_run,_test}
    
    - Update USE_PYTHON=cython{,_run,_test}
    - Convert all cython3 occurrence to USE_PYTHON=cython3*
    - While I'm here, fix incorrect usage of combining cython3 in BUILD_DEPENDS and USE_PYTHON=cython
    
    It is added to simplify the future transition from Cython 0.29 to 3.
    
    The minimal version is set to 3.0.12 because it is required by devel/py-propcache.
    The upper bound of version is set to 3.1 because it is limited by multiple ports.
---
 Mk/Uses/python.mk                                | 28 +++++++++++++++++++++---
 astro/py-astropy/Makefile                        |  3 +--
 biology/py-bx-python/Makefile                    |  5 ++---
 biology/py-dnaio/Makefile                        |  5 ++---
 biology/py-macs3/Makefile                        |  3 +--
 biology/py-pyrodigal/Makefile                    |  5 ++---
 comms/py-libimobiledevice/Makefile               |  5 ++---
 converters/py-rencode/Makefile                   |  5 ++---
 databases/py-snowflake-connector-python/Makefile |  3 +--
 devel/py-ewah-bool-utils/Makefile                |  3 +--
 devel/py-frozenlist/Makefile                     |  3 +--
 devel/py-gevent/Makefile                         |  3 +--
 devel/py-libplist/Makefile                       |  3 +--
 devel/py-line-profiler/Makefile                  |  5 ++---
 devel/py-lxml5/Makefile                          |  5 ++---
 devel/py-propcache/Makefile                      |  5 ++---
 devel/py-pykdtree/Makefile                       |  5 ++---
 devel/py-qutip/Makefile                          |  6 ++---
 graphics/py-imagecodecs/Makefile                 |  5 ++---
 graphics/py-pandana/Makefile                     |  5 ++---
 graphics/py-pyproj/Makefile                      |  3 +--
 graphics/py-simplejpeg/Makefile                  |  3 +--
 graphics/py-vispy/Makefile                       |  5 ++---
 japanese/py-fugashi/Makefile                     |  3 +--
 lang/py-lupa/Makefile                            |  5 ++---
 math/py-CyLP/Makefile                            |  5 ++---
 math/py-PySCIPOpt/Makefile                       |  3 +--
 math/py-cypari2/Makefile                         |  5 ++---
 math/py-fpylll/Makefile                          |  3 +--
 math/py-linearmodels/Makefile                    |  5 ++---
 math/py-pandas/Makefile                          |  5 ++---
 math/py-petsc4py/Makefile                        |  5 ++---
 math/py-primme/Makefile                          |  3 +--
 math/py-pyFFTW/Makefile                          |  5 ++---
 math/py-pywavelets/Makefile                      |  5 ++---
 math/py-slepc4py/Makefile                        |  5 ++---
 math/py-yt/Makefile                              |  6 ++---
 net/py-mpi4py/Makefile                           |  4 +---
 net/py-zeroconf/Makefile                         |  5 ++---
 science/py-dimod/Makefile                        |  5 ++---
 science/py-dipy/Makefile                         |  5 ++---
 science/py-dwave-optimization/Makefile           |  5 ++---
 science/py-dwave-preprocessing/Makefile          |  5 ++---
 science/py-dwave-samplers/Makefile               |  5 ++---
 textproc/py-openstep-plist/Makefile              |  5 ++---
 www/py-wsaccel/Makefile                          |  5 ++---
 www/py-yarl/Makefile                             |  5 ++---
 x11/xpra/Makefile                                |  5 ++---
 48 files changed, 105 insertions(+), 133 deletions(-)

diff --git a/Mk/Uses/python.mk b/Mk/Uses/python.mk
index b8378ce3e845..6e0efd8bccfb 100644
--- a/Mk/Uses/python.mk
+++ b/Mk/Uses/python.mk
@@ -96,6 +96,12 @@
 #
 #	cython_test	- Depend on lang/cython for tests.
 #
+#	cython3		- Depend on lang/cython3 at build-time.
+#
+#	cython3_run	- Depend on lang/cython3 at run-time.
+#
+#	cython3_test	- Depend on lang/cython3 for tests.
+#
 #	flavors		- Force creation of flavors for Python 2 and 3 default
 #			  versions, where applicable.
 #
@@ -331,6 +337,9 @@ _VALID_PYTHON_FEATURES=	allflavors \
 			cython \
 			cython_run \
 			cython_test \
+			cython3 \
+			cython3_run \
+			cython3_test \
 			distutils \
 			flavors \
 			noegginfo \
@@ -624,16 +633,29 @@ TEST_DEPENDS+=	${CRYPTOGRAPHY_DEPENDS}
 .  endif
 
 # cython* support
+
 .  if defined(_PYTHON_FEATURE_CYTHON)
-BUILD_DEPENDS+=	cython-${PYTHON_VER}:lang/cython@${PY_FLAVOR}
+BUILD_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cython>=0.29.37<3:lang/cython@${PY_FLAVOR}
 .  endif
 
 .  if defined(_PYTHON_FEATURE_CYTHON_RUN)
-RUN_DEPENDS+=	cython-${PYTHON_VER}:lang/cython@${PY_FLAVOR}
+RUN_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cython>=0.29.37<3:lang/cython@${PY_FLAVOR}
 .  endif
 
 .  if defined(_PYTHON_FEATURE_CYTHON_TEST)
-TEST_DEPENDS+=	cython-${PYTHON_VER}:lang/cython@${PY_FLAVOR}
+TEST_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cython>=0.29.37<3:lang/cython@${PY_FLAVOR}
+.  endif
+
+.  if defined(_PYTHON_FEATURE_CYTHON3)
+BUILD_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.12<3.1:lang/cython3@${PY_FLAVOR}
+.  endif
+
+.  if defined(_PYTHON_FEATURE_CYTHON3_RUN)
+RUN_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.12<3.1:lang/cython3@${PY_FLAVOR}
+.  endif
+
+.  if defined(_PYTHON_FEATURE_CYTHON3_TEST)
+TEST_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.12<3.1:lang/cython3@${PY_FLAVOR}
 .  endif
 
 .  if defined(_PYTHON_FEATURE_CONCURRENT)
diff --git a/astro/py-astropy/Makefile b/astro/py-astropy/Makefile
index 8f4f05db21cd..ebcf0705b801 100644
--- a/astro/py-astropy/Makefile
+++ b/astro/py-astropy/Makefile
@@ -14,14 +14,13 @@ LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE.rst
 
 BUILD_DEPENDS=	${PYNUMPY} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}extension-helpers>=0:astro/py-extension-helpers@${PY_FLAVOR}
 RUN_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}pyerfa>=0:astro/py-pyerfa@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}astropy-iers-data>=0:astro/py-astropy-iers-data@${PY_FLAVOR}
 
 USES=		compiler:c11 python
-USE_PYTHON=	autoplist distutils
+USE_PYTHON=	autoplist cython3 distutils
 
 CONFLICTS_INSTALL=	p5-Data-ShowTable # bin/showtable
 
diff --git a/biology/py-bx-python/Makefile b/biology/py-bx-python/Makefile
index 2529daec6f1c..6b66a17d1250 100644
--- a/biology/py-bx-python/Makefile
+++ b/biology/py-bx-python/Makefile
@@ -14,12 +14,11 @@ LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
 PY_DEPENDS=	${PYNUMPY}
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
-		${PY_DEPENDS}
+BUILD_DEPENDS=	${PY_DEPENDS}
 RUN_DEPENDS=	${PY_DEPENDS}
 
 USES=		compiler python
-USE_PYTHON=	distutils autoplist
+USE_PYTHON=	autoplist cython3 distutils
 
 post-install:
 	@${FIND} ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}/bx -name "*.so" | ${XARGS} ${STRIP_CMD}
diff --git a/biology/py-dnaio/Makefile b/biology/py-dnaio/Makefile
index 3baff38a1558..9bcb46dd389e 100644
--- a/biology/py-dnaio/Makefile
+++ b/biology/py-dnaio/Makefile
@@ -13,10 +13,9 @@ LICENSE_FILE=	${WRKSRC}/LICENSE
 
 BUILD_DEPENDS=	${PY_SETUPTOOLS} \
 		${PYTHON_PKGNAMEPREFIX}setuptools-scm>0:devel/py-setuptools-scm@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR}
+		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 
 USES=		python
-USE_PYTHON=	autoplist pep517
+USE_PYTHON=	autoplist cython3 pep517
 
 .include <bsd.port.mk>
diff --git a/biology/py-macs3/Makefile b/biology/py-macs3/Makefile
index 6387fafd3346..bcb58abd2808 100644
--- a/biology/py-macs3/Makefile
+++ b/biology/py-macs3/Makefile
@@ -21,7 +21,6 @@ COMMON_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}hmmlearn>=0.3.2:math/py-hmmlearn@${PY_FLAVOR}
 BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR} \
 		simde>0:devel/simde \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3 \
 		${COMMON_DEPENDS}
 RUN_DEPENDS=	${COMMON_DEPENDS}
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pytest>0:devel/py-pytest@${PY_FLAVOR} \
@@ -30,7 +29,7 @@ TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pytest>0:devel/py-pytest@${PY_FLAVOR} \
 USES=		localbase perl5 python shebangfix
 USE_GITHUB=	yes
 USE_PERL5=	test
-USE_PYTHON=	autoplist concurrent distutils
+USE_PYTHON=	autoplist concurrent cython3 distutils
 
 GH_ACCOUNT=	macs3-project
 GH_PROJECT=	MACS
diff --git a/biology/py-pyrodigal/Makefile b/biology/py-pyrodigal/Makefile
index 69fe87cb7ad2..d4dfc118e33b 100644
--- a/biology/py-pyrodigal/Makefile
+++ b/biology/py-pyrodigal/Makefile
@@ -12,12 +12,11 @@ WWW=		https://pyrodigal.readthedocs.io/en/stable/ \
 LICENSE=	GPLv3
 LICENSE_FILE=	${WRKSRC}/COPYING
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}scikit-build-core>0:devel/py-scikit-build-core@${PY_FLAVOR}
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}scikit-build-core>0:devel/py-scikit-build-core@${PY_FLAVOR}
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}archspec>0:devel/py-archspec@${PY_FLAVOR}
 
 USES=		cmake:indirect python
-USE_PYTHON=	pep517 concurrent autoplist pytest # cython: cython3 isn't yet supported by python.mk
+USE_PYTHON=	autoplist concurrent cython3 pep517 pytest
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
 
diff --git a/comms/py-libimobiledevice/Makefile b/comms/py-libimobiledevice/Makefile
index f44618dab70e..35fc77e525c1 100644
--- a/comms/py-libimobiledevice/Makefile
+++ b/comms/py-libimobiledevice/Makefile
@@ -7,12 +7,11 @@ COMMENT=	Python bindings for libimobiledevice
 
 LIB_DEPENDS=	libimobiledevice-1.0.so:${MASTER_PORT} \
 		libplist-2.0.so:devel/libplist
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}libplist>=2.2.0:devel/py-libplist@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0.0:lang/cython3@${PY_FLAVOR}
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}libplist>=2.2.0:devel/py-libplist@${PY_FLAVOR}
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}libplist>=2.2.0:devel/py-libplist@${PY_FLAVOR}
 
 USES+=		python
-USE_PYTHON=	flavors
+USE_PYTHON=	cython3 flavors
 
 CONFIGURE_ENV=	PYTHON_LDFLAGS="`pkg-config --libs python-${PYTHON_VER}`"
 
diff --git a/converters/py-rencode/Makefile b/converters/py-rencode/Makefile
index 06b157739c4f..589cec228dad 100644
--- a/converters/py-rencode/Makefile
+++ b/converters/py-rencode/Makefile
@@ -11,13 +11,12 @@ WWW=		https://github.com/aresch/rencode
 LICENSE=	GPLv3
 LICENSE_FILE=	${WRKSRC}/COPYING
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}setuptools>0:devel/py-setuptools@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools>0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 
 USES=		cpe python
 CPE_VENDOR=	${PORTNAME}_project
-USE_PYTHON=	autoplist pep517
+USE_PYTHON=	autoplist cython3 pep517
 
 USE_GITHUB=	yes
 GH_ACCOUNT=	aresch
diff --git a/databases/py-snowflake-connector-python/Makefile b/databases/py-snowflake-connector-python/Makefile
index 2f4dcef617b8..d6693a8d8b05 100644
--- a/databases/py-snowflake-connector-python/Makefile
+++ b/databases/py-snowflake-connector-python/Makefile
@@ -12,7 +12,6 @@ WWW=		https://github.com/snowflakedb/snowflake-connector-python
 
 LICENSE=	APACHE20
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR}
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}asn1crypto>0.24.0<2.0.0:devel/py-asn1crypto@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}cffi>=1.9<2:devel/py-cffi@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}openssl>=16.2.0:security/py-openssl@${PY_FLAVOR} \
@@ -30,7 +29,7 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}asn1crypto>0.24.0<2.0.0:devel/py-asn1crypto@
 		${PYTHON_PKGNAMEPREFIX}tomlkit>0:textproc/py-tomlkit@${PY_FLAVOR}
 
 USES=		python
-USE_PYTHON=	autoplist concurrent cryptography distutils
+USE_PYTHON=	autoplist concurrent cryptography cython3 distutils
 
 .include <bsd.port.pre.mk>
 
diff --git a/devel/py-ewah-bool-utils/Makefile b/devel/py-ewah-bool-utils/Makefile
index 87bd17ad29e9..dd5e7943d647 100644
--- a/devel/py-ewah-bool-utils/Makefile
+++ b/devel/py-ewah-bool-utils/Makefile
@@ -13,13 +13,12 @@ LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
 BUILD_DEPENDS=	${PY_SETUPTOOLS} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0.37.1:devel/py-wheel@${PY_FLAVOR} \
 		${PYNUMPY}
 RUN_DEPENDS=	${PYNUMPY}
 
 USES=		python
-USE_PYTHON=	pep517 autoplist pytest
+USE_PYTHON=	autoplist cython3 pep517 pytest
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR} # tests fail to run, see https://github.com/yt-project/ewah_bool_utils/issues/41
 TEST_WRKSRC=	${WRKSRC}/tests
diff --git a/devel/py-frozenlist/Makefile b/devel/py-frozenlist/Makefile
index 4af64e1311c0..347ba9e9727d 100644
--- a/devel/py-frozenlist/Makefile
+++ b/devel/py-frozenlist/Makefile
@@ -15,12 +15,11 @@ LICENSE_FILE=	${WRKSRC}/LICENSE
 BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}expandvars>=0:devel/py-expandvars@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=47:devel/py-setuptools@${PY_FLAVOR} \
 		${PY_TOMLI} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0.0.b.1:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pytest-cov>=0:devel/py-pytest-cov@${PY_FLAVOR}
 
 USES=		gettext-runtime python
-USE_PYTHON=	autoplist concurrent pep517 pytest
+USE_PYTHON=	autoplist concurrent cython3 pep517 pytest
 
 post-install:
 	${FIND} ${STAGEDIR}${PYTHON_SITELIBDIR} -name '*.so' -exec ${STRIP_CMD} {} +
diff --git a/devel/py-gevent/Makefile b/devel/py-gevent/Makefile
index dd5e428882c0..c7f86e60793d 100644
--- a/devel/py-gevent/Makefile
+++ b/devel/py-gevent/Makefile
@@ -17,7 +17,6 @@ BUILD_DEPENDS=	c-ares>=1.15.0:dns/c-ares \
 		libev>=4.31:devel/libev \
 		libuv>=1.34.0:devel/libuv \
 		${PYTHON_PKGNAMEPREFIX}cffi>=1.12.3:devel/py-cffi@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0.8:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}greenlet>=3.0.3:devel/py-greenlet@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=40.8.0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
@@ -31,7 +30,7 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cffi>=1.12.3:devel/py-cffi@${PY_FLAVOR} \
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}sqlite3>=0:databases/py-sqlite3@${PY_FLAVOR}
 
 USES=		compiler:c11 localbase python
-USE_PYTHON=	autoplist concurrent pep517
+USE_PYTHON=	autoplist concurrent cython3 pep517
 
 MAKE_ENV=	GEVENTSETUP_EMBED_CARES=0 GEVENTSETUP_EMBED_LIBEV=0 GEVENTSETUP_EMBED_LIBUV=0
 TEST_ENV=	PYTHONPATH=${STAGEDIR}${PYTHON_SITELIBDIR}
diff --git a/devel/py-libplist/Makefile b/devel/py-libplist/Makefile
index ad3bb9b9d1c1..e4d97860fb00 100644
--- a/devel/py-libplist/Makefile
+++ b/devel/py-libplist/Makefile
@@ -5,11 +5,10 @@ PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
 MAINTAINER=	jhale@FreeBSD.org
 COMMENT=	Python bindings for libplist
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.0:lang/cython3@${PY_FLAVOR}
 LIB_DEPENDS=	libplist-2.0.so:${MASTER_PORT}
 
 USES+=		localbase:ldflags python
-USE_PYTHON=	flavors
+USE_PYTHON=	cython3 flavors
 
 CONFIGURE_ENV=	PYTHON_LDFLAGS="`pkg-config --libs python-${PYTHON_VER}`"
 
diff --git a/devel/py-line-profiler/Makefile b/devel/py-line-profiler/Makefile
index 6c9df8b769ef..68e6a134434d 100644
--- a/devel/py-line-profiler/Makefile
+++ b/devel/py-line-profiler/Makefile
@@ -14,8 +14,7 @@ LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 
 BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}scikit-build>0:devel/py-scikit-build@${PY_FLAVOR} \
-		cmake:devel/cmake-core \
-		${PYTHON_PKGNAMEPREFIX}cython3>=0:lang/cython3@${PY_FLAVOR}
+		cmake:devel/cmake-core
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}coverage>=5.3:devel/py-coverage@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}ipython>=0.13:devel/ipython@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}pytest-cov>=3.0.0:devel/py-pytest-cov@${PY_FLAVOR} \
@@ -23,7 +22,7 @@ TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}coverage>=5.3:devel/py-coverage@${PY_FLAVOR
 		${PYTHON_PKGNAMEPREFIX}xdoctest>=1.1.3:devel/py-xdoctest@${PY_FLAVOR}
 
 USES=		python
-USE_PYTHON=	distutils cython autoplist pytest # 7 tests fail, see https://github.com/pyutils/line_profiler/issues/266
+USE_PYTHON=	autoplist cython3 distutils pytest # 7 tests fail, see https://github.com/pyutils/line_profiler/issues/266
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
 
diff --git a/devel/py-lxml5/Makefile b/devel/py-lxml5/Makefile
index 4e1f4d291c11..d910e53d2d32 100644
--- a/devel/py-lxml5/Makefile
+++ b/devel/py-lxml5/Makefile
@@ -14,13 +14,12 @@ WWW=		https://lxml.de/ \
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.11<3.1.0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 
 USES=		cpe gnome python
 USE_GNOME=	libxml2 libxslt
-USE_PYTHON=	autoplist concurrent pep517
+USE_PYTHON=	autoplist concurrent cython3 pep517
 
 CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}lxml ${PYTHON_PKGNAMEPREFIX}lxml5
 
diff --git a/devel/py-propcache/Makefile b/devel/py-propcache/Makefile
index fb89cfe80b2b..fa751e94e0ee 100644
--- a/devel/py-propcache/Makefile
+++ b/devel/py-propcache/Makefile
@@ -12,14 +12,13 @@ WWW=		https://propcache.aio-libs.org/en/latest/ \
 LICENSE=	APACHE20
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.12<3.1.0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}expandvars>=0:devel/py-expandvars@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}expandvars>=0:devel/py-expandvars@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
 		${PY_TOMLI} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 
 USES=		python:3.9+
-USE_PYTHON=	autoplist concurrent pep517
+USE_PYTHON=	autoplist concurrent cython3 pep517
 
 post-install:
 	${FIND} ${STAGEDIR}${PYTHON_SITELIBDIR} -name '*.so' -exec ${STRIP_CMD} {} +
diff --git a/devel/py-pykdtree/Makefile b/devel/py-pykdtree/Makefile
index c022d197a10d..e72d7b52ed05 100644
--- a/devel/py-pykdtree/Makefile
+++ b/devel/py-pykdtree/Makefile
@@ -11,14 +11,13 @@ WWW=		https://github.com/storpipfugl/pykdtree
 LICENSE=	LGPL3
 LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}numpy>=0,1:math/py-numpy@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=0,1:math/py-numpy@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=0,1:math/py-numpy@${PY_FLAVOR}
 
 USES=		python:3.9+
-USE_PYTHON=	autoplist concurrent pep517
+USE_PYTHON=	autoplist concurrent cython3 pep517
 
 post-install:
 	${FIND} ${STAGEDIR}${PYTHON_SITELIBDIR} -name '*.so' -exec ${STRIP_CMD} {} +
diff --git a/devel/py-qutip/Makefile b/devel/py-qutip/Makefile
index 7f8e96349fea..a2ec6c465624 100644
--- a/devel/py-qutip/Makefile
+++ b/devel/py-qutip/Makefile
@@ -17,16 +17,14 @@ PY_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}scipy>=1.9:science/py-scipy@${PY_FLAVOR}
 BUILD_DEPENDS=	${PY_DEPENDS} \
 		${PY_SETUPTOOLS} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0.0:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}pip>0:devel/py-pip@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0.32.0:devel/py-wheel@${PY_FLAVOR}
-RUN_DEPENDS=	${PY_DEPENDS} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0.0:lang/cython3@${PY_FLAVOR}
+RUN_DEPENDS=	${PY_DEPENDS}
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}nose>0:devel/py-nose@${PY_FLAVOR}
 # the optional graphics/py-mayavi dependency is omitted because it is python-2.7 -only
 
 USES=		python
-USE_PYTHON=	pep517 autoplist
+USE_PYTHON=	autoplist cython3 cython3_run pep517
 
 post-install:
 	@${STRIP_CMD} \
diff --git a/graphics/py-imagecodecs/Makefile b/graphics/py-imagecodecs/Makefile
index 169a33254a5f..e844ddf5387d 100644
--- a/graphics/py-imagecodecs/Makefile
+++ b/graphics/py-imagecodecs/Makefile
@@ -11,8 +11,7 @@ WWW=		https://github.com/cgohlke/imagecodecs
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.11:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}numpy>=0,1:math/py-numpy@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=0,1:math/py-numpy@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 LIB_DEPENDS=	libaec.so:science/libaec \
@@ -46,7 +45,7 @@ LIB_DEPENDS=	libaec.so:science/libaec \
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=0,1:math/py-numpy@${PY_FLAVOR}
 
 USES=		jpeg localbase python:3.9+
-USE_PYTHON=	autoplist concurrent pep517
+USE_PYTHON=	autoplist concurrent cython3 pep517
 
 CPPFLAGS+=	-I${LOCALBASE}/include/jxrlib \
 		-I${LOCALBASE}/include/openjpeg-2.5
diff --git a/graphics/py-pandana/Makefile b/graphics/py-pandana/Makefile
index 0ae41739a1e5..5e67af375233 100644
--- a/graphics/py-pandana/Makefile
+++ b/graphics/py-pandana/Makefile
@@ -17,8 +17,7 @@ LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 BROKEN=		requires OpenMP support that is missing on this architecture
 .endif
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}numpy>=1.8,1:math/py-numpy@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=1.8,1:math/py-numpy@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=1.8,1:math/py-numpy@${PY_FLAVOR} \
@@ -28,7 +27,7 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=1.8,1:math/py-numpy@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}tables>=3.1:devel/py-tables@${PY_FLAVOR}
 
 USES=		compiler:c++11-lang python
-USE_PYTHON=	autoplist concurrent pep517
+USE_PYTHON=	autoplist concurrent cython3 pep517
 
 post-install:
 	${FIND} ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR} -name '*.so' -exec ${STRIP_CMD} {} +
diff --git a/graphics/py-pyproj/Makefile b/graphics/py-pyproj/Makefile
index 34a61eafe44f..bca88cf33e6e 100644
--- a/graphics/py-pyproj/Makefile
+++ b/graphics/py-pyproj/Makefile
@@ -13,14 +13,13 @@ LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
 BUILD_DEPENDS=	proj>=9.2.0,1:graphics/proj \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=61.0.0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 LIB_DEPENDS=	libproj.so:graphics/proj
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}certifi>=0:security/py-certifi@${PY_FLAVOR}
 
 USES=		python:3.10+
-USE_PYTHON=	autoplist concurrent pep517
+USE_PYTHON=	autoplist concurrent cython3 pep517
 
 MAKE_ENV=	PROJ_DIR=${LOCALBASE}
 
diff --git a/graphics/py-simplejpeg/Makefile b/graphics/py-simplejpeg/Makefile
index 089d47b6b276..fcb92ac8a82b 100644
--- a/graphics/py-simplejpeg/Makefile
+++ b/graphics/py-simplejpeg/Makefile
@@ -12,12 +12,11 @@ LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
 BUILD_DEPENDS=	${PY_SETUPTOOLS} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
 		${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}
 
 USES=		cmake:indirect python
-USE_PYTHON=	pep517 autoplist pytest
+USE_PYTHON=	autoplist cython3 pep517 pytest
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
 TEST_WRKSRC=	${WRKSRC}/test
diff --git a/graphics/py-vispy/Makefile b/graphics/py-vispy/Makefile
index 4b96f5d51cdc..99227b9a8052 100644
--- a/graphics/py-vispy/Makefile
+++ b/graphics/py-vispy/Makefile
@@ -11,8 +11,7 @@ WWW=		https://vispy.org/
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0:lang/cython3@${PY_FLAVOR} \
-		${PYNUMPY} \
+BUILD_DEPENDS=	${PYNUMPY} \
 		${PY_SETUPTOOLS} \
 		${PYTHON_PKGNAMEPREFIX}setuptools-scm>=7.1:devel/py-setuptools-scm@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}
@@ -23,7 +22,7 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}freetype-py>0:print/py-freetype-py@${PY_FLAV
 		${PYTHON_PKGNAMEPREFIX}packaging>0:devel/py-packaging@${PY_FLAVOR}
 
 USES=		python
-USE_PYTHON=	pep517 autoplist pytest # pytest crashes on some tests, and then keeps restarting
+USE_PYTHON=	autoplist cython3 pep517 pytest # pytest crashes on some tests, and then keeps restarting
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
 
diff --git a/japanese/py-fugashi/Makefile b/japanese/py-fugashi/Makefile
index ea88ac4e735e..4904f83c40b4 100644
--- a/japanese/py-fugashi/Makefile
+++ b/japanese/py-fugashi/Makefile
@@ -12,14 +12,13 @@ LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
 BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools-scm>0:devel/py-setuptools-scm@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}
 LIB_DEPENDS=	libmecab.so:japanese/mecab
 RUN_DEPENDS=	ja-mecab-ipadic>0:japanese/mecab-ipadic
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}ipadic>0:japanese/py-ipadic@${PY_FLAVOR}
 
 USES=		python
-USE_PYTHON=	distutils autoplist pytest # many tests fail, see https://github.com/polm/fugashi/issues/102
+USE_PYTHON=	autoplist cython3 distutils pytest # many tests fail, see https://github.com/polm/fugashi/issues/102
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
 TEST_WRKSRC=	${WRKSRC}/fugashi/tests
diff --git a/lang/py-lupa/Makefile b/lang/py-lupa/Makefile
index 00fb545e8557..d5a2ddccd3d2 100644
--- a/lang/py-lupa/Makefile
+++ b/lang/py-lupa/Makefile
@@ -12,12 +12,11 @@ WWW=		https://github.com/scoder/lupa
 LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>=3.0.11<3.1:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 
 USES=		lua pkgconfig python
-USE_PYTHON=	autoplist concurrent pep517 unittest
+USE_PYTHON=	autoplist concurrent cython3 pep517 unittest
 
 MAKE_ARGS=	--no-bundle --with-cython --with-lua-checks
 TEST_ARGS=	lupa.tests.test
diff --git a/math/py-CyLP/Makefile b/math/py-CyLP/Makefile
index 3991ffa4e668..24e953829189 100644
--- a/math/py-CyLP/Makefile
+++ b/math/py-CyLP/Makefile
@@ -14,8 +14,7 @@ LICENSE_NAME=	Common Public License Version 1.0
 LICENSE_FILE=	${WRKSRC}/LICENSE
 LICENSE_PERMS=	auto-accept dist-mirror dist-sell pkg-mirror pkg-sell
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3 \
-		${PY_SETUPTOOLS} \
+BUILD_DEPENDS=	${PY_SETUPTOOLS} \
 		${PYTHON_PKGNAMEPREFIX}hypothesis>0:devel/py-hypothesis@${PY_FLAVOR} \
 		${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}
@@ -30,7 +29,7 @@ RUN_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}scipy>=0.10.0:science/py-scipy@${PY_FLAVOR}
 
 USES=		compiler:c++11-lang python
-USE_PYTHON=	pep517 cython autoplist pytest
+USE_PYTHON=	autoplist cython3 pep517 pytest
 
 USE_GITHUB=	yes
 GH_ACCOUNT=	coin-or
diff --git a/math/py-PySCIPOpt/Makefile b/math/py-PySCIPOpt/Makefile
index 4af40a48c925..0ca81978ffbe 100644
--- a/math/py-PySCIPOpt/Makefile
+++ b/math/py-PySCIPOpt/Makefile
@@ -12,13 +12,12 @@ WWW=		https://github.com/SCIP-Interfaces/PySCIPOpt
 
 LICENSE=	MIT
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3
 LIB_DEPENDS=	libscip.so:math/SCIP
 RUN_DEPENDS=	${PYNUMPY}
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}networkx>0:math/py-networkx@${PY_FLAVOR}
 
 USES=		localbase python
-USE_PYTHON=	distutils autoplist pytest # 1 test fails, see https://github.com/scipopt/PySCIPOpt/issues/840
+USE_PYTHON=	autoplist cython3 distutils pytest # 1 test fails, see https://github.com/scipopt/PySCIPOpt/issues/840
 
 USE_GITHUB=	yes
 GH_ACCOUNT=	scipopt
diff --git a/math/py-cypari2/Makefile b/math/py-cypari2/Makefile
index 215c1fdc9623..715f0408b805 100644
--- a/math/py-cypari2/Makefile
+++ b/math/py-cypari2/Makefile
@@ -10,8 +10,7 @@ WWW=		https://github.com/sagemath/cypari2
 
 LICENSE=	GPLv2
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR}	\
-		${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}	\
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}	\
 		${PYTHON_PKGNAMEPREFIX}cysignals>0:devel/py-cysignals@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR}
 LIB_DEPENDS=	libgmp.so:math/gmp	\
@@ -24,7 +23,7 @@ TEST_DEPENDS=	py.test:devel/py-pytest@${PY_FLAVOR}	\
 #GH_ACCOUNT=	sagemath
 
 USES=		compiler:c11 python
-USE_PYTHON=	pep517
+USE_PYTHON=	cython3 pep517
 
 .if !defined(WITH_DEBUG)
 LDFLAGS+=	-s
diff --git a/math/py-fpylll/Makefile b/math/py-fpylll/Makefile
index f028cd56e63a..70cec1723019 100644
--- a/math/py-fpylll/Makefile
+++ b/math/py-fpylll/Makefile
@@ -11,7 +11,6 @@ WWW=		https://github.com/fplll/fpylll
 LICENSE=	GPLv2
 
 BUILD_DEPENDS=	${PYNUMPY}	\
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR}	\
 		${PYTHON_PKGNAMEPREFIX}black>0:devel/py-black@${PY_FLAVOR}	\
 		${PYTHON_PKGNAMEPREFIX}pythran>0:devel/py-pythran@${PY_FLAVOR}	\
 		${PYTHON_PKGNAMEPREFIX}cysignals>0:devel/py-cysignals@${PY_FLAVOR} \
@@ -31,7 +30,7 @@ USE_GITHUB=	yes
 GH_ACCOUNT=	fplll
 
 USES=		compiler:c++11-lang python
-USE_PYTHON=	distutils
+USE_PYTHON=	cython3 distutils
 .if !defined(WITH_DEBUG)
 LDFLAGS+=	-s
 .endif
diff --git a/math/py-linearmodels/Makefile b/math/py-linearmodels/Makefile
index abaf49b62e8d..1716a6ea6872 100644
--- a/math/py-linearmodels/Makefile
+++ b/math/py-linearmodels/Makefile
@@ -20,8 +20,7 @@ PY_DEPENDS=	${PYTHON_PKGNAMEPREFIX}formulaic>=1.0.0:math/py-formulaic@${PY_FLAVO
 		${PYTHON_PKGNAMEPREFIX}pyhdfe>=0.1:math/py-pyhdfe@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}scipy>=1.8.0:science/py-scipy@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}statsmodels>=0.13.0:math/py-statsmodels@${PY_FLAVOR}
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}setuptools-scm>0:devel/py-setuptools-scm@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools-scm>0:devel/py-setuptools-scm@${PY_FLAVOR} \
 		${PY_DEPENDS}
 RUN_DEPENDS=	${PY_DEPENDS}
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}black>0:devel/py-black@${PY_FLAVOR} \
@@ -35,7 +34,7 @@ TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}black>0:devel/py-black@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}xarray>=0.13:devel/py-xarray@${PY_FLAVOR}
 
 USES=		python shebangfix
-USE_PYTHON=	distutils autoplist pytest # 14 tests fail, see https://github.com/bashtage/linearmodels/issues/550
+USE_PYTHON=	autoplist cython3 distutils pytest # 14 tests fail, see https://github.com/bashtage/linearmodels/issues/550
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
 
diff --git a/math/py-pandas/Makefile b/math/py-pandas/Makefile
index 30ee348a02f0..956fd1610b28 100644
--- a/math/py-pandas/Makefile
+++ b/math/py-pandas/Makefile
@@ -14,8 +14,7 @@ WWW=		https://pandas.pydata.org \
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3 \
-		meson>=1.2.1:devel/meson@${PY_FLAVOR} \
+BUILD_DEPENDS=	meson>=1.2.1:devel/meson@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}meson-python>=0.13.1:devel/meson-python@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}numpy>=1.26.0,1<2,1:math/py-numpy@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}versioneer>=0:devel/py-versioneer@${PY_FLAVOR} \
@@ -28,7 +27,7 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}numpy>=1.26.0,1<2,1:math/py-numpy@${PY_FLAVO
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}arrow>=0:devel/py-arrow@${PY_FLAVOR}
 
 USES=		cpe python
-USE_PYTHON=	autoplist concurrent pep517 pytest
+USE_PYTHON=	autoplist concurrent cython3 pep517 pytest
 
 CPE_VENDOR=	numfocus
 
diff --git a/math/py-petsc4py/Makefile b/math/py-petsc4py/Makefile
index 781cec7f9313..4a36a7f2d0b9 100644
--- a/math/py-petsc4py/Makefile
+++ b/math/py-petsc4py/Makefile
@@ -13,13 +13,12 @@ LICENSE_FILE=	${WRKSRC}/LICENSE.rst
 
 BROKEN_armv7=	compilation fails: LLVM ERROR: out of memory
 
-BUILD_DEPENDS=	${PYNUMPY} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3
+BUILD_DEPENDS=	${PYNUMPY}
 LIB_DEPENDS=	libpetsc.so:science/PETSc
 RUN_DEPENDS=	${PYNUMPY}
 
 USES=		python
-USE_PYTHON=	distutils autoplist pytest # tests fail to run, see https://gitlab.com/petsc/petsc/-/issues/1301
+USE_PYTHON=	autoplist cython3 distutils pytest # tests fail to run, see https://gitlab.com/petsc/petsc/-/issues/1301
 
 MAKE_ENV=	PETSC_DIR=${LOCALBASE}
 
diff --git a/math/py-primme/Makefile b/math/py-primme/Makefile
index a76aeef52a04..15011d35bb3a 100644
--- a/math/py-primme/Makefile
+++ b/math/py-primme/Makefile
@@ -15,7 +15,6 @@ LICENSE=	BSD3CLAUSE
 BUILD_DEPENDS=	${PY_SETUPTOOLS} \
 		${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}scipy>0:science/py-scipy@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 LIB_DEPENDS=	libprimme.so:math/primme \
 		libblas.so:math/blas \
@@ -26,7 +25,7 @@ RUN_DEPENDS=	${PYNUMPY} \
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}nose>=0:devel/py-nose@${PY_FLAVOR}
 
 USES=		fortran gmake localbase:ldflags python shebangfix
-USE_PYTHON=	pep517 autoplist
+USE_PYTHON=	autoplist cython3 pep517
 
 TEST_TARGET=	test
 
diff --git a/math/py-pyFFTW/Makefile b/math/py-pyFFTW/Makefile
index eef5569bc99b..ac704b19d9be 100644
--- a/math/py-pyFFTW/Makefile
+++ b/math/py-pyFFTW/Makefile
@@ -17,14 +17,13 @@ LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 PY_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}dask>=1.0.0:devel/py-dask@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}scipy>=1.2.0:science/py-scipy@${PY_FLAVOR}
-BUILD_DEPENDS=	${PY_DEPENDS} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR}
+BUILD_DEPENDS=	${PY_DEPENDS}
 LIB_DEPENDS=	libfftw3.so:math/fftw3 \
 		libfftw3f.so:math/fftw3-float
 RUN_DEPENDS=	${PY_DEPENDS}
 
 USES=		python localbase:ldflags
-USE_PYTHON=	distutils cython autoplist pytest # tests fail with "attempted relative import with no known parent package", see https://github.com/pyFFTW/pyFFTW/issues/405
+USE_PYTHON=	autoplist cython3 distutils pytest # tests fail with "attempted relative import with no known parent package", see https://github.com/pyFFTW/pyFFTW/issues/405
 
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
 TEST_WRKSRC=	${WRKSRC}/tests
diff --git a/math/py-pywavelets/Makefile b/math/py-pywavelets/Makefile
index 833b1c858022..5269db1a1593 100644
--- a/math/py-pywavelets/Makefile
+++ b/math/py-pywavelets/Makefile
@@ -12,12 +12,11 @@ LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
 BUILD_DEPENDS=	${PYNUMPY} \
-		${PYTHON_PKGNAMEPREFIX}meson-python>=0.16:devel/meson-python@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}cython3>=3.0.4:lang/cython3@${PY_FLAVOR}
+		${PYTHON_PKGNAMEPREFIX}meson-python>=0.16:devel/meson-python@${PY_FLAVOR}
 RUN_DEPENDS=	${PYNUMPY}
 
 USES=		python:3.10+ shebangfix
-USE_PYTHON=	autoplist pep517
+USE_PYTHON=	autoplist cython3 pep517
 
 SHEBANG_FILES=	pywt/data/create_dat.py
 
diff --git a/math/py-slepc4py/Makefile b/math/py-slepc4py/Makefile
index a62a59e456fc..d16bab567fbb 100644
--- a/math/py-slepc4py/Makefile
+++ b/math/py-slepc4py/Makefile
@@ -14,8 +14,7 @@ LICENSE_FILE=	${WRKSRC}/LICENSE.rst
 
 PY_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}petsc4py>0:math/py-petsc4py@${PY_FLAVOR}
-BUILD_DEPENDS=	${PY_DEPENDS} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3
+BUILD_DEPENDS=	${PY_DEPENDS}
 RUN_DEPENDS=	${PY_DEPENDS}
 LIB_DEPENDS=	libmpich.so:net/mpich \
 		libpetsc.so:science/PETSc \
@@ -23,7 +22,7 @@ LIB_DEPENDS=	libmpich.so:net/mpich \
 RUN_DEPENDS=	${PYNUMPY}
 
 USES=		fortran python
-USE_PYTHON=	distutils autoplist pytest
+USE_PYTHON=	autoplist cython3 distutils pytest
 
 MAKE_ENV=	PETSC_DIR=${LOCALBASE} SLEPC_DIR=${LOCALBASE}
 TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
diff --git a/math/py-yt/Makefile b/math/py-yt/Makefile
index 0fb3aca51a9c..bcd16ad88170 100644
--- a/math/py-yt/Makefile
+++ b/math/py-yt/Makefile
@@ -15,9 +15,7 @@ LICENSE_FILE=	${WRKSRC}/COPYING.txt
 # dependencies are in setup.cfg
 BUILD_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}ewah-bool-utils>=1.0.2:devel/py-ewah-bool-utils@${PY_FLAVOR}
-BUILD_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3
-RUN_DEPENDS=	\
-		${PYNUMPY} \
+RUN_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}cmyt>=0.2.2:math/py-cmyt@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}ewah-bool-utils>=1.0.2:devel/py-ewah-bool-utils@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}ipywidgets>0:devel/py-ipywidgets@${PY_FLAVOR} \
@@ -35,7 +33,7 @@ RUN_DEPENDS=	\
 		${PYTHON_PKGNAMEPREFIX}unyt>=2.8.0:math/py-unyt@${PY_FLAVOR}
 
 USES=		dos2unix localbase python
-USE_PYTHON=	distutils autoplist concurrent # cython, but cython3 isn't yet available
+USE_PYTHON=	autoplist concurrent cython3 distutils
 
 post-patch:
 	@${REINPLACE_CMD} -e "s|check_for_pyembree() is not None|False|" \
diff --git a/net/py-mpi4py/Makefile b/net/py-mpi4py/Makefile
index f970a596ffdc..573f93fde519 100644
--- a/net/py-mpi4py/Makefile
+++ b/net/py-mpi4py/Makefile
@@ -12,10 +12,8 @@ WWW=		https://github.com/mpi4py/mpi4py
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE.rst
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>3.0.0:lang/cython3@${PY_FLAVOR}
-
 USES=		pkgconfig python
-USE_PYTHON=	autoplist concurrent distutils
+USE_PYTHON=	autoplist concurrent cython3 distutils
 
 MP?=			OPENMPI
 .if ${MP} == "OPENMPI"
diff --git a/net/py-zeroconf/Makefile b/net/py-zeroconf/Makefile
index 0744ec068d2a..f0b47849bf8b 100644
--- a/net/py-zeroconf/Makefile
+++ b/net/py-zeroconf/Makefile
@@ -11,8 +11,7 @@ LICENSE=	LGPL21+
 LICENSE_FILE=	${WRKSRC}/COPYING
 
 
-BUILD_DEPENDS=	lang/cython3>=3.0.8:lang/cython3 \
-		${PYTHON_PKGNAMEPREFIX}poetry-core>=1.5.2:devel/py-poetry-core@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}poetry-core>=1.5.2:devel/py-poetry-core@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}setuptools>=63.1.0:devel/py-setuptools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0.40.0:devel/py-wheel@${PY_FLAVOR}
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}async_timeout>=3.0.1:devel/py-async_timeout@${PY_FLAVOR} \
@@ -22,7 +21,7 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}async_timeout>=3.0.1:devel/py-async_timeout@
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pytest-asyncio>=0.20.3:devel/py-pytest-asyncio@${PY_FLAVOR}
 
 USES=		cpe python
-USE_PYTHON=	autoplist concurrent pep517 pytest
+USE_PYTHON=	autoplist concurrent cython3 pep517 pytest
 USE_GITHUB=	yes
 GH_ACCOUNT=	python-zeroconf
 GH_PROJECT=	python-zeroconf
diff --git a/science/py-dimod/Makefile b/science/py-dimod/Makefile
index e6ff83ed6836..be947d42048c 100644
--- a/science/py-dimod/Makefile
+++ b/science/py-dimod/Makefile
@@ -10,14 +10,13 @@ WWW=		https://github.com/dwavesystems/dimod
 LICENSE=	APACHE20
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	${PYNUMPY} \
-		${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR}
+BUILD_DEPENDS=	${PYNUMPY}
 RUN_DEPENDS=	${PYNUMPY}
 TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}parameterized>0:devel/py-parameterized@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}mypy>0:devel/py-mypy@${PY_FLAVOR}
 
 USES=		compiler:c++11-lang python
-USE_PYTHON=	distutils autoplist unittest
+USE_PYTHON=	autoplist cython3 distutils unittest
 
 USE_GITHUB=	yes
 GH_ACCOUNT=	dwavesystems
diff --git a/science/py-dipy/Makefile b/science/py-dipy/Makefile
index 39b110e8e9e9..a8cbaa735a49 100644
--- a/science/py-dipy/Makefile
+++ b/science/py-dipy/Makefile
@@ -11,8 +11,7 @@ WWW=		https://dipy.org/
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}meson-python>0:devel/meson-python@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}meson-python>0:devel/meson-python@${PY_FLAVOR} \
 		${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}h5py>=3.1.0:science/py-h5py@${PY_FLAVOR} \
@@ -31,7 +30,7 @@ TEST_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}fury>0:graphics/py-fury@${PY_FLAVOR} \
 TEST_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}cvxpy>0:math/py-cvxpy@${PY_FLAVOR} # "doc" extra dependencies, see dipy/info.py
 
 USES=		python shebangfix
-USE_PYTHON=	pep517 concurrent pytest # autoplist is broken: it produces incorrect entries and unnecessary files are also placed under doc/
+USE_PYTHON=	concurrent cython3 pep517 pytest # autoplist is broken: it produces incorrect entries and unnecessary files are also placed under doc/
 
 SHEBANG_GLOB=	*.sh *.py
 
diff --git a/science/py-dwave-optimization/Makefile b/science/py-dwave-optimization/Makefile
index 67ae159ccff6..3b289fc324a8 100644
--- a/science/py-dwave-optimization/Makefile
+++ b/science/py-dwave-optimization/Makefile
@@ -11,15 +11,14 @@ WWW=		https://github.com/dwavesystems/dwave-optimization
 LICENSE=	APACHE20
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}cython3>0:lang/cython3@${PY_FLAVOR} \
-		${PYNUMPY} \
+BUILD_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}setuptools-dso>=2.10:devel/py-setuptools-dso@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR}
 RUN_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}reno>=4.1.0:textproc/py-reno@${PY_FLAVOR}
 
 USES=		python
-USE_PYTHON=	pep517 cython autoplist
+USE_PYTHON=	autoplist cython3 pep517
 
 POST_PLIST=	fix-plist
 
diff --git a/science/py-dwave-preprocessing/Makefile b/science/py-dwave-preprocessing/Makefile
index 072c327aa768..4f73fe34f2b9 100644
--- a/science/py-dwave-preprocessing/Makefile
+++ b/science/py-dwave-preprocessing/Makefile
@@ -11,13 +11,12 @@ WWW=		https://github.com/dwavesystems/dwave-preprocessing
*** 119 LINES SKIPPED ***