Cross Compile Python 2.5.2 For ARM
来源:互联网 发布:电信网络上门维修电话 编辑:程序博客网 时间:2024/05/17 21:47
Posted On 嵌入式 At: 2008-08-01 16:45:16
Cross Compile Python 2.5.2 For ARM
本文排版有问题可以看排版后的: http://wiki.woodpecker.org.cn/moin/Cross_Compile_Python_2.5.2_For_ARM
编译环境:
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/
../configure --prefix=/opt/arm-test/rootfs --disable-ipv6 --host=arm_v5t_le --enable-shared
先创建一个用于编译的目录build.arm,再对python做一些配置,如安装目录,不要ipv6,使用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
c 在要使用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)
d 修改所有使用新生成的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:无法执行二进制文件
7. 修改setup.pysetup.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
8 main函数
setup函数调用的时候,把要安装的scripts那一部分去掉
之后就可以make && make install了.
最后在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:
export PYTHONHOME=/usr/lib/python2.5
export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
export PATH=$PATH:$PYTHONHOME:$PYTHONPATH
如果出现'import site' failed错误,就是PYTHONPATH配置出错。
感谢 Len Jay 不厌其烦的指导。
- 参考:
- http://wiki.woodpecker.org.cn/moin/LeoJay/HOWTOCrossCompilePythonForARM
- http://groups.google.com/group/python-cn/browse_thread/thread/89f7de96b5ea72dc
-- EOF --
- Cross Compile Python 2.5.2 For ARM
- How To Cross Compile Python 2.5.2 For ARM -- by Border
- How to cross-compile OpenSSL for ARM
- cross compile toolchain for arm/android
- cross compile qt5everywhere for arm CortexA8
- How to cross-compile Chromium for ARM
- linux arm cross-compile
- FFTW ARM cross compile
- python cross compile
- arm cross compile Q&A
- Cross Compile libdnet and Python for Montavista/PowerPC
- cross compile busybox for android
- mplayer cross compile 2
- ffmpeg cross compile 2
- Cross-compiling for ARM
- QtCreator on Windows to Cross Compile for Linux ARM with CodeSourcery Toolchain
- cross-compile minigui in arm 2410
- Linux ARM Cross Compile On Intel x86
- 通过 Jazz 和 IBM Rational Team Concert 进行测试管理
- scjp题目解析(十五)
- "taskdef class org.hibernate.tool.ant.HibernateToolTask cannot be found"的解决
- UML中关联,聚合,组合的区别
- C#开发自动化立体仓库监控系统的方法
- Cross Compile Python 2.5.2 For ARM
- Built-In Asynchronous I/O Support in ASP.NET
- 解决:/usr/bin/ld: cannot find -lltdl
- Manual Threading in ASP.NET 2.0
- 第10章 范型和容器
- Java-Excel报表开发POI(转于老彭的博客)
- c++学习笔记----泛型算法
- mssqlserver字符串日期互相转换
- X3BLOG 多用户 1.0.0 beta2版发布