参考

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,下面是命令:

  1. #!/bin/bash
  2.  
  3. ../Python-3.6./configure
  4.  
  5. make -j8
  6. sudo make install

默认,Python3.6.0会被安装到/usr/local下面。

二、交叉编译

1、配置 mk1_conf.sh

  • aarch32

  1. #!/bin/bash
  2.  
  3. export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH
  4.  
  5. ../Python-3.6./configure \
  6. --host=arm-none-linux-gnueabi \
  7. --build=armv7 \
  8. --prefix=`pwd` \
  9. --enable-ipv6 \
  10. --enable-shared \
  11. ac_cv_file__dev_ptmx="yes" \
  12. ac_cv_file__dev_ptc="no" \
  13. LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/lib" \
  14. CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include"

其中--build表示编译出来的程序运行的CPU架构,--host是交叉编译工具链。这里我已经吧sqlite3的lib和include添加上了,所以生成的python3是支持sqlite3的。

  • aarch64

  1. #!/bin/bash
  2.  
  3. export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-.07_linux/bin:$PATH
  4.  
  5. ../Python-3.6./configure \
  6. --host=aarch64-linux-gnu \
  7. --build=aarch64 \
  8. --prefix=`pwd` \
  9. --enable-ipv6 \
  10. --enable-shared \
  11. ac_cv_file__dev_ptmx="yes" \
  12. ac_cv_file__dev_ptc="no" \
  13. LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib" \
  14. CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include"

只需要替换运行的CPU架构为aarch64,然后设置对应的工具链即可,别忘了还有sqlite3的相关路径的修改。

2、编译和安装 mk2_make.sh

这里没有什么好说的,下面是脚本内容:

  • aarch32

  1. #!/bin/bash
  2.  
  3. export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH
  4.  
  5. make -j4
  6. make install
  • aarch64
  1. #!/bin/bash
  2.  
  3. export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-.07_linux/bin:$PATH
  4.  
  5. make -j4
  6. make install

3、制作ramdisk

