给arm板编译移植python(二)移植zlib与_ctypes

上一节我们已经编译移植好了基本的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注释。

取消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安装路径也是可以的。

后面会讲下如何安装第三方模组。

猜你喜欢

转载自blog.csdn.net/qq_34440409/article/details/109287347