默认以下所列举的软件都已安装完毕,主机和目标机可以通讯。
为什么要先编译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
编译Ubuntu(PC版)zlib:
$ ./configure
$ make
$ sudo make install
$ exit
编译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
将下载的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
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
1)在交叉编译Python时,需要用到pgen解释器。
如果编译的是ARM架构的解释器,是不能在PC上运行的,会导致编译失败。
所以要预先编译出一个能Ubuntu上运行的pgen。
$ cd ~/Python-3.6.4/
$ make distclean
$ ls
$ ./configure
$ make Parser/pgen
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
不要急着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
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
关于报错:主要是zlib缺失,gcc交叉编译工具链路径或者环境变量的问题。
编译python3.6.4结束了,下面将它移植ARM40上。
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,使用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
至此,Python3.6.4移植结束。