分类: LINUX
2009-01-19 16:46:22
本文主要参考 同学的
我也是刚接触交叉编译, 欢迎各位拍砖 --
ubuntu 8.04
gcc 4.2.3
arm_v5t_le-gcc 3.4.3
下载Python源码,我下载的::
tar jxvf Python-2.5.2.tar.bz2 cd Python-2.5.2
由于在编译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在检测编译器的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了::
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),生成动态链接库。
OPT= -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
一行中,去掉-g,我们不要debug python,-O3改为-O2,空间紧张O2就可以了。 我的是59行。
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)
修改所有使用新生成的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负责编译python的各个扩展模块。但是,由于python完全没有考虑cross compile,所以要做一些修改。
add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline, ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter
之后就可以make && make install了.
在ARM机上执行时如果遇到::
root@192.168.0.167:~# python2.5 Could not find platform dependent librariesConsider setting $PYTHONHOME to [: ] 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
export PYTHONHOME=/usr/lib/python2.5 export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages:$PYTHONHOME/lib-dynload export PATH=$PATH:$PYTHONHOME:$PYTHONPATH
如果出现'import site' failed错误,就是PYTHONPATH配置出错。
附上我修改后的 和 供大家参考
感谢 不厌其烦的指导。
-- EOF --