Amr Bekhit
Amr Bekhit

Reputation: 4813

How can I use python distutils to cross compile an extension module to a different architecture?

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?

Upvotes: 0

Views: 2679

Answers (1)

danny
danny

Reputation: 5270

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.

Upvotes: 1

Related Questions