如何使用python distutils将扩展模块交叉编译到不同的架构?

时间:2017-08-03 09:04:26

标签: python cross-compiling cython distutils setup.py

我正在使用Cython为我拥有的几个python模块生成已编译的.so文件。作为outlined in the Cython documentation,您可以按如下方式创建setup.py文件:

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

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

然后使用命令python3 setup.py build_ext --inplace构建模块。

这样可以正常工作,但它会创建与主机架构相匹配的二进制文件(在我的情况下为x86_64)。我想针对一个不同的架构(armv7l),它的交叉编译和我已经拥有的环境。是否有可能使用python distutils?

1 个答案:

答案 0 :(得分:1)

通过扩展程序上的march传递替代extra_compile_args及相关标记:

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>])

需要armv7l的工作构建工具链。

基于armv7l的linux的Docker容器可能更容易使用,并且会自动构建arm。

正如可以在脚本中运行docker容器构建并为所需的所有体系结构和操作系统生成本机包。