打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
How To Cross Compile Python 2.5.2 For ARM -- by Border

How To Cross Compile Python 2.5.2 For ARM -- by Bo

前言

本文主要参考 LeoJay 同学的 LeoJay/HOWTOCrossCompilePythonForARM

我也是刚接触交叉编译, 欢迎各位拍砖 -- border

编译环境

ubuntu 8.04
gcc 4.2.3
arm_v5t_le-gcc 3.4.3

下载Python

http://www.python.org/download/ 下载Python源码,我下载的::

    http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2                                                

解压

    tar jxvf Python-2.5.2.tar.bz2                                                    cd Python-2.5.2                                                

编译pc版本的语法解析器

由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen::

    border@b0rder:~/tools/Python-2.5.2$ mkdir build.pc                                                    border@b0rder:~/tools/Python-2.5.2$ cd build.pc/                                                    border@b0rder:~/tools/Python-2.5.2/build.pc$ ../configure                                                    border@b0rder:~/tools/Python-2.5.2/build.pc$ make Parser/pgen                                                

然后ls Parser一下,应该就能看到有pgen了。

修改../configure

configure在检测编译器的printf是否支持%zd的时候,如果发现是在cross compile,就直接不干活了。这还了得?

把这一部分的检测代码去掉。这段代码起始于::

    echo "$as_me:$LINENO: checking for %zd printf() format support" >&5                                                    echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6                                                    if test "$cross_compiling" = yes; then                                                

结束于::

    cat >>confdefs.h <<\_ACEOF                                                    #define PY_FORMAT_SIZE_T "z"                                                    _ACEOF                                                                                                    else                                                      echo "$as_me: program exited with status $ac_status" >&5                                                    echo "$as_me: failed program was:" >&5                                                    sed 's/^/| /' conftest.$ac_ext >&5                                                                                                    ( exit $ac_status )                                                    echo "$as_me:$LINENO: result: no" >&5                                                    echo "${ECHO_T}no" >&6                                                    fi                                                    rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext                                                    fi                                                

把这两段以及中间的内容都删除掉就可以了, 我的是从 22496 - 22583 行,不同的版本可能不一样。

编译arm版本的python

有了语法解析器,就可以开始编译arm版本的python了::

    border@b0rder:~/tools/Python-2.5.2/build.pc$ mkdir ../build.arm                                                    border@b0rder:~/tools/Python-2.5.2/build.pc$ cd ../build.arm/                                                    border@b0rder:~/tools/Python-2.5.2/build.arm$ ../configure --prefix=/opt/arm-test/rootfs --disable-ipv6 --host=arm_v5t_le --enable-shared                                                

先创建一个用于编译的目录build.arm,再对python做一些配置,如安装目录,不要ipv6,使用arm_v5t_le的编译器(你的可能是arm-linux),生成动态链接库。

修改Makefile

去掉Debug

    OPT=                -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes                                                

一行中,去掉-g,我们不要debug python,-O3改为-O2,空间紧张O2就可以了。 我的是59行。

修改PGEN

    PGEN=           Parser/pgen$(EXE)                                                

一行的下面加上

    PGEN_HOST=      ../build.pc/Parser/pgen$(EXE)                                                

表明我们在HOST上运行的pgen

在要使用PGEN的地方改为PGEN_HOST (494行)::

    $(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)                                                                    -@ mkdir Include                                                                    -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)                                                

改为::

    $(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)                                                                    -@ mkdir Include                                                                    -$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)                                                

修改BUILDPYTHON

修改所有使用新生成的python的地方为本机的python绝对地址. 所有如 ./$(BUILDPYTHON) 的地方,都改为python (为本地的python地址,不要使用刚刚编译生成的./python), 在vim里面使用

:%s/.\/$(BUILDPYTHON)/\/usr\/bin\/python/g                                                

我的是替换了11处。 如::

    platform: $(BUILDPYTHON)                                                            $(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform                                                

改为::

    platform: $(BUILDPYTHON)                                                            $(RUNSHARED)  /usr/bin/python  -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform                                                

这种地方比较多,大家小心修改。

如果出这样的错, 说明替换的有问题::

    case $MAKEFLAGS in                                                             *-s*) LD_LIBRARY_PATH=/home/border/tools/Python-2.5.2/build.arm: CC='arm_v5t_le-gcc' LDSHARED='arm_v5t_le-gcc -shared' OPT='-DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes' ./python -E ../setup.py -q build;;                                                             *) LD_LIBRARY_PATH=/home/border/tools/Python-2.5.2/build.arm: CC='arm_v5t_le-gcc' LDSHARED='arm_v5t_le-gcc -shared' OPT='-DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes' ./python -E ../setup.py build;;                                                             esac                                                    /bin/sh: line 2: ./python:无法执行二进制文件                                                                                                

修改setup.py

setup.py负责编译python的各个扩展模块。但是,由于python完全没有考虑cross compile,所以要做一些修改。

build_extension函数

  • 这个函数在编译了所有的extension后,会去load这些刚编译好的extension, 但我们在i686的电脑上显然不能load,所以要跳过这些操作。 在 build_ext.build_extension(self, ext)下一行直接写一个return,不做load。

detect_modules函数

  • 函数的前两行是把/usr/local加到搜索目录中,我们的cross compiler一般不会直接安装在 /usr/local里面的,所以这两行去掉:

                    add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')                                                                    add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')                                                

去掉不必要的模块

  • lib_dirs, inc_dirs的设定中,把中括号里的那些都去掉。 以下所有模块都不要:

            cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline,                                                            ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter                                                

main函数

  • setup函数调用的时候,把要安装的scripts那一部分去掉

之后就可以make && make install了.

常见问题

PYTHONHOME

在ARM机上执行时如果遇到::

    root@192.168.0.167:~# python2.5                                                    Could not find platform dependent libraries <exec_prefix>                                                    Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]                                                    Python 2.5.2 (r252:60911, Jul 31 2008, 18:05:30)                                                    [GCC 3.4.3 (MontaVista 3.4.3-25.0.30.0501131 2005-07-23)] on linux2                                                    Type "help", "copyright", "credits" or "license" for more information.                                                    >>>                                                

没有配置PYTHONHOME

PYTHONPATH

PYTHONPATH

    export PYTHONHOME=/usr/lib/python2.5                                                    export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages                                                    export PATH=$PATH:$PYTHONHOME:$PYTHONPATH                                                

如果出现'import site' failed错误,就是PYTHONPATH配置出错。

附上我修改后的 Makefilesetup.py 供大家参考

感谢 LeoJay 不厌其烦的指导。

参考

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[Python]HOWTO Cross Compile Python for ARM
交叉编译libxml2 zlib-1.2.11
ARM40之Python3.6.4移植
ubuntu上的arm-elf-tools -20040427.sh 下载及安装问题的解决 - raindy的日志 - 网易博客
Cross Toolchain-交叉编译工具链
移植linux内核:/usr/local/arm/4.3.3/bin/arm-linux-gcc: 3: arm-none-linux-gnueabi-gcc: not found
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服