使用cython交叉编译项目从intel ubuntu到arm
Using cython to cross compile project from intel ubuntu to arm
我的 ubuntu 16 x86_64 上有简单的 python + cython 项目(来自 http://docs.cython.org/src/tutorial/cython_tutorial.html 的 hello world 示例)。我可以用 cython 为 x86_64.
构建这个项目
如何在不使用真正的 armv7 board/cpu 的情况下为 ubuntu 15 的 armv7 版本构建项目?
我有arm-linux-gnueabihf-gcc
(http://packages.ubuntu.com/xenial/devel/gcc-arm-linux-gnueabihf),可以为armv7编译简单的C程序。如何更改 cython 的设置以使用交叉编译器为 arm 构建共享对象?
交叉编译需要架构依赖库和头文件。
测试python3.5-dev包等是否可以在dpkg --add-architecture armhf
和apt-get update
后安装(对sources.list进行一些修改后),结果是基本上。
python3.5-dev:armhf : Depends: python3.5:armhf (= 3.5.1-10) but it is not going to be installed
apt-get install python3.5:armhf
是行不通的,see
The existing proposals allow for the co-installation of libraries and
headers for different architectures, but not (yet) binaries.
QEMU 和 chroot 提供了一种不需要 "full" 虚拟机的可能解决方案。可以通过 debootstrap
命令为 chroot 创建一个合适的目录。创建后,schroot
可以访问该环境。
在以下命令中替换 <DIRECTORY>
和 <USER>
:
apt-get install -y debootstrap qemu-user-static binfmt-support schroot
debootstrap --arch=armhf --foreign --include=gcc,g++,python3.5-dev xenial <DIRECTORY>
cp /usr/bin/qemu-arm-static <DIRECTORY>/usr/bin
chroot <DIRECTORY>
/debootstrap/debootstrap --second-stage
echo "deb http://ports.ubuntu.com/ubuntu-ports xenial universe" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ubuntu-ports xenial multiverse" >> /etc/apt/sources.list
apt-get update
apt-get install -y cython cython3
exit
cat <<END > /etc/schroot/chroot.d/xenial-armhf
[xenial-armhf]
description=Ubuntu xenial armhf
type=directory
directory=/home/xenial-armhf
groups=sbuild,root
root-groups=sbuild,root
users=root,<USER>
END
应该可以访问该环境
schroot -c chroot:xenial-armhf
对于 root 用户会话(用户必须在 root-groups 中列出的组中),
schroot -c chroot:xenial-armhf -u root
此后还可以交叉编译一个cython模块:
hello.pyx:
print("hello world")
编译(python3.5-config --cflags
和 python3.5-config --libs
在 chroot 中的选项,注意 -fPIC
):
cython hello.pyx
arm-linux-gnueabihf-gcc --sysroot <DIRECTORY> -I/usr/include/python3.5m -I/usr/include/python3.5m -Wno-unused-result -Wsign-compare -g -fstack-protector-strong -Wformat -Werror=format-security -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -c hello.c
arm-linux-gnueabihf-gcc --shared --sysroot <DIRECTORY> -lpython3.5m -lpthread -ldl -lutil -lm hello.o -o hello.so
然后可以测试模块
schroot -c chroot:xenial-armhf
python3
import hello
交叉编译基于 cython 的 python 模块也可以。随着 setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import os
os.environ['CC'] = 'arm-linux-gnueabihf-gcc'
os.environ['LDSHARED'] = 'arm-linux-gnueabihf-gcc -shared'
sysroot_args=['--sysroot', '/path/to/xenial-armhf']
setup(cmdclass = {'build_ext': build_ext},
ext_modules= [ Extension("hello", ["hello.pyx"],
extra_compile_args=sysroot_args,
extra_link_args=sysroot_args) ])
通过这种方式可以构建一个简单的 hello world
模块。模块的文件名错误,在本例中为 hello.cpython-35m-x86_64-linux-gnu.so
。将其重命名为 hello.so
后就可以导入了。
我的 ubuntu 16 x86_64 上有简单的 python + cython 项目(来自 http://docs.cython.org/src/tutorial/cython_tutorial.html 的 hello world 示例)。我可以用 cython 为 x86_64.
构建这个项目如何在不使用真正的 armv7 board/cpu 的情况下为 ubuntu 15 的 armv7 版本构建项目?
我有arm-linux-gnueabihf-gcc
(http://packages.ubuntu.com/xenial/devel/gcc-arm-linux-gnueabihf),可以为armv7编译简单的C程序。如何更改 cython 的设置以使用交叉编译器为 arm 构建共享对象?
交叉编译需要架构依赖库和头文件。
测试python3.5-dev包等是否可以在dpkg --add-architecture armhf
和apt-get update
后安装(对sources.list进行一些修改后),结果是基本上。
python3.5-dev:armhf : Depends: python3.5:armhf (= 3.5.1-10) but it is not going to be installed
apt-get install python3.5:armhf
是行不通的,see
The existing proposals allow for the co-installation of libraries and headers for different architectures, but not (yet) binaries.
QEMU 和 chroot 提供了一种不需要 "full" 虚拟机的可能解决方案。可以通过 debootstrap
命令为 chroot 创建一个合适的目录。创建后,schroot
可以访问该环境。
在以下命令中替换 <DIRECTORY>
和 <USER>
:
apt-get install -y debootstrap qemu-user-static binfmt-support schroot
debootstrap --arch=armhf --foreign --include=gcc,g++,python3.5-dev xenial <DIRECTORY>
cp /usr/bin/qemu-arm-static <DIRECTORY>/usr/bin
chroot <DIRECTORY>
/debootstrap/debootstrap --second-stage
echo "deb http://ports.ubuntu.com/ubuntu-ports xenial universe" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ubuntu-ports xenial multiverse" >> /etc/apt/sources.list
apt-get update
apt-get install -y cython cython3
exit
cat <<END > /etc/schroot/chroot.d/xenial-armhf
[xenial-armhf]
description=Ubuntu xenial armhf
type=directory
directory=/home/xenial-armhf
groups=sbuild,root
root-groups=sbuild,root
users=root,<USER>
END
应该可以访问该环境
schroot -c chroot:xenial-armhf
对于 root 用户会话(用户必须在 root-groups 中列出的组中),
schroot -c chroot:xenial-armhf -u root
此后还可以交叉编译一个cython模块:
hello.pyx:
print("hello world")
编译(python3.5-config --cflags
和 python3.5-config --libs
在 chroot 中的选项,注意 -fPIC
):
cython hello.pyx
arm-linux-gnueabihf-gcc --sysroot <DIRECTORY> -I/usr/include/python3.5m -I/usr/include/python3.5m -Wno-unused-result -Wsign-compare -g -fstack-protector-strong -Wformat -Werror=format-security -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -c hello.c
arm-linux-gnueabihf-gcc --shared --sysroot <DIRECTORY> -lpython3.5m -lpthread -ldl -lutil -lm hello.o -o hello.so
然后可以测试模块
schroot -c chroot:xenial-armhf
python3
import hello
交叉编译基于 cython 的 python 模块也可以。随着 setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import os
os.environ['CC'] = 'arm-linux-gnueabihf-gcc'
os.environ['LDSHARED'] = 'arm-linux-gnueabihf-gcc -shared'
sysroot_args=['--sysroot', '/path/to/xenial-armhf']
setup(cmdclass = {'build_ext': build_ext},
ext_modules= [ Extension("hello", ["hello.pyx"],
extra_compile_args=sysroot_args,
extra_link_args=sysroot_args) ])
通过这种方式可以构建一个简单的 hello world
模块。模块的文件名错误,在本例中为 hello.cpython-35m-x86_64-linux-gnu.so
。将其重命名为 hello.so
后就可以导入了。