python arm linux_python2.5.4移植到arm-linux

转载请注明出处:

Ver1.2 by tian2009-05-31

1移植需求

需求:在Arm9上运行python2.5.4。

ARM Target环境:

S3C2410A & arm-linux-2.4.18,和AT91SAM9261 & arm-linux-2.6.20。

host编译环境:

RHEL5U3, gcc 4.1.2, arm-linux-gcc 2.95.3,arm-linux-gcc 3.4.4

需要cross compile的软件包:

sqlite 3.6.14, python 2.5.4, boa-0.94.13.

2交叉编译sqlite

先到http://www.sqlite.org/download.html下载最新的sqlite源代码,我这里用的是3.6.14版本。

推荐使用amalgamation版本的源代码,这个代码只有几个文件而已,编译起来方便,而且据说编译器好的话,还可能编译出更高效的代码。我下载的是

先运行以下几步:

tar zxf sqlite-amalgamation-3.6.14.tar.gz

cd sqlite-3.6.14

(arm-linux-gcc version 3.4.4:)

./configure --host=arm-linux --prefix=/usr/local/arm/3.4.4 --enable-shared --disable-readline --disable-dynamic-extensions

(arm-linux-gcc version 2.95.3:)

./configure --host=arm-linux --prefix=/usr/local/arm/2.95.3 --enable-shared --disable-readline --disable-dynamic-extensions

以上是把sqlite解压缩,然后做一些配置,这里,希望sqlite到时候安装到/usr/local/arm/3.4.4里,要生成动态链接库,不要readline,不要sqlite的动态扩展。sqlite到时候安装到/usr/local/arm/3.4.4里。

如果要做进文件系统,则作如下设置:

(arm-linux-gcc version 3.4.4:)

./configure --host=arm-linux --prefix=$(pwd)/_install_gcc3 --enable-shared --disable-readline --disable-dynamic-extensions

(arm-linux-gcc version 2.95.3:)

./configure --host=arm-linux --prefix=$(pwd)/_install_gcc2 --enable-shared --disable-readline --disable-dynamic-extensions

然后编辑Makefile,把CFLAGS和CXXFLAGS中的-g去掉,我们不用debug sqlite。

接下来就可以编译和安装sqlite了:

make

make install

3交叉编译python

3.1下载

3.2编译并安装pc版本

交叉编译,也需要HOST机上的python版本为2.5.4,执行如下命令:

tar -zxvf Python-2.5.4.gz

cd Python-2.5.4

make clean

./configure --prefix=/usr

make

make install

3.3编译pc版本的语法解析器

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

mkdir build.pc

cd build.pc

../configure

make Parser/pgen

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

3.4Arm-linux-gcc-3.4.4版本编译

3.4.1修改和运行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 <

#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

把这两段以及中间的内容都删除掉就可以了。

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

(arm-linux-gcc version 3.4.4:)

cd ..

./configure --prefix=$(pwd)/_install_gcc3 --disable-ipv6 --host=arm-linux --enable-shared

./configure --prefix=/usr/ztian/_install_gcc3 --disable-ipv6 --host=arm-linux --enable-shared

3.4.2修改Makefile

之后就要对Makefile做一些修改:

(1)把

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

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

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

(2)在:

PGEN=Parser/pgen$(EXE)

一行的下面加上:

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

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

表明我们在HOST上运行的pgen。

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

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)

-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改为:

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)

-$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

(4)修改所有使用新生成的python的地方。

所有如./$(BUILDPYTHON)的地方,都改为python,如:

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)python-E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

这种地方比较多,共11处,需小心修改。

3.4.3修改setup.py

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

PyBuildExt类:

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

由于python本身的问题,现在ctypes还不能在除i386以外的机器上运行,所以ctypes也去掉:

disabled_module_list = ['cmath', '_ctypes', '_testcapi', 'pwd', 'grp', 'spwd', 'mmap', 'audioop', 'imageop', 'rgbimg', 'readline','ssl', 'openssl', 'bdb', 'dbm', 'termios', 'nsl', 'ncurses', 'bz2', 'linuxaudiodev', 'ossaudiodev', '_tkinter']

编译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值