ARM40之Python3.6.4移植

准备

默认以下所列举的软件都已安装完毕,主机和目标机可以通讯。

  • 主机平台:Ubuntu 16.04 LTS(x64)
  • 目标平台:ARM40-A5D3
  • 虚拟机:VMware® Workstation 12 Pro
  • Python版本:Python3.6.4
  • 编译工具链:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi
  • 终端工具:putty,secureCRT

部署zlib

  • 下载zlib

ARM40之Python3.6.4移植_第1张图片

  • 预编译zlib

为什么要先编译zlib?因为zlib模块为python压缩方法提供支持。
如果不预先编译zlib,编译python的时候就会报“zlib 模块找不到”的错误。
编译Ubuntu(PC版),ARM版两个版本的zlib,为下面的交叉编译Python-3.6.4做准备。
注意:zlib的configure不支持用CC变量来指定交叉工具链。

$ cd ~
$ tar xzvf zlib-1.2.11.tar.gz
$ ls
$ cd zlib-1.2.11/
$ ls

ARM40之Python3.6.4移植_第2张图片

编译Ubuntu(PC版)zlib:

$ ./configure
$ make
$ sudo make install
$ exit

ARM40之Python3.6.4移植_第3张图片

编译ARM版zlib:

$ cd ~/zlib-1.2.11/
$ sudo mkdir /opt/zlib
$ export CC=arm-linux-gnueabi-gcc
$ ./configure  --prefix=/opt/zlib
$ make
$ sudo make install
$ exit

ARM40之Python3.6.4移植_第4张图片

部署Ubuntu Python3.6.4

  • 下载Python3.6.4源代码

ARM40之Python3.6.4移植_第5张图片

  • 解压Python3.6.4源代码

将下载的Python3.6.4源代码复制到虚拟机Ubuntu中,解压到指定目录。默认是当前用户目录下。

$ cd ~
$ ls
$ xz -d Python-3.6.4.tar.xz
$ ls
$ tar xvf Python-3.6.4.tar
$ cd Python-3.6.4/
$ ls

ARM40之Python3.6.4移植_第6张图片
ARM40之Python3.6.4移植_第7张图片

  • 更新Ubuntu Python3版本

Ubuntu上python3的版本大于3.6.4,请跳过此步骤。

$ python3 -V

1)Ubuntu上的python3的版本不能低于3.6.4,否则在交叉编译Python-3.6.4的时候就会失败!默认Ubuntu python为最新版本,如果不是,需要手动编译安装Python-3.6.4。
2)编译Python-3.6.4前必须修改Python-3.6.4/Modules/Setup.dist文件,
否则编译过程中有可能会报“zlib 模块找不到”的错误。

$ python3 -V
$ cd ~/Python-3.6.4/
$ ls
$ vim Modules/Setup.dist
$ ./configure
$ make
$ sudo make install

ARM40之Python3.6.4移植_第8张图片

编译ARM Python3.6.4

  • 创建Ubuntu版本的pgen

1)在交叉编译Python时,需要用到pgen解释器。
如果编译的是ARM架构的解释器,是不能在PC上运行的,会导致编译失败。
所以要预先编译出一个能Ubuntu上运行的pgen。

$ cd ~/Python-3.6.4/
$ make distclean  
$ ls
$ ./configure
$ make Parser/pgen

ARM40之Python3.6.4移植_第9张图片

  • 交叉编译python3.6.4

1)在Python-3.6.4目录下,创建build-arm40的目录;
交叉编译python,将在这个目录下进行。
2)在/opt目录下创建python3目录;
将交叉编译好的zlib库,复制到python3目录下,注意这一步很关键。
注意…/configure,“/”的前面是有两个点的。

$ cd ~/Python-3.6.4/
$ mkdir build-arm40
$ cd build-arm40
$ sudo mkdir /opt/python3
$ sudo cp -rfp /opt/zlib/* /opt/python3/
$ ls /opt/python3/
$ ../configure CC=arm-linux-gnueabi-gcc \
              CXX=arm-linux-gnueabi-g++ \
              AR=arm-linux-gnueabi-ar \
              RANLIB=arm-linux-gnueabi-ranlib \
              --host=arm-linux-gnueabi \
              --build=x86_64-linux-gnu \
              --target=arm-linux-gnueabi \
              --disable-ipv6 \
              --prefix=/opt/python3 \
              --with-ensurepip=yes \
              --enable-optimizations \
              ac_cv_file__dev_ptmx=yes \
              ac_cv_file__dev_ptc=yes            

ARM40之Python3.6.4移植_第10张图片

不要急着make,下面的步骤很关键。
1)将刚才创建好的Ubuntu版本的pgen,复制到build-arm40的Parser目录下。
2)交叉编译Python-3.6.4前必须修改Modules/Setup文件,否则编译过程中有可能会报“zlib 模块找不到”的错误。
3)touch –t 12312359 ./Parser/pgen ; 将pgen文件的日期改为今年的最后一分钟生成的。为什么需要这一步?因为arm版python在make时,会生成它的pgen,就会把刚才复制过来的pgen给替换掉,改成未来的时间,就会忽略跳过。引用1

$ cd build-arm40
$ ls
$ cp ../Parser/pgen ./Parser/
$ ll ./Parser/
$ touch -t 12312359 ./Parser/pgen
$ ll ./Parser/
$ vim Modules/Setup

ARM40之Python3.6.4移植_第11张图片
ARM40之Python3.6.4移植_第12张图片

4)切换到root账户进行make,以防由于环境变量不一致的导致编译错误。
5)编辑root环境下的.bashrc文件,并使交叉编译器生效。

在.bashrc文件末尾添加
export PATH=/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin:$PATH

$ su -
root# cd ~
root# vim .bashrc
root# source .bashrc
root# echo $PATH
root# cd /home/ubt1604/Python-3.6.4/build-arm40/
root# make
root# make install

ARM40之Python3.6.4移植_第13张图片
root-bashrc2.png

关于报错:主要是zlib缺失,gcc交叉编译工具链路径或者环境变量的问题。
编译python3.6.4结束了,下面将它移植ARM40上。

移植ARM Python3.6.4

  • ARM40 Python3文件部署

1)将Ubuntu /opt目录下的python3目录进行打包;
2)通过NFS将它解压到ARM40的/opt目录下。

$ cd /opt/
$ sudo tar cvf python3.tar python3/
$ ls
$ sudo mv python3.tar /home/nfsroot/
$ ls /home/nfsroot/

ARM40之Python3.6.4移植_第14张图片

登录到ARM40,使用NFS连接到Ubuntu nfs共享目录/home/nfsroot
默认ARM40 IP地址:192.168.6.5;Ubuntu默认IP地址:192.168.6.10;

root@ARM40:# cd /home
root@ARM40:# mkdir nfsroot
root@ARM40:# ls
root@ARM40:# ls
root@ARM40:# mount -t nfs -o nolock 192.168.6.10:/home/nfsroot /home/nfsroot
root@ARM40:# cd nfsroot/
root@ARM40:# ls
root@ARM40:# tar xvf python3.tar -C /opt/
root@ARM40:# ls /opt/
root@ARM40:# cd /opt/python3/bin/
root@ARM40:# ./python3.6 -V
>>Python 3.6.4

ARM40之Python3.6.4移植_第15张图片
ARM40之Python3.6.4移植_第16张图片

至此,Python3.6.4移植结束。

参考引用

  • python移植到arm的单板
  • Configure and compile Python with Zlib
  • Ubuntu14.04 交叉编译Python2.7.2 for arm

你可能感兴趣的:(Linux,嵌入式,python3)