为R6300v2编译python

前不久入了一个R6300v2: IMG_2598 大家可以在wikidevi上看到它的硬件配置: http://wikidevi.com/wiki/Netgear_R6300_v2 CPU是Broadcom BCM47081A0 (800 MHz),我们可以在Broadcom官网上看到他的一些详细信息: http://www.broadcom.com/products/Wireless-LAN/802.11-Wireless-LAN-Solutions/BCM4707-4708-4709 这么好的配置不用来折腾简直就是浪费。一直期待着能刷系统……直到最近,出了个R6300v2的dd-wrt固件: http://www.myopenrouter.com/download/50404/DD-WRT-for-R6300v2/ 不过还是beta版,很多功能还不怎么好,本人刷了之后最蛋疼的就是Mac OS X不能搜到dd-wrt的5G网络,但同设备的Windows却可以,非常郁闷…… 不过这不是我们这次讨论的重点 我们可以在固件下载页面中找到源码,下载后我们查看Build Instructions可以发现使用的工具链是hndtools-arm-linux-2.6.36-uclibc-4.5.3,当然你也可以用你喜欢的工具链,但是可能需要重新编译一下固件了…… 另外这个使用的工具链我没找到在哪里可以下,不过我倒是在github上看到了: https://github.com/RMerl/asuswrt-merlin/tree/master/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3 当然,你也可以用buildroot自己配置一个出来…… 本人一开始用错工具链搞得各种符号有问题,各种奇葩的问题,比如这样: pythonoo-error 就算是这样还是我费劲千辛万苦,去掉ctype的依赖(比如toupper等函数)之后的结果……好不容易能运行python了,但是组件………… 后来换回来之后一切非常顺利 说了这么多,我们还是来看看如何编译python吧,其实我们更需要的是编译一些python的组件,比如pyOpenSSL等 当然,我们的编译环境在Ubuntu下 编译OpenSSL的命令非常简单,关于源码下载什么的我就不说了,没意思。prefix可根据自己的需要修改 [sourcecode language="plain"] CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./Configure no-asm shared --prefix=/usr/local/arm/ssl linux-armv4 [/sourcecode] 配置完成后就是make了 编译libevent和zlib也差不多: [sourcecode language="plain"] CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./configure --prefix=/usr/local/arm/libevent --host=arm-linux make make install [/sourcecode] [sourcecode language="plain"] CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./configure --prefix=/usr/local/arm/zlib make make install [/sourcecode] 之后就是编译python及其的组件了,我主要是参考了这里: http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html 写得非常详细,我编译的版本是2.7.3。不过我没有编译SQLite就是了,主要是因为用不上…… 为了让编译组件的时候能找到对应的头文件和库,我们在patch后还需要自己手工修改一下setup.py,在detect_modules(patch过)中找好为交叉编译设置搜索路径的地方,加上我们编译的库,这里我还加上了ncurses(本来想装个screen),但是最后事实证明,在R6300v2上的dd-wrt上完全用不上…… [sourcecode language="python"] lib_dirs += [ '/usr/local/arm/zlib/lib', '/usr/local/arm/ssl/lib', '/usr/local/arm/ncurses/lib' ] inc_dirs += [ '/usr/local/arm/zlib/include', '/usr/local/arm/ssl/include', '/usr/local/arm/ncurses/include/ncursesw', '/usr/local/arm/ncurses/include' ] [/sourcecode] 然后按照那里写的方法编译就好了,主要原理就是先编译一个host的python,可以在机器上跑,其实我们可以直接用系统带的python2.7 接下来就是编译其他的python组件,弄成egg在dd-wrt上用easy_install装就好了 先准备好setuptools(目录与Python源码目录同一目录下) 下载并解压 https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e 这不是最新版,大家想要的话可以尝试最新版 编译pyOpenSSL(目录与Python源码目录同一目录下): [sourcecode language="plain"] cd pyOpenSSL-0.13/ OPENSSL=/usr/local/arm/ssl PYTHONPATH=../Python-2.7.3/Lib ../Python-2.7.3/hostpython setup.py build_ext -I$OPENSSL/include -L$OPENSSL sed -i -e "s|from distutils.core import Extension, setup|from setuptools import setup\nfrom distutils.core import Extension|g" setup.py PYTHONPATH=../Python-2.7.3/Lib:../setuptools-0.6c11 ../Python-2.7.3/hostpython setup.py bdist_egg mv dist/pyOpenSSL-0.13-py2.7-linux-i686.egg dist/pyOpenSSL-0.13-py2.7.egg [/sourcecode] 编译greenlet: [sourcecode language="plain"] CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib gcc=arm-linux-gcc ar=arm-linux-ar ranlib=arm-linux-ranlib ld=arm-linux-ld PYTHONPATH=/usr/lib/ python setup.py build_ext -I../Python-2.7.3/Include #这里可能需要修改/usr/bin下的ld和gcc,链接到arm-linux的,完成编译后记得改回来 sed -i -e "s|from distutils.core import Extension, setup|from setuptools import setup\nfrom distutils.core import Extension|g" setup.py PYTHONPATH=../setuptools-0.6c11 python2.7 setup.py bdist_egg mv dist/greenlet-0.4.1-py2.7-linux-i686.egg dist/greenlet-0.4.1-py2.7.egg [/sourcecode] 编译gevent: [sourcecode language="plain"] LIBEVENT=/usr/local/arm/libevent PYTHONPATH=../Python-2.7.3/Lib ../Python-2.7.3/hostpython setup.py build_ext -I$LIBEVENT/include -L$LIBEVENT/lib sed -i -e "s|from distutils.core import Extension, setup|from setuptools import setup\nfrom distutils.core import Extension|g" setup.py PYTHONPATH=../Python-2.7.3/Lib:../setuptools-0.6c11 ../Python-2.7.3/hostpython setup.py bdist_egg mv dist/gevent-0.13.8-py2.7-linux-i686.egg dist/gevent-0.13.8-py2.7.egg [/sourcecode] 大致流程与编译pyOpenSSL相同。 最后在R6300v2的dd-wrt上用easy_install安装egg文件即可 [sourcecode language="plain"] wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py easy_install pyOpenSSL-0.13-py2.7.egg easy_install greenlet-0.4.1-py2.7.egg easy_install gevent-0.13.8-py2.7.egg [/sourcecode] 这样我们就安装完我们需要的组件了,这篇文章主要目的是记录一下过程,具体细节并不是非常详细,如果遇到些什么问题可以留言。 最后我又稍稍处理了一下python的lib,把.py文件全部编译成.pyo了,其实意义不是非常大,只不过是想试试而已~ python-in-r6300v2 在用不了screen的情况下,如果想后台运行的话就使用nohup命令吧~