How can I use python distutils to cross compile an

2019-09-15 03:34发布

问题:

I'm using Cython to generate compiled .so files for a couple of python modules I have. As outlined in the Cython documentation, you can create a setup.py file as follows:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize([
        'MyModule1.py',
        'MyModule2.py',
        'MyModule3.py'
    ])
)

and then build the modules using the command python3 setup.py build_ext --inplace.

This works fine, however it creates binaries that match the architecture of the host machine (in my case x86_64). I would like to target a different architecture (armv7l) whose cross compile and environment I already have. Is it possible to do so with python distutils?

回答1:

Pass in an alternative march and related flags via extra_compile_args on the extension:

sources = ['MyModule1.py',
           'MyModule2.py',
           'MyModule3.py']

ext_modules=cythonize(sources,
                      extra_compile_args=['-march=armv7l'],
                      library_dirs=[<arm v7 libraries>],
                      include_path=[<arm v7 includes>])

Requires working build tool chain for armv7l.

Docker container for an armv7l based linux would probably be easier to use, though, and would automate the arm build.

As in can run the docker container build in a script and generate native packages for all architectures and OS that you want.