I have a python package with the following setup.py:
from setuptools import setup, Extension from setuptools.command.build_ext import build_ext class CMakeExtension(Extension): # ... class CMakeBuild(build_ext): # ... extensions = [ CMakeExtension("cmake_extension", "path-to-sources"), Extension("cython_extension", ["file.pyx"]), ] setup( # ... ext_modules=extensions, # ... )
I would like to know if I can call python setup.py build_ext --inplace
and build each extension with the appropriate builder.
I am aware of the cmdclass
setup function argument but did not find a way to specify that build_ext
should be used for the cython extensions and CMakeBuild
for the cmake ones.
Note that each extension is building fine with the correct builder class (and the cmdclass
argument).
Thanks!
Advertisement
Answer
The workaround I found:
from setuptools import setup, Extension from setuptools.command.build_ext import build_ext class CMakeExtension(Extension): # ... class CMakeBuild(build_ext): # ... if sys.argv[1] == "build_ext": c_ext = [Extension(...)] elif sys.argv[1] == "build_cmk": c_ext = [CMakeExtension(...)] else: raise NotImplementedError setup( # ... ext_modules=cythonize(c_ext), cmdclass={"build_ext": build_ext, "build_cmk": CMakeBuild}, # ... )
And then run:
python setup.py build_ext --inplace python setup.py build_cmk --inplace