继续玩路由器,交叉编译Python 3.3,压成1.5MB

Xiaoxia 2013-09-13 23:16

昨天在研究如何在嵌入式Linux上搭建Python运行环境,因为有了Python之后,很多工具例如GoAgent之类的东西就可以用上场了。昨天成功编译了Python2.6,参考了网上很多方法,但最后无果而终,现在总结了一套自己的编译方法,基本上可以秒杀所有Python版本的交叉编译,这里做一个总结。我的编译环境是Debian64位 无桌面版本,体积很小巧,安装在办公室电脑虚拟机里,在家里也可以远程编译代码。

首先在Python网站下载最新版源代码,这里我使用Python 3.3版本。解压下,有下面这堆东西。

download

 

接着,编辑Modules/Setup.dist,把需要用到的模块,去掉注释。

因为我打算把_socket,math,time,md5,sha1,select等模块静态编译进去(这样就不用lib-dynload里的一堆so文件都可以使用那些功能了)。

shared

 

为了支持中文的decode和encode,下面两个模块也要编译进去。

cncodecs

 

如果你把zlib去掉了注释,要先交叉编译zlib,把编译出来的两个头文件和一个libz.a放到/usr/local/或者其他编译器能够发现的地方。

下面在configure之前,需要做一些小动作,不然会提示出错。

root@dev:~/Python-3.3.2# echo ac_cv_file__dev_ptmx=no > config.site
root@dev:~/Python-3.3.2# echo ac_cv_file__dev_ptc=no >> config.site
root@dev:~/Python-3.3.2# export CONFIG_SITE=config.site
root@dev:~/Python-3.3.2# ./configure CC=mipsel-linux-gcc CXX=mipsel-linux-g++ AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib –host=mipsel-linux –build=mipsel –disable-ipv6

我的交叉编译工具是mipsel-linux-*。如无意外,运行完毕应该得到Makefile文件。

编辑Makefile,在CONFIGURE_LDFLAGS后面添加 -s -static 两个选项。

下一步,开始编译。

root@dev:~/Python-3.3.2# make python

如无意外,当前目录下就可以得到python。因为我前面忘了加-s参数,所以编译出来体积有点大。可以使用strip工具去掉调试信息和一些不必要的内容,不影响运行。

makepython

 

strip之后,文件大小从8MB变为3MB。不过还是蛮大的,试试使用UPX压缩一下。工具下载:http://upx.sourceforge.net/

 

UPX之后,文件大小为 1 MB。对程序运行效率会有影响,不过只在启动的时候有影响,不会影响正常解释脚本的速度

[返回] [原文链接]