历史上的今天
返回首页

历史上的今天

今天是:2025年02月26日(星期三)

正在发生

2020年02月26日 | Python2.5.4移植到arm-linux

2020-02-26 来源:eefocus

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版本的源代码,这个代码只有几个文件而已,编译起来方便,而且据说编译器好的话,还可能编译出更高效的代码。我下载的是


http://www.sqlite.org/sqlite-amalgamation-3.6.14.tar.gz


先运行以下几步:


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 下载

先去http://www.python.org/download/下载最新版本的python源代码,我这里下载的是:


http://www.python.org/ftp/python/2.5.4/Python-2.5.4.tgz


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.4 Arm-linux-gcc-3.4.4版本编译

3.4.1 修改和运行configure

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


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


echo "asme:asme:LINENO: checking for %zd printf() format support" >&5


echo ECHON"checkingforECHON"checkingforECHO_C" >&6


if test "$cross_compiling" = yes; then


结束于:


cat >>confdefs.h <

#define PY_FORMAT_SIZE_T "z"


_ACEOF


else


  echo "asme:programexitedwithstatusasme:programexitedwithstatusac_status" >&5


echo "$as_me: failed program was:" >&5


sed 's/^/| /' conftest.$ac_ext >&5


 


( exit $ac_status )


echo "asme:asme:LINENO: result: no" >&5


echo "${ECHO_T}no" >&6


fi


rm -f core *.core gmon.out bb.out conftestacexeextconftest.acexeextconftest.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:


(GRAMMARH)(GRAMMARH)(GRAMMAR_C): (PGEN)(PGEN)(GRAMMAR_INPUT)


                -(PGEN)(PGEN)(GRAMMAR_INPUT) (GRAMMARH)(GRAMMARH)(GRAMMAR_C)


改为:


(GRAMMARH)(GRAMMARH)(GRAMMAR_C): (PGEN)(PGEN)(GRAMMAR_INPUT)


                -(PGENHOST)(PGENHOST)(GRAMMAR_INPUT) (GRAMMARH)(GRAMMARH)(GRAMMAR_C)


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


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


platform: $(BUILDPYTHON)


        (RUNSHARED)./(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']


编译sqlite的地方:


for d in inc_dirs + sqlite_inc_paths:


改为:


for d in ['/usr/local/arm/3.4.4/include']:


因为sqlite3安装在这里,如果这里不改的话,setup.py会在我的电脑上找sqlite


main函数:


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


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


make


make install


3.5 Arm-linux-gcc-2.95.3版本编译

3.5.1 修改和运行configure

arm-linux-gcc version 2.95.3:


cd ..


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


3.5.2    修改Makefile

之后就要对Makefile做一些修改,把


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


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


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



PGEN=           Parser/pgen$(EXE)


一行的下面加上


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


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


表明我们在HOST上运行的pgen


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


(GRAMMARH)(GRAMMARH)(GRAMMAR_C): (PGEN)(PGEN)(GRAMMAR_INPUT)


                -(PGEN)(PGEN)(GRAMMAR_INPUT) (GRAMMARH)(GRAMMARH)(GRAMMAR_C)


改为:


(GRAMMARH)(GRAMMARH)(GRAMMAR_C): (PGEN)(PGEN)(GRAMMAR_INPUT)


                -(PGENHOST)(PGENHOST)(GRAMMAR_INPUT) (GRAMMARH)(GRAMMARH)(GRAMMAR_C)


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


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


如:


platform: $(BUILDPYTHON)


        (RUNSHARED)./(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.5.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']


编译sqlite的地方:


for d in inc_dirs + sqlite_inc_paths:


改为:


for d in ['/usr/local/arm/2.95.3/include']:


因为我的sqlite3安装在这里,如果这里不改的话,setup.py会在我的电脑上找sqlite


main函数:


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


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


#make       


make install


其实到 make 这一步通不过,可能是python2.5.4对gcc的版本要求较高,不支持Arm-linux-gcc-2.95.3,所以前面这些工作大概是白废,如果有哪位牛人编译通过了,麻烦告知小弟,感激不尽。


4 文件系统的移植

4.1 更新文件系统

执行# make install后,python会被复制到_install_gcc3目录下,将_install_gcc3目录下的bin目录和lib目录下的所有文件分别复制到S3C2410A & arm-linux-2.4.18文件系统的/bin目录和/lib目录下:


# cp –a bin/* /bin/


# cp –a lib/* /lib/


这样文件系统即被安装到arm-linux下。


4.1.1 更新S3C2410A & arm-linux-2.4.18的lib文件

对于S3C2410A & arm-linux-2.4.18,lib文件都是arm-linux-gcc-2.95.3对应的库文件,此时运行python会提示找不到glibc2.3:


python: /lib/libc.so.6: version `GLIBC_2.3' not found (required by /usr/lib/lib)


需要拷贝arm-linux-gcc-3.4.4库文件中的以下6个文件到 ARM板文件系统/lib目录下:


libc.so.6, libc-2.3.5.so,


ld-2.3.5.so, ld-linux.so.2,


libpthread.so.0, libpthread-0.10.so


过程记录如下:


[/u@/h /W]/$ cp /usr/lib_g3/libc-2.3.5.so /lib/


[/u@/h /W]/$ python


python: /lib/libc.so.6: version `GLIBC_2.3' not found (required by /usr/lib/lib)


[/u@/h /W]/$ cp -a /usr/lib_g3/libc.so.6 /lib/        


[/u@/h /W]/$ python


python: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by /lib)


[/u@/h /W]/$ cp -a /usr/lib_g3/ld-2.3.5.so /lib/


[/u@/h /W]/$ python


python: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by /lib)


