交叉编译Python-3.6.0到aarch64/aarch32 —— 支持sqlite3
参考
https://datko.net/2013/05/10/cross-compiling-python-3-3-1-for-beaglebone-arm-angstrom/
平台
主机: ubuntu14.04 64bit
开发板: qemu + aarch64 (参考: http://www.cnblogs.com/pengdonglin137/p/6442583.html)
工具链:
aarch64-linux-gnu-gcc (gcc version 4.9.1 20140529) 用于编译aarch64上面运行的程序
arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320) 用于编译aarch32上面运行的程序
Python版本: Python-3.6.0
概述
前面几篇博文介绍了Python2.7.13的交叉编译,在编译前需要给Python源码打上用于交叉编译的patch,从Python-3.3.1开始,就不需要再打什么patch了,只需要在configure的时候指定--build和--host参数即可。
下面我们以aarch64和aarch32为例说明。
正文
一、编译PC上面用的Python
因为在交叉编译的时候需要在PC上面运行对应版本的Python程序,所以我们需要先编译和安装PC上面用的Python,下面是命令:
- #!/bin/bash
- ../Python-3.6./configure
- make -j8
- sudo make install
默认,Python3.6.0会被安装到/usr/local下面。
二、交叉编译
1、配置 mk1_conf.sh
aarch32
- #!/bin/bash
- export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH
- ../Python-3.6./configure \
- --host=arm-none-linux-gnueabi \
- --build=armv7 \
- --prefix=`pwd` \
- --enable-ipv6 \
- --enable-shared \
- ac_cv_file__dev_ptmx="yes" \
- ac_cv_file__dev_ptc="no" \
- LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/lib" \
- CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include"
其中--build表示编译出来的程序运行的CPU架构,--host是交叉编译工具链。这里我已经吧sqlite3的lib和include添加上了,所以生成的python3是支持sqlite3的。
aarch64
- #!/bin/bash
- export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-.07_linux/bin:$PATH
- ../Python-3.6./configure \
- --host=aarch64-linux-gnu \
- --build=aarch64 \
- --prefix=`pwd` \
- --enable-ipv6 \
- --enable-shared \
- ac_cv_file__dev_ptmx="yes" \
- ac_cv_file__dev_ptc="no" \
- LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib" \
- CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include"
只需要替换运行的CPU架构为aarch64,然后设置对应的工具链即可,别忘了还有sqlite3的相关路径的修改。
2、编译和安装 mk2_make.sh
这里没有什么好说的,下面是脚本内容:
aarch32
- #!/bin/bash
- export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH
- make -j4
- make install
- aarch64
- #!/bin/bash
- export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-.07_linux/bin:$PATH
- make -j4
- make install
3、制作ramdisk
为了便于在python2和python3之间的切换,适当修改mk_ramdisk.sh如下:
aarch32
- #!/bin/bash
- sudo rm -rf rootfs
- sudo rm -rf tmpfs
- sudo rm -rf ramdisk*
- sudo mkdir rootfs
- sudo cp ../busybox-1.24./_install/* rootfs/ -raf
- sudo mkdir -p rootfs/proc/
- sudo mkdir -p rootfs/sys/
- sudo mkdir -p rootfs/tmp/
- sudo mkdir -p rootfs/root/
- sudo mkdir -p rootfs/var/
- sudo mkdir -p rootfs/mnt/
- sudo cp etc rootfs/ -arf
- sudo cp -arf ../arm-2014.05/arm-none-linux-gnueabi/libc/lib rootfs/
- ver=3
- sudo mkdir -p rootfs/usr
- pushd rootfs/usr
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/lib .
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/include .
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/bin .
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/share .
- sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip lib/python*
- popd
- #sqlite
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/bin/* rootfs/bin/
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include/* rootfs/include/
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/lib/* rootfs/lib/
- sudo strip rootfs/bin/sqlite3
- sudo mkdir -p rootfs/dev/
- sudo mknod rootfs/dev/tty1 c 4 1
- sudo mknod rootfs/dev/tty2 c 4 2
- sudo mknod rootfs/dev/tty3 c 4 3
- sudo mknod rootfs/dev/tty4 c 4 4
- sudo mknod rootfs/dev/console c 5 1
- sudo mknod rootfs/dev/null c 1 3
- sudo rm -rf rootfs/lib/*.a
- sudo rm -rf rootfs/lib/*.la
- sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip rootfs/lib/*
- sudo mkdir -p rootfs/tools
- sudo cp ./other_tools/* rootfs/tools
- sudo mkdir -p rootfs/lib/modules/4\.10\.0\+
- sudo dd if=/dev/zero of=ramdisk bs=1M count=150
- sudo mkfs.ext4 -F ramdisk
- sudo mkdir -p tmpfs
- sudo mount -t ext4 ramdisk ./tmpfs/ -o loop
- sudo cp -raf rootfs/* tmpfs/
- sudo umount tmpfs
- sudo gzip --best -c ramdisk > ramdisk.gz
- sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
如果提示空间不足的话,可以将dd命令的count参数扩大,同时不要忘了将kernel配置里的ramdisk的大小也扩大:
- Device Drivers --->
- [*] Block devices --->
- () Default RAM disk size (kbytes)
这里将ramdisk的大小修改为了150MB,然后重新编译kernel
aarch64
- #!/bin/bash
- sudo rm -rf rootfs
- sudo rm -rf tmpfs
- sudo rm -rf ramdisk*
- sudo mkdir rootfs
- sudo cp ../busybox-1.24./_install/* rootfs/ -raf
- sudo mkdir -p rootfs/proc/
- sudo mkdir -p rootfs/sys/
- sudo mkdir -p rootfs/tmp/
- sudo mkdir -p rootfs/root/
- sudo mkdir -p rootfs/var/
- sudo mkdir -p rootfs/mnt/
- sudo cp etc rootfs/ -arf
- sudo mkdir -p rootfs/lib
- sudo cp -arf ../gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/aarch64-linux-gnu/libc/lib/aarch64-linux-gnu/* rootfs/lib/
- sudo rm rootfs/lib/*.a
- sudo ../gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip rootfs/lib/*
- version=3
- sudo mkdir -p rootfs/usr
- pushd rootfs/usr
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/lib .
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/include .
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/bin .
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/share .
- sudo /home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip lib/python*
- popd
- #sqlite
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/bin/* rootfs/bin/
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include/* rootfs/include/
- sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib/* rootfs/lib/
- sudo strip rootfs/bin/sqlite3
- sudo mkdir -p rootfs/dev/
- sudo mknod rootfs/dev/tty1 c 4 1
- sudo mknod rootfs/dev/tty2 c 4 2
- sudo mknod rootfs/dev/tty3 c 4 3
- sudo mknod rootfs/dev/tty4 c 4 4
- sudo mknod rootfs/dev/console c 5 1
- sudo mknod rootfs/dev/null c 1 3
- sudo mkdir -p rootfs/lib/modules/4\.10\.0\+
- pushd rootfs/lib
- sudo ln -sf ld-2.19-2014.07.so ld-linux-aarch64.so.1
- popd
- sudo mkdir -p rootfs/tools
- sudo cp ./other_tools/* rootfs/tools
- sudo dd if=/dev/zero of=ramdisk bs=1M count=200
- sudo mkfs.ext4 -F ramdisk
- sudo mkdir -p tmpfs
- sudo mount -t ext4 ramdisk ./tmpfs/ -o loop
- sudo cp -raf rootfs/* tmpfs/
- sudo umount tmpfs
- sudo gzip --best -c ramdisk > ramdisk.gz
- sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
这里将ramdisk的大小设置为了200MB,同时修改kernel配置:
- Device Drivers --->
- [*] Block devices --->
- () Default RAM disk size (kbytes)
然后重新编译kernel。
4、测试
在板子起来后,运行:
python3 /usr/lib/python3./test/test___all__.py
- aarch32
- [root@vexpress ]# python3 /usr/lib/python3./test/test___all__.py
- __phello__.foo
- _bootlocale
- _collections_abc
- _compat_pickle
- _compression
- _dummy_thread
- ... ...
- .
- ----------------------------------------------------------------------
- Ran test in .731s
- OK
- aarch64
- [root@aarch64 ]# python3 /usr/lib/python3./test/test___all__.py
- [ 20.347974] random: python3: uninitialized urandom read ( bytes read)
- [ 21.049645] random: fast init done
- __phello__.foo
- _bootlocale
- _collections_abc
- _compat_pickle
- _compression
- _dummy_thread
- _markupbase
- ... ...
- .
- ----------------------------------------------------------------------
- Ran test in .745s
- OK
完
交叉编译Python-3.6.0到aarch64/aarch32 —— 支持sqlite3的更多相关文章
- 交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3
作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: ...
- 交叉编译Python-2.7.13到ARM(aarch32)平台
作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: ...
- Python 3.6.0的sqlite3模块无法执行VACUUM语句
Python 3.6.0的sqlite3模块存在一个bug(见issue 29003),无法执行VACUUM语句. 一执行就出现异常: Traceback (most recent call last ...
- Apache Qpid Python 1.35.0 发布
Apache Qpid Python 1.35.0 发布了,Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议.提 ...
- python 3.4.0 简单的print 'hello world',出错--SyntaxError: invalid syntax
问题描写叙述: win7下安装的python 3.4.0版本号, 在命令行里写入简单的输出语句: print 'hello world' 然后enter,结果返回结果为: SyntaxError: i ...
- 关于 php 和 python 的浮点计算 0.1+0.2
关于 php 和 python 的浮点计算 0.1+0.2 看到群里有小伙伴说为什么 python 计算出 0.1+0.2 是 0.30000000000000004 >>> pri ...
- 如何交叉编译Python到ARM-Linux平台(转)
源: 如何交叉编译Python到ARM-Linux平台
- 在 Ubuntu 16.04 LTS 上安装 Python 3.6.0
原文连接:https://segmentfault.com/a/1190000007912666 最近 Python 3 发布了新版本 Python 3.6.0,好像又加入了不少黑魔法!- 由于暂时不 ...
- Win7 64bit+Anaconda(3-5.0.1,Python3.6)+Pycharm(community-2017.3.3)+OpenCV(python‑3.4.0‑cp36‑cp36m)(转载)
Anaconda(3-5.0.1,Python3.6)下载链接:https://pan.baidu.com/s/1bqFwLMB 密码:37ih Pycharm(community-2017.3.3) ...
随机推荐
- 011_自定义mac通知的时长
打开终端(找不到的点击 Mac 屏幕右上角放大镜按钮,Spotlight 搜索 “终端”),粘入下面这行命令,回车就行了.注意最后的 # 替换成你希望通知中心横幅停留的秒数,比如 15.default ...
- zabbix报警Too many processes on zabbix server
zabbix大量报警,运行进程过多,但实际有部分机器可以忽略,需要关闭相关的报警 Configuration-->Templates找到Template_Linux点该行的 Triggers选择 ...
- ipsec-tools安装教程
ipsec-tools最新版本为0.8.2,此处以0.7.3版本为例说明安装和使用过程.可参考ipsec-howto. 安装步骤 ipsec-tools依赖于linux2.6版本内核,在安装ipsec ...
- poj1093
题意:给出一个句子和要求整理后每行包含的字符数,要求将其整理为一种总badness最小的形式.设每个空格长度为n,单个空格的badness计算公式为(n-1)^2.总badness等于所有空格的bad ...
- 测试开发之Django——No2.Django的安装以及项目创建
开发平台:Mac Python版本:3.7 Django版本:2.0.5 一.Django的安装 1.pip安装 输入命令pip install Django==2.0.5 说明:不指定版本,则安装的 ...
- Node.js模块定义总结
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统.模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这 ...
- 【LOJ】#2183. 「SDOI2015」序列统计
题解 这个乘积比较麻烦,转换成原根的指数乘法就相当于指数加和了,可以NTT优化 注意判掉0 代码 #include <bits/stdc++.h> #define fi first #de ...
- Windows下调用caffe的matlab接口
一.编译caffe的matlab接口 在我的这篇博客windows-caffe配置已经说了怎么编译了,这里就略过了. 编译成功后,会得到如下图所示文件: matlab接口就在matcaffe文件夹里. ...
- jquery.validate.js自定义表单验证
$(document).ready(function() { //在下列位置输入页面加载的逻辑代码 $("#inputForm").validate({ rules: { seq: ...
- 深入分析Spring Boot2,解决 java.lang.ArrayStoreException异常
将某个项目从Spring Boot1升级Spring Boot2之后出现如下报错,查了很多不同的解决方法都没有解决: Spring boot2项目启动时遇到了异常: java.lang.ArraySt ...