上一节我们已经编译移植好了基本的python,今天来讲如何移植zlib与_ctypes
移植zlib
zlib下载
这里使用的是zlib-1.2.11
tar xzvf zlib-1.2.11.tar.gz # 解压缩
cd zlib-1.2.11
-
编译主机版zlib
编译主机zlib前我们需要先切换编译器为主机编译器执行export CC=gcc
export CC=gcc
./configure
make
sudo make install
- 编译目标版zlib
mkdir /opt/zlib
export CC=arm-himix200-linux-gcc # 更改编译器
./configure --prefix=/opt/zlib # 指定编译目录
make
sudo make install
root@ubuntu:~# ls /opt/zlib
include lib share
-
重新编译主机python
修改 source/Python-3.7.6/Modules/Setup.dist,取消zlib注释
export CC=gcc # 返回默认编译器
./configure
make
sudo make install
此时运行主机python 查看modules,会看到最后有zlib模组,主机编译成功,接下来编译目标机。
-
重新编译目标版Python
sudo cp -rfp /opt/zlib/* /home/python3.7/install/python # 复制zlib到python安装路径
重新编译python,可以更改make.sh脚本执行
#file make.sh
...
make_target () {
cd ${BASE}/source/Python*
echo `pwd`
sudo make clean
mkdir bulid-${BUILD_HOST} -p
cd bulid-${BUILD_HOST}
mkdir ${BASE}/install/python -p
../configure CC=${BUILD_HOST}-gcc \
CXX=${BUILD_HOST}-g++ \
--host=${BUILD_HOST} \
--build=x86_64-linux-gnu \
--target=${BUILD_HOST} --disable-ipv6 \
--prefix=${BASE}/install/python \
--enable-optimizations \
ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=yes
#make && make install
}
#make_dirs
#download_package
#tar_package
#make_host #如果没有的话,需要安装
make_target
脚本里保留make_target,其他注释,make_target中make && make install也需要注释掉,重新执行./make.sh
同编译主机版python,cd build-${BUILD_HOST} 修改Modules/Setup,
取消zlib注释。
然后编译
make && make install
python编译完成后,放到板子上,进入repl查看modules发现zlib已经添加完成。
移植_ctypes
前面提到,python3.7之前的版本是自带编译好的_ctypes的,python3.7则没有,这是因为3.7需要依赖一个新的库实现这个模块,libffi库,据测试比对发现python3.7版本比之前的版本运行速度要快些,不知道是不是因为这个原因。所以目前开发者大多用的python3.7版本,我们也是直接移植python3.7。接下来说说如何移植libffi。
-
编译主机_ctypes
ubuntu主机的话很简单,直接安装现成的包就行
sudo apt-get install libffi-dev
安装好后,重新编译主机python,编译方法前面已经讲过,不在赘述。编完查看modules可以发现_ctypes已经有了。此时便可以用主机进行setup安装第三方模组了。
-
编译目标机_ctypes
编译目标机要麻烦些,毕竟简陋的arm板上的linux没有现成的包管理安装功能,我们需要自己编译放进去。
下载libffi源码:ftp://sourceware.org/pub/libffi/
选择最新版本下载就行,我下的是3.3版本。源码放到主机上解压并进入源码路径下,然后编译arm版libffi库。
export CC=arm-himix200-linux-gcc
./configure --host=arm-himix200-linux --build=x86_64-linux-gnu --target=arm-himix200-linux --prefix=/opt/libffi-3.3
库编译好后我们需要把lib和头文件复制到交叉编译工具链库路径下,这个路径怎么找呢,可以看之前交叉编译python的打印信息类似这种:
arm-himix200-linux-v2-gcc -shared build/temp.linux-arm-3.7/home/amba/21819/Python-3.7.4/Modules/xxlimited.o -L/usr/local/arm-himix200-linux-v2/target/usr/lib -L/usr/local/arm-himix200-linux-v2/target/lib -L/usr/local/arm-himix200-linux-v2/arm-linux-gnueabi/lib -L/usr/local/arm-himix200-linux-v2/lib/gcc -o build/lib.linux-arm-3.7/xxlimited.cpython-37m-arm-linux-gnueabi.so
下面以我的为例:
cp /opt/libffi-3.3/lib/* /opt/hisi-linux/x86-arm/arm-himix200-linux/target/usr/lib/
cp /opt/libffi-3.3/include/* /opt/hisi-linux/x86-arm/arm-himix200-linux/target/usr/include/
然后重新编译目标板python
make
make完可以看打印信息,会有报错,关于_uuid模组的,这个暂时不影响,不需要管他,这个报错并不影响python的编译,编译信息下面还有列出哪些模组没有编译进来。libffi移植之前会列出_ctypes,_uuid没有编译成功,现在应该只有_uuid被列出,此时说明我们的_ctypes已经编译完成,如下图:
make install
安装好放到板子上再次查看modules,发现_ctypes已经有了,至此python最基本的功能已经可以了,我们也可以在板子上setup安装第三方模组,当然主机上setup安装到python安装路径也是可以的。
后面会讲下如何安装第三方模组。