[/u@/h /W]/$ cp -a /usr/lib_g3/ld-linux.so.2 /lib/

推荐阅读

史海拾趣

Empro Technology Corp公司的发展小趣事

随着全球制造业的转型升级,Empro Technology Corp也积极响应,开始了智能制造的探索和实践。公司引进了先进的生产设备和管理系统,实现了生产过程的自动化和智能化。这不仅提高了生产效率,也保证了产品质量和稳定性。

ETA Electric Industry Co Ltd公司的发展小趣事

近年来,ETA Electric Industry Co Ltd积极响应全球环保倡议,致力于实现可持续发展。他们优化了生产流程,减少了废弃物和污染物的排放。同时,公司还加大了对环保型电子元器件的研发力度,推出了一系列节能、环保的新产品。这些举措不仅提升了公司的社会形象,也为其在激烈的市场竞争中增添了新的优势。

上述五个故事,讲述了ETA Electric Industry Co Ltd在电子行业的发展历程。从起步之初的艰难,到技术创新的突破,再到市场拓展和质量管理的成功,最后到对环保和可持续发展的追求,每一步都体现了公司的成长和进步。

Bussmann (Eaton)公司的发展小趣事

随着全球市场的不断扩张,Bussmann也加快了其全球化布局的步伐。目前,Bussmann的产品已在全球170多个国家销售,为各地的客户提供优质的电路保护解决方案。同时,为了满足不同客户的需求,Bussmann不断扩展其产品线,现已涵盖电气电源熔断器、电子电路板及小型熔断器、熔丝盒、熔丝座及断开开关等多个品类。这些产品的推出不仅丰富了Bussmann的产品线,也使其能够更好地满足市场的多元化需求。

以上五个故事展示了Bussmann (Eaton)公司在电子行业发展的不同阶段和关键节点,体现了其技术创新、市场拓展和全球化布局的重要历程。这些故事不仅反映了Bussmann在电路保护领域的领先地位,也展示了其在应对市场变化和客户需求方面的灵活性和实力。

DDK公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。DDK公司深知这一点,因此始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测的每一个环节都严格把控,确保每一件产品都符合高标准、严要求。这种对品质的执着追求,让DDK公司的产品在市场上赢得了良好的声誉,赢得了消费者的信任和忠诚。

