交叉编译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,下面是命令:

1 #!/bin/bash
2
3 ../Python-3.6.0/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.0/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-2014.07_linux/bin:$PATH
 4
 5 ../Python-3.6.0/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-2014.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.2/_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 /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/bin/* rootfs/bin/
33 sudo cp /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include/* rootfs/include/
34 sudo cp /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         (153600) 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.2/_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 /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/bin/* rootfs/bin/
37 sudo cp /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include/* rootfs/include/
38 sudo cp /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         (204800) Default RAM disk size (kbytes)

然后重新编译kernel。

4、测试

在板子起来后,运行:

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

  • aarch32
 1 [[email protected] ]# python3 /usr/lib/python3.6/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 1 test in 15.731s
12 OK
  • aarch64
 1 [[email protected] ]# python3 /usr/lib/python3.6/test/test___all__.py
 2 [   20.347974] random: python3: uninitialized urandom read (24 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 1 test in 10.745s
15 OK

时间: 2024-10-06 12:21:10

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

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

作者:彭东林 邮箱:[email protected] QQ: 405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: http://www.cnblogs.com/pengdonglin137/p/6442583.html) 工具链: arm-none-linux-gnueabi-gcc  (gcc version 4.8.3 20140320) Python版本: Python-2.7.13 概述 前面一篇博文(交叉编译

交叉编译Python至嵌入式arm

这是求毕业哥的处女座博客,希望大家别喷!!! 由于实验室项目的需要,求毕业哥于昨晚(2014/11/05)9点开始学习Python.自身有点强迫症,装什么软件都要求新的,所以给自己 Windows装了个Python3.3(也为自己埋了个雷).之前在Linux机器上装了Python-2.7.3,我没多想,以为Python高级版 是向下兼容的.于是就开始了求毕业哥的踩雷之路...raw_input(),``,socket通信...总之各种版本间不兼容啊!!! 言归正传,求毕业哥(以下简称,求毕业)的

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

Python 3.6.0的sqlite3模块存在一个bug(见issue 29003),无法执行VACUUM语句. 一执行就出现异常: Traceback (most recent call last):  File "D:\desktop\cannot_vacuum.py", line 25, in <module>    conn.execute('VACUUM')sqlite3.OperationalError: cannot VACUUM from within a

Apache Qpid Python 1.35.0 发布

Apache Qpid Python 1.35.0 发布了,Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议.提供了 Java.C++ 两种服务端版本以及 Java.C++..NET.Python和Ruby语言的客户端. 增强: QPID-6475 - 08..09 Send connection.close before closing socket QPID-6567 - Support producer

交叉编译Python至嵌入式arm(支持import sqlite3,datetime等)-----Cross Compiling Python for Embedded Linux

这是求毕业哥的处女座博客,希望大家别喷!!! 由于实验室项目的需要,求毕业哥于昨晚(2014/11/05)9点开始学习Python.自身有点强迫症,装什么软件都要求新的,所以给自己Windows装了个Python3.3(也为自己埋了个雷).之前在Linux机器上装了Python-2.7.3,我没多想,以为Python高级版是向下兼容的.于是就开始了求毕业哥的踩雷之路...raw_input(),``,socket通信...总之各种版本间不兼容啊!!! 言归正传,求毕业哥(以下简称,求毕业)的实验

在 Ubuntu 16.04 LTS 上安装 Python 3.6.0

转自(http://blog.csdn.net/Wangdada111/article/details/73382537?locationNum=2&fps=1) 安装: wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz xz -d Python-3.6.0.tar.xz tar -xvf Python-3.6.0.tar cd Python-3.6.0 ./configure make sudo make inst

python wingIDE 5.0 安装和破解

之前网上的破解方法多是以替换pyo文件为主. 经在win7和win8 下经验发现,替换后,ide就启动不起来了. 除此之外还有大把的反编译破解教程,对于时间不宽裕的孩子,估计更是没心情看. 几经折腾,最后发现这个计算注册码的脚本. 整理后的安装包,破解脚本和破解方法描述文本,整理打包放在百度云盘上.下面是下载链接. http://pan.baidu.com/s/1kTFUwsB   最后,尊重别人的劳动和原创. http://lovesoo.org/wingide-zhu-ce-po-jie-f

Python API 2.0

Python API 2.0从2.0的事情开始更复杂一些,但是你会得到更多离散和可读的类: #!/usr/bin/env python import jsonfrom collections import namedtuplefrom ansible.parsing.dataloader import DataLoaderfrom ansible.vars import VariableManagerfrom ansible.inventory import Inventoryfrom ansi

一本值得你反复研读的Python佳作《Python编程从0到1》

现在的Python入门书太多太多了,究竟如何选择呢? 当然选最好的最入门的讲解最清晰的,没有那么多废话的. 现在就推荐一本<Python编程从0到1>,还带视频的,到时候跟大家一起学习沟通. 这本书有啥好的呢?还是直接上图更能说明问题. Python这么火了,网上资料是信息不是知识,跟我一起来学习这本书吧. 原文地址:https://www.cnblogs.com/mochou/p/11606881.html