66# - https://peps.python.org/pep-0517/
77# - https://setuptools.pypa.io/en/latest/build_meta.html#dynamic-build-dependencies-and-other-build-meta-tweaks
88# Specifically, there are 5 APIs required to create a proper build backend, see below.
9- #
10- # TODO: also implement PEP-660 API hooks
119
1210import ctypes
1311import functools
2119from setuptools import Extension
2220from setuptools import build_meta as _build_meta
2321
22+ prepare_metadata_for_build_editable = _build_meta .prepare_metadata_for_build_editable
2423prepare_metadata_for_build_wheel = _build_meta .prepare_metadata_for_build_wheel
2524build_sdist = _build_meta .build_sdist
2625get_requires_for_build_sdist = _build_meta .get_requires_for_build_sdist
@@ -165,10 +164,13 @@ def _get_proper_cuda_bindings_major_version() -> str:
165164_extensions = None
166165
167166
168- def build_wheel ( wheel_directory , config_settings = None , metadata_directory = None ):
169- # Customizing this hook is needed because we must defer cythonization until cuda-bindings,
167+ def _build_cuda_core ( ):
168+ # Customizing the build hooks is needed because we must defer cythonization until cuda-bindings,
170169 # now a required build-time dependency that's dynamically installed via the other hook below,
171170 # is installed. Otherwise, cimport any cuda.bindings modules would fail!
171+ #
172+ # This function populates "_extensions".
173+ global _extensions
172174
173175 # It seems setuptools' wildcard support has problems for namespace packages,
174176 # so we explicitly spell out all Extension instances.
@@ -193,21 +195,36 @@ def strip_prefix_suffix(filename):
193195
194196 nthreads = int (os .environ .get ("CUDA_PYTHON_PARALLEL_LEVEL" , os .cpu_count () // 2 ))
195197 compile_time_env = {"CUDA_CORE_BUILD_MAJOR" : _get_proper_cuda_bindings_major_version ()}
196-
197- global _extensions
198198 _extensions = cythonize (
199199 ext_modules ,
200200 verbose = True ,
201201 language_level = 3 ,
202202 nthreads = nthreads ,
203- compiler_directives = {"embedsignature" : True , "warn.deprecated.IF" : False },
203+ compiler_directives = {"embedsignature" : True , "warn.deprecated.IF" : False , "freethreading_compatible" : True },
204204 compile_time_env = compile_time_env ,
205205 )
206206
207+ return
208+
209+
210+ def build_editable (wheel_directory , config_settings = None , metadata_directory = None ):
211+ _build_cuda_core ()
212+ return _build_meta .build_editable (wheel_directory , config_settings , metadata_directory )
213+
214+
215+ def build_wheel (wheel_directory , config_settings = None , metadata_directory = None ):
216+ _build_cuda_core ()
207217 return _build_meta .build_wheel (wheel_directory , config_settings , metadata_directory )
208218
209219
210- def get_requires_for_build_wheel ( config_settings = None ):
220+ def _get_cuda_bindings_require ( ):
211221 cuda_major = _get_proper_cuda_bindings_major_version ()
212- cuda_bindings_require = [f"cuda-bindings=={ cuda_major } .*" ]
213- return _build_meta .get_requires_for_build_wheel (config_settings ) + cuda_bindings_require
222+ return [f"cuda-bindings=={ cuda_major } .*" ]
223+
224+
225+ def get_requires_for_build_editable (config_settings = None ):
226+ return _build_meta .get_requires_for_build_editable (config_settings ) + _get_cuda_bindings_require ()
227+
228+
229+ def get_requires_for_build_wheel (config_settings = None ):
230+ return _build_meta .get_requires_for_build_wheel (config_settings ) + _get_cuda_bindings_require ()
0 commit comments