Dailywell Electronics Co Ltd公司的发展小趣事

随着业务的不断扩展和市场需求的增加,德利威电子在1998年实现了全系列防水开关的生产,并取得了RS33A开关专利。同年,公司还扩大了经营规模,搬入了自购的厂办大楼,并增加了资本额至一千五百万元。这些举措不仅提升了公司的生产能力和产品品质,也为公司未来的发展奠定了坚实的基础。

Coleman Cable Inc公司的发展小趣事

品质一直是Coleman Cable的生命线。公司建立了严格的质量控制体系,从原材料采购、生产过程到成品检验,每一个环节都严格把关。这种对品质的执着追求,使得Coleman Cable的产品在市场上享有良好的声誉。同时,公司还积极听取客户反馈,不断改进产品和服务,赢得了客户的信赖和忠诚。

问答坊 | AI 解惑

单片机怎样处理LM331送来的信号

本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 当将模拟信号转换成方波脉冲后,再将脉冲信号送入单片机,那么单片机是怎样处理这个脉冲信号的?  …

查看全部问答>

8051fxxx IDE出现下列问题

note:usb address and data registers will not valid until usb clock is running 这是什么造成的呢?…

查看全部问答>

技术在于积累!-------谈谈偶做LED驱动电源的经历

技术在于积累!        第一次刚接触LED驱动是从一块DEMO板: DC输入,输出是低电流大致200MA的; 因为客户的需求,后来公司头一次想用SMD802开发一块非隔离的7*1w 450MA驱动板;那时候没买样板,也没找专门的IC厂商,要求技 ...…

查看全部问答>

关于AT89S52单篇机,

你好,我刚买了上面那个型号,,但是,我烧写时,出现了编程器不存在,什么回事?…

查看全部问答>

用软件如何实现蓝牙接收的数据转换

最近做了一个题目,使用蓝牙接收到的数据在LED点阵上显示出来,但是前提是不知道要接收的数据的内容。该如何实现接收到的数据用编程直接转换成LED点阵上能识别的二进制数。是该做一个字库还是有其他什么别的方法。请专业人士帮忙解决一下。谢谢。…

查看全部问答>

windows ce stream driver wizard

搜遍了整个网络也没有找到windows ce stream driver wizard这个工具,哪位大哥大姐弟弟妹妹能够慷慨解囊,帮小弟一把,不胜感激。小弟的邮箱是:cougarz@somagic.com.cn…

查看全部问答>

哪位达人用过《EVC高级编程及其应用开发》这本书上基础数据库的例子?

我在wince下试了这个程序,可是不好使阿,添加不了,也删除不了,请问是还需要安装什么程序还是本身实例程序有问题啊?…

查看全部问答>

今天用Proteus仿真的ADC0809。。。但实际0809不工作啊。。。。

  单片机的对应ST脚的P口接上0809时就被拉低了。Proteus仿真什么问题都没有。0809要注意什么问题么?有两个问题:1,我希望设定的是500K,用定时器方式2也是设成255。可从P口出来的就是50K 啊。2,ST脚被拉低,但不接0809时单片机P口是正常的 ...…

查看全部问答>

【求助】JTAG下载遇到问题:-(

我在使用msp430F149的JTAG模块下载时,一开始还能下载运行,试了有两三天,突然一天不能下载了,后来就再也不能下了,软件提示不能发现目标。然后又贴了一块板子,结果这块好了半天就又出现和前面一样的现象。很是郁闷 量了下载口各个引脚的电压 ...…

查看全部问答>

I2C连续读写请教

想通过I2C连续写数据和读数据,用for循环来操作,写入的都是第一个数据,后面的就没有写入了,读也是这样。但如果不用for循环写,直接写入两个数据可以实现,但是读得时候也不能实现;在网上搜了下也是用for循环啊,但是我的怎么不能实现呢?请大家 ...…

查看全部问答>