为了便于在python2和python3之间的切换,适当修改mk_ramdisk.sh如下:

  • aarch32

  1. #!/bin/bash
  2.  
  3. sudo rm -rf rootfs
  4. sudo rm -rf tmpfs
  5. sudo rm -rf ramdisk*
  6.  
  7. sudo mkdir rootfs
  8. sudo cp ../busybox-1.24./_install/* rootfs/ -raf
  9.  
  10. sudo mkdir -p rootfs/proc/
  11. sudo mkdir -p rootfs/sys/
  12. sudo mkdir -p rootfs/tmp/
  13. sudo mkdir -p rootfs/root/
  14. sudo mkdir -p rootfs/var/
  15. sudo mkdir -p rootfs/mnt/
  16.  
  17. sudo cp etc rootfs/ -arf
  18.  
  19. sudo cp -arf ../arm-2014.05/arm-none-linux-gnueabi/libc/lib rootfs/
  20.  
  21. ver=3
  22. sudo mkdir -p rootfs/usr
  23. pushd rootfs/usr
  24. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/lib .
  25. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/include .
  26. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/bin .
  27. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/share .
  28. sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip lib/python*
  29. popd
  30.  
  31. #sqlite
  32. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/bin/* rootfs/bin/
  33. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include/* rootfs/include/
  34. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/lib/* rootfs/lib/
  35. sudo strip rootfs/bin/sqlite3
  36.  
  37. sudo mkdir -p rootfs/dev/
  38. sudo mknod rootfs/dev/tty1 c 4 1
  39. sudo mknod rootfs/dev/tty2 c 4 2
  40. sudo mknod rootfs/dev/tty3 c 4 3
  41. sudo mknod rootfs/dev/tty4 c 4 4
  42. sudo mknod rootfs/dev/console c 5 1
  43. sudo mknod rootfs/dev/null c 1 3
  44.  
  45. sudo rm -rf rootfs/lib/*.a
  46. sudo rm -rf rootfs/lib/*.la
  47. sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip rootfs/lib/*
  48.  
  49. sudo mkdir -p rootfs/tools
  50. sudo cp ./other_tools/* rootfs/tools
  51.  
  52. sudo mkdir -p rootfs/lib/modules/4\.10\.0\+
  53.  
  54. sudo dd if=/dev/zero of=ramdisk bs=1M count=150
  55. sudo mkfs.ext4 -F ramdisk
  56.  
  57. sudo mkdir -p tmpfs
  58. sudo mount -t ext4 ramdisk ./tmpfs/ -o loop
  59. sudo cp -raf rootfs/* tmpfs/
  60. sudo umount tmpfs
  61.  
  62. sudo gzip --best -c ramdisk > ramdisk.gz
  63. sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

如果提示空间不足的话,可以将dd命令的count参数扩大,同时不要忘了将kernel配置里的ramdisk的大小也扩大:

  1. Device Drivers --->
  2.  
  3. [*] Block devices --->
  4.  
  5. () Default RAM disk size (kbytes)

这里将ramdisk的大小修改为了150MB,然后重新编译kernel

  • aarch64

  1. #!/bin/bash
  2.  
  3. sudo rm -rf rootfs
  4. sudo rm -rf tmpfs
  5. sudo rm -rf ramdisk*
  6.  
  7. sudo mkdir rootfs
  8. sudo cp ../busybox-1.24./_install/* rootfs/ -raf
  9.  
  10. sudo mkdir -p rootfs/proc/
  11. sudo mkdir -p rootfs/sys/
  12. sudo mkdir -p rootfs/tmp/
  13. sudo mkdir -p rootfs/root/
  14. sudo mkdir -p rootfs/var/
  15. sudo mkdir -p rootfs/mnt/
  16.  
  17. sudo cp etc rootfs/ -arf
  18. sudo mkdir -p rootfs/lib
  19.  
  20. sudo cp -arf ../gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/aarch64-linux-gnu/libc/lib/aarch64-linux-gnu/* rootfs/lib/
  21.  
  22. sudo rm rootfs/lib/*.a
  23. sudo ../gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip rootfs/lib/*
  24.  
  25. version=3
  26. sudo mkdir -p rootfs/usr
  27. pushd rootfs/usr
  28. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/lib .
  29. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/include .
  30. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/bin .
  31. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/share .
  32. sudo /home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip lib/python*
  33. popd
  34.  
  35. #sqlite
  36. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/bin/* rootfs/bin/
  37. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include/* rootfs/include/
  38. sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib/* rootfs/lib/
  39. sudo strip rootfs/bin/sqlite3
  40.  
  41. sudo mkdir -p rootfs/dev/
  42. sudo mknod rootfs/dev/tty1 c 4 1
  43. sudo mknod rootfs/dev/tty2 c 4 2
  44. sudo mknod rootfs/dev/tty3 c 4 3
  45. sudo mknod rootfs/dev/tty4 c 4 4
  46. sudo mknod rootfs/dev/console c 5 1
  47. sudo mknod rootfs/dev/null c 1 3
  48.  
  49. sudo mkdir -p rootfs/lib/modules/4\.10\.0\+
  50.  
  51. pushd rootfs/lib
  52. sudo ln -sf ld-2.19-2014.07.so ld-linux-aarch64.so.1
  53. popd
  54.  
  55. sudo mkdir -p rootfs/tools
  56. sudo cp ./other_tools/* rootfs/tools
  57.  
  58. sudo dd if=/dev/zero of=ramdisk bs=1M count=200
  59. sudo mkfs.ext4 -F ramdisk
  60.  
  61. sudo mkdir -p tmpfs
  62. sudo mount -t ext4 ramdisk ./tmpfs/ -o loop
  63. sudo cp -raf rootfs/* tmpfs/
  64. sudo umount tmpfs
  65.  
  66. sudo gzip --best -c ramdisk > ramdisk.gz
  67. sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

这里将ramdisk的大小设置为了200MB,同时修改kernel配置:

  1. Device Drivers --->
  2.  
  3. [*] Block devices --->
  4.  
  5. () Default RAM disk size (kbytes)

然后重新编译kernel。

4、测试

在板子起来后,运行:

python3 /usr/lib/python3./test/test___all__.py

  • aarch32
  1. [root@vexpress ]# python3 /usr/lib/python3./test/test___all__.py
  2. __phello__.foo
  3. _bootlocale
  4. _collections_abc
  5. _compat_pickle
  6. _compression
  7. _dummy_thread
  8. ... ...
  9. .
  10. ----------------------------------------------------------------------
  11. Ran test in .731s
  12. OK
  • aarch64
  1. [root@aarch64 ]# python3 /usr/lib/python3./test/test___all__.py
  2. [ 20.347974] random: python3: uninitialized urandom read ( bytes read)
  3. [ 21.049645] random: fast init done
  4. __phello__.foo
  5. _bootlocale
  6. _collections_abc
  7. _compat_pickle
  8. _compression
  9. _dummy_thread
  10. _markupbase
  11. ... ...
  12. .
  13. ----------------------------------------------------------------------
  14. Ran test in .745s
  15. OK

交叉编译Python-3.6.0到aarch64/aarch32 —— 支持sqlite3的更多相关文章

  1. 交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3

    作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: ...

  2. 交叉编译Python-2.7.13到ARM(aarch32)平台

    作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: ...

  3. Python 3.6.0的sqlite3模块无法执行VACUUM语句

    Python 3.6.0的sqlite3模块存在一个bug(见issue 29003),无法执行VACUUM语句. 一执行就出现异常: Traceback (most recent call last ...

  4. Apache Qpid Python 1.35.0 发布

    Apache Qpid Python 1.35.0 发布了,Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议.提 ...

  5. python 3.4.0 简单的print 'hello world',出错--SyntaxError: invalid syntax

    问题描写叙述: win7下安装的python 3.4.0版本号, 在命令行里写入简单的输出语句: print 'hello world' 然后enter,结果返回结果为: SyntaxError: i ...

  6. 关于 php 和 python 的浮点计算 0.1+0.2

    关于 php 和 python 的浮点计算 0.1+0.2 看到群里有小伙伴说为什么 python 计算出 0.1+0.2 是 0.30000000000000004 >>> pri ...

  7. 如何交叉编译Python到ARM-Linux平台(转)

    源: 如何交叉编译Python到ARM-Linux平台

  8. 在 Ubuntu 16.04 LTS 上安装 Python 3.6.0

    原文连接:https://segmentfault.com/a/1190000007912666 最近 Python 3 发布了新版本 Python 3.6.0,好像又加入了不少黑魔法!- 由于暂时不 ...

  9. 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) ...

随机推荐

  1. 011_自定义mac通知的时长

    打开终端(找不到的点击 Mac 屏幕右上角放大镜按钮,Spotlight 搜索 “终端”),粘入下面这行命令,回车就行了.注意最后的 # 替换成你希望通知中心横幅停留的秒数,比如 15.default ...

  2. zabbix报警Too many processes on zabbix server

    zabbix大量报警,运行进程过多,但实际有部分机器可以忽略,需要关闭相关的报警 Configuration-->Templates找到Template_Linux点该行的 Triggers选择 ...

  3. ipsec-tools安装教程

    ipsec-tools最新版本为0.8.2,此处以0.7.3版本为例说明安装和使用过程.可参考ipsec-howto. 安装步骤 ipsec-tools依赖于linux2.6版本内核,在安装ipsec ...

  4. poj1093

    题意:给出一个句子和要求整理后每行包含的字符数,要求将其整理为一种总badness最小的形式.设每个空格长度为n,单个空格的badness计算公式为(n-1)^2.总badness等于所有空格的bad ...

  5. 测试开发之Django——No2.Django的安装以及项目创建

    开发平台:Mac Python版本:3.7 Django版本:2.0.5 一.Django的安装 1.pip安装 输入命令pip install Django==2.0.5 说明:不指定版本,则安装的 ...

  6. Node.js模块定义总结

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统.模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这 ...

  7. 【LOJ】#2183. 「SDOI2015」序列统计

    题解 这个乘积比较麻烦,转换成原根的指数乘法就相当于指数加和了,可以NTT优化 注意判掉0 代码 #include <bits/stdc++.h> #define fi first #de ...

  8. Windows下调用caffe的matlab接口

    一.编译caffe的matlab接口 在我的这篇博客windows-caffe配置已经说了怎么编译了,这里就略过了. 编译成功后,会得到如下图所示文件: matlab接口就在matcaffe文件夹里. ...

  9. jquery.validate.js自定义表单验证

    $(document).ready(function() { //在下列位置输入页面加载的逻辑代码 $("#inputForm").validate({ rules: { seq: ...

  10. 深入分析Spring Boot2,解决 java.lang.ArrayStoreException异常

    将某个项目从Spring Boot1升级Spring Boot2之后出现如下报错,查了很多不同的解决方法都没有解决: Spring boot2项目启动时遇到了异常: java.lang.ArraySt ...